From dc4db7693270912a921795be7cffab2b02d7cdf3 Mon Sep 17 00:00:00 2001 From: Nitin Mehta Date: Mon, 16 Jan 2012 13:08:35 +0530 Subject: [PATCH 01/30] bug 13066 Storage over prov factor should be float rather than long which leads to wrong storage calculation Reviewed by : Kishan. --- server/src/com/cloud/storage/StorageManagerImpl.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index 8ef1ca52ba7..ab39f13be15 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -1867,17 +1867,17 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag capacities = _capacityDao.search(capacitySC, null); - long provFactor = 1; + float provFactor = 1; if (storagePool.getPoolType() == StoragePoolType.NetworkFilesystem) { - provFactor = (long) _overProvisioningFactor; + provFactor = _overProvisioningFactor; } if (capacities.size() == 0) { - CapacityVO capacity = new CapacityVO(storagePool.getId(), storagePool.getDataCenterId(), storagePool.getPodId(), storagePool.getClusterId(), allocated, storagePool.getCapacityBytes() - * provFactor, CapacityVO.CAPACITY_TYPE_STORAGE_ALLOCATED); + CapacityVO capacity = new CapacityVO(storagePool.getId(), storagePool.getDataCenterId(), storagePool.getPodId(), storagePool.getClusterId(), allocated, (long)(storagePool.getCapacityBytes() + * provFactor), CapacityVO.CAPACITY_TYPE_STORAGE_ALLOCATED); _capacityDao.persist(capacity); } else { CapacityVO capacity = capacities.get(0); - long currCapacity = provFactor * storagePool.getCapacityBytes(); + long currCapacity = (long)(provFactor * storagePool.getCapacityBytes()); boolean update = false; if (capacity.getTotalCapacity() != currCapacity) { capacity.setTotalCapacity(currCapacity); From f1663bafa7f595acce4b177a193dc1760c575c81 Mon Sep 17 00:00:00 2001 From: Sam Robertson Date: Mon, 16 Jan 2012 00:45:53 -0800 Subject: [PATCH 02/30] Bug 13082 - Refreshing srx connection on every synchronized command --- core/src/com/cloud/network/resource/JuniperSrxResource.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/src/com/cloud/network/resource/JuniperSrxResource.java b/core/src/com/cloud/network/resource/JuniperSrxResource.java index 5624789751d..956d221fb30 100644 --- a/core/src/com/cloud/network/resource/JuniperSrxResource.java +++ b/core/src/com/cloud/network/resource/JuniperSrxResource.java @@ -580,6 +580,7 @@ public class JuniperSrxResource implements ServerResource { */ private synchronized Answer execute(IpAssocCommand cmd) { + refreshSrxConnection(); return execute(cmd, _numRetries); } @@ -707,6 +708,7 @@ public class JuniperSrxResource implements ServerResource { */ private synchronized Answer execute(SetStaticNatRulesCommand cmd) { + refreshSrxConnection(); return execute(cmd, _numRetries); } @@ -800,6 +802,7 @@ public class JuniperSrxResource implements ServerResource { */ private synchronized Answer execute(RemoteAccessVpnCfgCommand cmd) { + refreshSrxConnection(); return execute(cmd, _numRetries); } @@ -912,6 +915,7 @@ public class JuniperSrxResource implements ServerResource { } private synchronized Answer execute(VpnUsersCfgCommand cmd) { + refreshSrxConnection(); return execute(cmd, _numRetries); } @@ -971,6 +975,7 @@ public class JuniperSrxResource implements ServerResource { */ private synchronized Answer execute (SetPortForwardingRulesCommand cmd) { + refreshSrxConnection(); return execute(cmd, _numRetries); } From b3579b0a55fc432f1e25ea9bf26132a65cae4570 Mon Sep 17 00:00:00 2001 From: Nitin Mehta Date: Mon, 16 Jan 2012 14:47:13 +0530 Subject: [PATCH 03/30] bug 13096 Make capacity deletion for pod deletion more robust. Reviewed by : Kishan. --- .../cloud/configuration/ConfigurationManagerImpl.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index cb8cdbfdcfe..bb430fe27b3 100755 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -682,10 +682,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura if (!privateIps.isEmpty()) { if (!(_privateIpAddressDao.deleteIpAddressByPod(podId))) { throw new CloudRuntimeException("Failed to cleanup private ip addresses for pod " + podId); - } - - // Delete corresponding capacity record - _capacityDao.removeBy(Capacity.CAPACITY_TYPE_PRIVATE_IP, null, podId, null); + } } // Delete link local ip addresses for the pod @@ -703,7 +700,10 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura _vlanDao.remove(vlan.getId()); } } - + + // Delete corresponding capacity records + _capacityDao.removeBy(null, null, podId, null); + // Delete the pod if (!(_podDao.remove(podId))) { throw new CloudRuntimeException("Failed to delete pod " + podId); From aa2433cc14922e8c69c9ea579ca222457009bff4 Mon Sep 17 00:00:00 2001 From: Nitin Mehta Date: Mon, 16 Jan 2012 15:18:15 +0530 Subject: [PATCH 04/30] bug 13096 Make capacity deletion for CLUSTER deletion more robust. Reviewed by : Kishan. --- server/src/com/cloud/resource/ResourceManagerImpl.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/server/src/com/cloud/resource/ResourceManagerImpl.java b/server/src/com/cloud/resource/ResourceManagerImpl.java index fe69b376b4a..d95f13cfd5d 100755 --- a/server/src/com/cloud/resource/ResourceManagerImpl.java +++ b/server/src/com/cloud/resource/ResourceManagerImpl.java @@ -43,6 +43,7 @@ import com.cloud.api.commands.PrepareForMaintenanceCmd; import com.cloud.api.commands.ReconnectHostCmd; import com.cloud.api.commands.UpdateHostCmd; import com.cloud.api.commands.UpdateHostPasswordCmd; +import com.cloud.capacity.dao.CapacityDao; import com.cloud.cluster.ManagementServerNode; import com.cloud.dc.ClusterDetailsDao; import com.cloud.dc.ClusterVO; @@ -119,13 +120,15 @@ public class ResourceManagerImpl implements ResourceManager, ResourceService, Ma protected GuestOSCategoryDao _guestOSCategoryDao; @Inject protected StoragePoolDao _storagePoolDao; + @Inject + CapacityDao _capacityDao; @Inject(adapter = Discoverer.class) protected Adapters _discoverers; protected long _nodeId = ManagementServerNode.getManagementServerId(); - protected HashMap> _lifeCycleListeners = new HashMap>(); + protected HashMap> _lifeCycleListeners = new HashMap>(); private void insertListener(Integer event, ResourceListener listener) { List lst = _lifeCycleListeners.get(event); @@ -667,7 +670,9 @@ public class ResourceManagerImpl implements ResourceManager, ResourceService, Ma return false; } - _clusterDao.remove(cmd.getId()); + if (_clusterDao.remove(cmd.getId())){ + _capacityDao.removeBy(null, null, null, cmd.getId()); + } txn.commit(); return true; From 312df2ffac68befbe6d348b94a579ccb8f0e2ff8 Mon Sep 17 00:00:00 2001 From: Edison Su Date: Mon, 16 Jan 2012 10:37:44 -0800 Subject: [PATCH 05/30] do not need to hold a vm lock when taking snapshot --- .../cloud/storage/snapshot/SnapshotManagerImpl.java | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java index d24d5df9e20..8773ae8ba1d 100755 --- a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java +++ b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java @@ -349,16 +349,7 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma // does the caller have the authority to act on this volume _accountMgr.checkAccess(UserContext.current().getCaller(), null, v); try { - if (v != null && _volsDao.getHypervisorType(v.getId()).equals(HypervisorType.KVM)) { - /* KVM needs to lock on the vm of volume, because it takes snapshot on behalf of vm, not volume */ - UserVmVO uservm = _vmDao.findById(v.getInstanceId()); - if (uservm != null) { - UserVmVO vm = _vmDao.acquireInLockTable(uservm.getId(), 10); - if (vm == null) { - throw new CloudRuntimeException("Creating snapshot failed due to volume:" + volumeId + " is being used, try it later "); - } - } - } + Long poolId = v.getPoolId(); if (poolId == null) { throw new CloudRuntimeException("You cannot take a snapshot of a volume until it has been attached to an instance"); @@ -387,7 +378,7 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma + userVm.getState().toString() + " state"); } - if(userVm.getHypervisorType() == HypervisorType.VMware) { + if(userVm.getHypervisorType() == HypervisorType.VMware || userVm.getHypervisorType() == HypervisorType.KVM) { List activeSnapshots = _snapshotDao.listByInstanceId(v.getInstanceId(), Snapshot.Status.Creating, Snapshot.Status.CreatedOnPrimary, Snapshot.Status.BackingUp); if(activeSnapshots.size() > 1) throw new CloudRuntimeException("There is other active snapshot tasks on the instance to which the volume is attached, please try again later"); From 80f971ef33bbdf811e8376cfa03ce49a14d9074e Mon Sep 17 00:00:00 2001 From: anthony Date: Mon, 16 Jan 2012 14:52:45 -0800 Subject: [PATCH 06/30] only create new sshkey if user is cloud --- .../cloud/server/ConfigurationServerImpl.java | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/server/src/com/cloud/server/ConfigurationServerImpl.java b/server/src/com/cloud/server/ConfigurationServerImpl.java index 3ea22a99ba2..5b303a2a175 100644 --- a/server/src/com/cloud/server/ConfigurationServerImpl.java +++ b/server/src/com/cloud/server/ConfigurationServerImpl.java @@ -533,12 +533,15 @@ public class ConfigurationServerImpl implements ConfigurationServer { protected void updateKeyPairs() { // Grab the SSH key pair and insert it into the database, if it is not present - if (s_logger.isInfoEnabled()) { - s_logger.info("Processing updateKeyPairs"); + String userid = System.getProperty("user.name"); + if (!userid.startsWith("cloud")){ + return; } String already = _configDao.getValue("ssh.privatekey"); String homeDir = Script.runSimpleBashScript("echo ~"); - String userid = System.getProperty("user.name"); + if (s_logger.isInfoEnabled()) { + s_logger.info("Processing updateKeyPairs"); + } if (homeDir != null && homeDir.equalsIgnoreCase("~")) { s_logger.error("No home directory was detected. Set the HOME environment variable to point to your user profile or home directory."); throw new CloudRuntimeException("No home directory was detected. Set the HOME environment variable to point to your user profile or home directory."); @@ -610,14 +613,8 @@ public class ConfigurationServerImpl implements ConfigurationServer { s_logger.info("Keypairs already in database, skip updating local copy (not running as cloud user)"); } } - - - if (userid.startsWith("cloud")){ - s_logger.info("Going to update systemvm iso with generated keypairs if needed"); - injectSshKeysIntoSystemVmIsoPatch(pubkeyfile.getAbsolutePath(), privkeyfile.getAbsolutePath()); - } else { - s_logger.info("Skip updating keypairs on systemvm iso (not running as cloud user)"); - } + s_logger.info("Going to update systemvm iso with generated keypairs if needed"); + injectSshKeysIntoSystemVmIsoPatch(pubkeyfile.getAbsolutePath(), privkeyfile.getAbsolutePath()); } private void writeKeyToDisk(String key, String keyPath) { From 44d796fd91dcf2837f1c593f6fdb0f7f15f0c729 Mon Sep 17 00:00:00 2001 From: abhi Date: Tue, 17 Jan 2012 11:40:45 +0530 Subject: [PATCH 07/30] bug 12875: syncronize vm state changes with cluster level locks --- .../xen/resource/CitrixResourceBase.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index 5491d152882..433ae3ed6fe 100755 --- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -1075,7 +1075,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe } } - synchronized (s_vms) { + synchronized (_cluster.intern()) { s_logger.debug("1. The VM " + vmName + " is in Starting state."); s_vms.put(_cluster, _name, vmName, State.Starting); } @@ -1158,7 +1158,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe String msg = handleVmStartFailure(conn, vmName, vm, "", e); return new StartAnswer(cmd, msg); } finally { - synchronized (s_vms) { + synchronized (_cluster.intern()) { if (state != State.Stopped) { s_logger.debug("2. The VM " + vmName + " is in " + state + " state."); s_vms.put(_cluster, _name, vmName, state); @@ -2138,7 +2138,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe final State state = getVmState(conn, vmName); Integer vncPort = null; if (state == State.Running) { - synchronized (s_vms) { + synchronized (_cluster.intern()) { s_logger.debug("3. The VM " + vmName + " is in " + State.Running + " state"); s_vms.put(_cluster, _name, vmName, State.Running); } @@ -2162,7 +2162,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe for (NicTO nic : nics) { getNetwork(conn, nic); } - synchronized (s_vms) { + synchronized (_cluster.intern()) { s_logger.debug("4. The VM " + vm.getName() + " is in " + State.Migrating + " state"); s_vms.put(_cluster, _name, vm.getName(), State.Migrating); } @@ -2442,7 +2442,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe state = s_vms.getState(_cluster, vmName); - synchronized (s_vms) { + synchronized (_cluster.intern()) { s_logger.debug("5. The VM " + vmName + " is in " + State.Stopping + " state"); s_vms.put(_cluster, _name, vmName, State.Stopping); } @@ -2508,7 +2508,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe s_logger.warn(msg, e); return new MigrateAnswer(cmd, false, msg, null); } finally { - synchronized (s_vms) { + synchronized (_cluster.intern()) { s_logger.debug("6. The VM " + vmName + " is in " + State.Stopping + " state"); s_vms.put(_cluster, _name, vmName, state); } @@ -2633,7 +2633,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe @Override public RebootAnswer execute(RebootCommand cmd) { Connection conn = getConnection(); - synchronized (s_vms) { + synchronized (_cluster.intern()) { s_logger.debug("7. The VM " + cmd.getVmName() + " is in " + State.Starting + " state"); s_vms.put(_cluster, _name, cmd.getVmName(), State.Starting); } @@ -2659,7 +2659,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe } return new RebootAnswer(cmd, "reboot succeeded", null, null); } finally { - synchronized (s_vms) { + synchronized (_cluster.intern()) { s_logger.debug("8. The VM " + cmd.getVmName() + " is in " + State.Running + " state"); s_vms.put(_cluster, _name, cmd.getVmName(), State.Running); } @@ -3128,7 +3128,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe } if (vms.size() == 0) { - synchronized (s_vms) { + synchronized (_cluster.intern()) { s_logger.info("VM does not exist on XenServer" + _host.uuid); s_vms.remove(_cluster, _name, vmName); } @@ -3153,7 +3153,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe State state = s_vms.getState(_cluster, vmName); - synchronized (s_vms) { + synchronized (_cluster.intern()) { s_logger.debug("9. The VM " + vmName + " is in " + State.Stopping + " state"); s_vms.put(_cluster, _name, vmName, State.Stopping); } @@ -3217,7 +3217,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe String msg = "VM destroy failed in Stop " + vmName + " Command due to " + e.getMessage(); s_logger.warn(msg, e); } finally { - synchronized (s_vms) { + synchronized (_cluster.intern()) { s_logger.debug("10. The VM " + vmName + " is in " + state + " state"); s_vms.put(_cluster, _name, vmName, state); } @@ -6673,7 +6673,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe protected HashMap> deltaClusterSync(Connection conn) { final HashMap> changes = new HashMap>(); - synchronized (s_vms) { + synchronized (_cluster.intern()) { HashMap> newStates = getAllVms(conn); if (newStates == null) { s_logger.warn("Unable to get the vm states so no state sync at this point."); From 68ace71ca8eca35ad7890103ba04eda38b87eb33 Mon Sep 17 00:00:00 2001 From: kishan Date: Tue, 17 Jan 2012 12:03:30 +0530 Subject: [PATCH 08/30] Bug 13075: To get last alert, use offset 0 instead of 1 Status 13075: resolved fixed Reviewed-By: Nitin --- server/src/com/cloud/alert/dao/AlertDaoImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/com/cloud/alert/dao/AlertDaoImpl.java b/server/src/com/cloud/alert/dao/AlertDaoImpl.java index bee71b47a73..269e273c819 100644 --- a/server/src/com/cloud/alert/dao/AlertDaoImpl.java +++ b/server/src/com/cloud/alert/dao/AlertDaoImpl.java @@ -31,7 +31,7 @@ import com.cloud.utils.db.SearchCriteria; public class AlertDaoImpl extends GenericDaoBase implements AlertDao { @Override public AlertVO getLastAlert(short type, long dataCenterId, Long podId) { - Filter searchFilter = new Filter(AlertVO.class, "createdDate", Boolean.FALSE, Long.valueOf(1), Long.valueOf(1)); + Filter searchFilter = new Filter(AlertVO.class, "createdDate", Boolean.FALSE, Long.valueOf(0), Long.valueOf(1)); SearchCriteria sc = createSearchCriteria(); sc.addAnd("type", SearchCriteria.Op.EQ, Short.valueOf(type)); From 6aaac81ca219fa8188c0c9025a132eb60f195a56 Mon Sep 17 00:00:00 2001 From: kishan Date: Tue, 17 Jan 2012 15:08:34 +0530 Subject: [PATCH 09/30] Bug 12639: while logging events, hide value for configs containing password string in config name Status 12639: resolved fixed Reviewed-By: Nitin --- .../src/com/cloud/configuration/ConfigurationManagerImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index bb430fe27b3..0f8ec158120 100755 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -397,7 +397,8 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura Long userId = UserContext.current().getCallerUserId(); String name = cmd.getCfgName(); String value = cmd.getValue(); - UserContext.current().setEventDetails(" Name: "+name +" New Value: "+((value == null) ? "" : value)); + UserContext.current().setEventDetails(" Name: "+name +" New Value: "+ (((name.toLowerCase()).contains("password")) ? "*****" : + (((value == null) ? "" : value)))); // check if config value exists if (_configDao.findByName(name) == null) { throw new InvalidParameterValueException("Config parameter with name " + name + " doesn't exist"); From 6d40c078f94184f92ac4a3018d8512e64b0a3808 Mon Sep 17 00:00:00 2001 From: Kelven Yang Date: Tue, 17 Jan 2012 16:01:09 -0800 Subject: [PATCH 10/30] bug 11428: remove the constraint based on customer's feedback, we will allow creating volume from a snapshot that was originally taken from root volume. Customers should be aware that when the volume is attached as a data volume, some partitions that were originally created as a root volume may not be recognized by the guest OS --- server/src/com/cloud/storage/StorageManagerImpl.java | 2 ++ server/src/com/cloud/vm/UserVmManagerImpl.java | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index ab39f13be15..a0dac2e7d7b 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -1718,11 +1718,13 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag } } +/* // bug #11428. Operation not supported if vmware and snapshots parent volume = ROOT if(snapshotCheck.getHypervisorType() == HypervisorType.VMware && _volumeDao.findByIdIncludingRemoved(snapshotCheck.getVolumeId()).getVolumeType() == Type.ROOT){ throw new UnsupportedServiceException("operation not supported, snapshot with id " + snapshotId + " is created from ROOT volume"); } +*/ } // Verify that zone exists diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index fa98d1dccb1..593ed7c3c0d 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -1405,12 +1405,13 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager if (snapshot.getStatus() != Snapshot.Status.BackedUp) { throw new InvalidParameterValueException("Snapshot id=" + snapshotId + " is not in " + Snapshot.Status.BackedUp + " state yet and can't be used for template creation"); } - + +/* // bug #11428. Operation not supported if vmware and snapshots parent volume = ROOT if(snapshot.getHypervisorType() == HypervisorType.VMware && snapshotVolume.getVolumeType() == Type.DATADISK){ throw new UnsupportedServiceException("operation not supported, snapshot with id " + snapshotId + " is created from Data Disk"); } - +*/ domainId = snapshot.getDomainId(); accountId = snapshot.getAccountId(); hyperType = snapshot.getHypervisorType(); From eadccb37c44618f95039e0e01885b392a32b1b85 Mon Sep 17 00:00:00 2001 From: Chiradeep Vittal Date: Tue, 17 Jan 2012 18:33:05 -0800 Subject: [PATCH 11/30] bug 13060: check for resident vms as xapi will return vms running on other hosts in the cluster --- scripts/vm/hypervisor/xenserver/vmops | 42 +++++++++++++++++---------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/scripts/vm/hypervisor/xenserver/vmops b/scripts/vm/hypervisor/xenserver/vmops index 860a3396fe5..4e650b7709f 100755 --- a/scripts/vm/hypervisor/xenserver/vmops +++ b/scripts/vm/hypervisor/xenserver/vmops @@ -1032,34 +1032,44 @@ def cleanup_rules(session, args): instance = args.get('instance') if not instance: instance = 'VM' - + resident_vms = [] try: + hostname = util.pread2(['/bin/bash', '-c', 'hostname']).split('\n') + if len(hostname) < 1: + raise Exception('Could not find hostname of this host') + thishost = session.xenapi.host.get_by_name_label(hostname[0]) + if len(thishost) < 1: + raise Exception("Could not find host record from hostname %s of this host"%hostname[0]) + hostrec = session.xenapi.host.get_record(thishost[0]) + vms = hostrec.get('resident_VMs') + resident_vms = [session.xenapi.VM.get_name_label(x) for x in vms] + util.SMlog('cleanup_rules: found %s resident vms on this host %s' % (len(resident_vms)-1, hostname[0])) + chainscmd = "iptables-save | grep '^:' | awk '{print $1}' | cut -d':' -f2 | sed 's/-def/-%s/'|sort|uniq" % instance chains = util.pread2(['/bin/bash', '-c', chainscmd]).split('\n') + vmchains = [ch for ch in chains if 1 in [ ch.startswith(c) for c in ['r-', 'i-', 's-', 'v-', 'l-']]] + util.SMlog('cleanup_rules: found %s iptables chains for vms on this host %s' % (len(vmchains), hostname[0])) cleaned = 0 cleanup = [] - for chain in chains: - if 1 in [ chain.startswith(c) for c in ['r-', 'i-', 's-', 'v-', 'l-'] ]: - vm = session.xenapi.VM.get_by_name_label(chain) + for chain in vmchains: + vm = session.xenapi.VM.get_by_name_label(chain) + if len(vm) != 1: + vm = session.xenapi.VM.get_by_name_label(chain + "-untagged") if len(vm) != 1: - vm = session.xenapi.VM.get_by_name_label(chain + "-untagged") - if len(vm) != 1: - util.SMlog("chain " + chain + " does not correspond to a vm, cleaning up") - cleanup.append(chain) - continue - vm_rec = session.xenapi.VM.get_record(vm[0]) - state = vm_rec.get('power_state') - if state != 'Running' and state != 'Paused': - util.SMlog("vm " + vm_name + " is not running, cleaning up") - cleanup.append(vm_name) + util.SMlog("chain " + chain + " does not correspond to a vm, cleaning up") + cleanup.append(chain) + continue + if chain not in resident_vms: + util.SMlog("vm " + chain + " is not running, cleaning up") + cleanup.append(chain) for vm_name in cleanup: destroy_network_rules_for_vm(session, {'vmName':vm_name}) util.SMlog("Cleaned up rules for " + str(len(cleanup)) + " chains") return str(len(cleanup)) - except: - util.SMlog("Failed to cleanup rules !") + except Exception, ex: + util.SMlog("Failed to cleanup rules, reason= " + str(ex)) return '-1'; @echo From 0073a5bfeb84d8c4f02092e7e93c5b5b97d4b42f Mon Sep 17 00:00:00 2001 From: kishan Date: Wed, 18 Jan 2012 11:30:34 +0530 Subject: [PATCH 12/30] Bug 12477: Adding missing wait configs to upgrade script Status 12477: resolved fixed Reviewed-By: Nitin --- setup/db/db/schema-2213to2214.sql | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/setup/db/db/schema-2213to2214.sql b/setup/db/db/schema-2213to2214.sql index 721d2f2ac84..8c3c1f0124f 100644 --- a/setup/db/db/schema-2213to2214.sql +++ b/setup/db/db/schema-2213to2214.sql @@ -20,3 +20,9 @@ CREATE TABLE `cloud`.`mshost_peer` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT IGNORE INTO configuration (category, instance, component, name, value, description) VALUES ('Advanced', 'DEFAULT', 'management-server', 'vmware.systemvm.nic.device.type', 'E1000', 'Specify the default network device type for system VMs, valid values are E1000, PCNet32, Vmxnet2, Vmxnet3'); +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Storage', 'DEFAULT', 'StorageManager', 'backup.snapshot.wait', '10800', 'In second, timeout for BackupSnapshotCommand'); +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Storage', 'DEFAULT', 'StorageManager', 'copy.volume.wait', '10800', 'In second, timeout for copy volume command'); +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Storage', 'DEFAULT', 'UserVmManager', 'create.private.template.from.snapshot.wait', '10800', 'In second, timeout for CreatePrivateTemplateFromSnapshotCommand'); +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Storage', 'DEFAULT', 'UserVmManager', 'create.private.template.from.volume.wait', '10800', 'In second, timeout for CreatePrivateTemplateFromVolumeCommand'); +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Storage', 'DEFAULT', 'StorageManager', 'create.volume.from.snapshot.wait', '10800', 'In second, timeout for create template from snapshot'); +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Storage', 'DEFAULT', 'TemplateManager', 'primary.storage.download.wait', '10800', 'In second, timeout for download template to primary storage'); From 04adac0a06fbb3c79696dccb4fdc3e4d744b0d51 Mon Sep 17 00:00:00 2001 From: abhi Date: Wed, 18 Jan 2012 12:06:56 +0530 Subject: [PATCH 13/30] bug 12875: a starting VM can be discovered as running if a disconnected host connects back --- server/src/com/cloud/vm/VirtualMachineManagerImpl.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java index 7762822af62..9a20c576a71 100755 --- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -1832,7 +1832,14 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Listene if(serverState == State.Starting) { if(vm.getHostId() != null && vm.getHostId() != hostId) { s_logger.info("CloudStack is starting VM on host " + vm.getHostId() + ", but status report comes from a different host " + hostId + ", skip status sync for vm: " + vm.getInstanceName()); - return null; + if (vm.getHypervisorType() == HypervisorType.XenServer){ // for xenserver (bug 12875) a starting VM can be discovered as running if a disconnected host connects back + try { + stateTransitTo(vm, VirtualMachine.Event.AgentReportMigrated, hostId); + } catch (NoTransitionException e) { + s_logger.warn(e.getMessage()); + } + } + return null; } } From 895a273061fb0be6de1a3b029f9ba38878e92fb6 Mon Sep 17 00:00:00 2001 From: kishan Date: Wed, 18 Jan 2012 14:04:40 +0530 Subject: [PATCH 14/30] Bug 12292: updated netapp_volume primary key for upgrades Status 12292: resolved fixed Reviewed-By: Nitin --- .../src/com/cloud/upgrade/dao/Upgrade2213to2214.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/server/src/com/cloud/upgrade/dao/Upgrade2213to2214.java b/server/src/com/cloud/upgrade/dao/Upgrade2213to2214.java index 42318961f1f..a91b6c26beb 100644 --- a/server/src/com/cloud/upgrade/dao/Upgrade2213to2214.java +++ b/server/src/com/cloud/upgrade/dao/Upgrade2213to2214.java @@ -80,5 +80,15 @@ public class Upgrade2213to2214 implements DbUpgrade { } catch (SQLException e) { throw new CloudRuntimeException("Unable to execute usage_event table update", e); } + + //Drop netapp_volume primary key and add it again + DbUpgradeUtils.dropPrimaryKeyIfExists(conn, "cloud.netapp_volume"); + try { + PreparedStatement pstmt = conn.prepareStatement("ALTER TABLE `cloud`.`netapp_volume` add PRIMARY KEY (`id`)"); + pstmt.executeUpdate(); + pstmt.close(); + } catch (SQLException e) { + throw new CloudRuntimeException("Unable to update primary key for netapp_volume", e); + } } } From 787845b9e9a46f5f8da2fb75800b83247e5663f2 Mon Sep 17 00:00:00 2001 From: Kelven Yang Date: Wed, 18 Jan 2012 15:49:11 -0800 Subject: [PATCH 15/30] bug 12976: The new keyboard framework sends only raw keyboard events, it turned out that it does not work with Xen/KVM hypervisors(only VMware supports standard raw keyboard events), Xen/KVM accept only cooked keyboard events, to maintain cross hypervisor compability, US english keyboard will be handled in the new JsCookedKeyboardMapper class --- console-proxy/js/ajaxviewer.js | 101 ++++++++++++++++++++++++++++++++- 1 file changed, 100 insertions(+), 1 deletion(-) diff --git a/console-proxy/js/ajaxviewer.js b/console-proxy/js/ajaxviewer.js index f6db321c0b8..14c80fde5c1 100644 --- a/console-proxy/js/ajaxviewer.js +++ b/console-proxy/js/ajaxviewer.js @@ -232,6 +232,103 @@ JsX11KeyboardMapper.prototype.inputFeed = function(eventType, code, modifiers) { } } +///////////////////////////////////////////////////////////////////////////// +//JsCookedKeyboardMapper +// For Xen/KVM hypervisors, it accepts "cooked" keyborad events +// +function JsCookedKeyboardMapper() { + KeyboardMapper.apply(this, arguments); + + this.jsX11KeysymMap = []; + this.jsX11KeysymMap[AjaxViewer.JS_KEY_CAPSLOCK] = AjaxViewer.X11_KEY_CAPSLOCK; + this.jsX11KeysymMap[AjaxViewer.JS_KEY_BACKSPACE] = AjaxViewer.X11_KEY_BACKSPACE; + this.jsX11KeysymMap[AjaxViewer.JS_KEY_TAB] = AjaxViewer.X11_KEY_TAB; + this.jsX11KeysymMap[AjaxViewer.JS_KEY_ENTER] = AjaxViewer.X11_KEY_ENTER; + this.jsX11KeysymMap[AjaxViewer.JS_KEY_ESCAPE] = AjaxViewer.X11_KEY_ESCAPE; + this.jsX11KeysymMap[AjaxViewer.JS_KEY_INSERT] = AjaxViewer.X11_KEY_INSERT; + this.jsX11KeysymMap[AjaxViewer.JS_KEY_DELETE] = AjaxViewer.X11_KEY_DELETE; + this.jsX11KeysymMap[AjaxViewer.JS_KEY_HOME] = AjaxViewer.X11_KEY_HOME; + this.jsX11KeysymMap[AjaxViewer.JS_KEY_END] = AjaxViewer.X11_KEY_END; + this.jsX11KeysymMap[AjaxViewer.JS_KEY_PAGEUP] = AjaxViewer.X11_KEY_PAGEUP; + this.jsX11KeysymMap[AjaxViewer.JS_KEY_PAGEDOWN] = AjaxViewer.X11_KEY_PAGEDOWN; + this.jsX11KeysymMap[AjaxViewer.JS_KEY_LEFT] = AjaxViewer.X11_KEY_LEFT; + this.jsX11KeysymMap[AjaxViewer.JS_KEY_UP] = AjaxViewer.X11_KEY_UP; + this.jsX11KeysymMap[AjaxViewer.JS_KEY_RIGHT] = AjaxViewer.X11_KEY_RIGHT; + this.jsX11KeysymMap[AjaxViewer.JS_KEY_DOWN] = AjaxViewer.X11_KEY_DOWN; + this.jsX11KeysymMap[AjaxViewer.JS_KEY_F1] = AjaxViewer.X11_KEY_F1; + this.jsX11KeysymMap[AjaxViewer.JS_KEY_F2] = AjaxViewer.X11_KEY_F2; + this.jsX11KeysymMap[AjaxViewer.JS_KEY_F3] = AjaxViewer.X11_KEY_F3; + this.jsX11KeysymMap[AjaxViewer.JS_KEY_F4] = AjaxViewer.X11_KEY_F4; + this.jsX11KeysymMap[AjaxViewer.JS_KEY_F5] = AjaxViewer.X11_KEY_F5; + this.jsX11KeysymMap[AjaxViewer.JS_KEY_F6] = AjaxViewer.X11_KEY_F6; + this.jsX11KeysymMap[AjaxViewer.JS_KEY_F7] = AjaxViewer.X11_KEY_F7; + this.jsX11KeysymMap[AjaxViewer.JS_KEY_F8] = AjaxViewer.X11_KEY_F8; + this.jsX11KeysymMap[AjaxViewer.JS_KEY_F9] = AjaxViewer.X11_KEY_F9; + this.jsX11KeysymMap[AjaxViewer.JS_KEY_F10] = AjaxViewer.X11_KEY_F10; + this.jsX11KeysymMap[AjaxViewer.JS_KEY_F11] = AjaxViewer.X11_KEY_F11; + this.jsX11KeysymMap[AjaxViewer.JS_KEY_F12] = AjaxViewer.X11_KEY_F12; + this.jsX11KeysymMap[AjaxViewer.JS_KEY_SHIFT] = AjaxViewer.X11_KEY_SHIFT; + this.jsX11KeysymMap[AjaxViewer.JS_KEY_CTRL] = AjaxViewer.X11_KEY_CTRL; + this.jsX11KeysymMap[AjaxViewer.JS_KEY_ALT] = AjaxViewer.X11_KEY_ALT; +} + +JsCookedKeyboardMapper.prototype = new KeyboardMapper(); +JsCookedKeyboardMapper.prototype.inputFeed = function(eventType, code, modifiers) { + if(eventType == AjaxViewer.KEY_DOWN || eventType == AjaxViewer.KEY_UP) { + + // special handling for Alt + Ctrl + Ins, convert it into Alt-Ctrl-Del + if(code == AjaxViewer.JS_KEY_INSERT) { + if((modifiers & AjaxViewer.ALT_KEY_MASK) != 0 && (modifiers & AjaxViewer.CTRL_KEY_MASK) != 0) { + this.mappedInput.push({type : eventType, code: 0xffff, modifiers: modifiers}); + return; + } + } + + var X11Keysym = code; + if(this.jsX11KeysymMap[code] != undefined) { + X11Keysym = this.jsX11KeysymMap[code]; + if(typeof this.jsX11KeysymMap[code] == "boolean") { + return; + } else if($.isArray(X11Keysym)) { + for(var i = 0; i < X11Keysym.length; i++) { + if(X11Keysym[i].type == eventType) { + this.mappedInput.push(X11Keysym[i]); + } + } + } else { + this.mappedInput.push({type : eventType, code: X11Keysym, modifiers: modifiers}); + } + } + + // special handling for ALT/CTRL key + if(eventType == AjaxViewer.KEY_UP && (code == AjaxViewer.JS_KEY_ALT || code == code == AjaxViewer.JS_KEY_CTRL)) + this.mappedInput.push({type : eventType, code: this.jsX11KeysymMap[code], modifiers: modifiers}); + + } else if(eventType == AjaxViewer.KEY_PRESS) { + var X11Keysym = code; + + // special handling for * and + key on number pad + if(code == AjaxViewer.JS_NUMPAD_MULTIPLY) { + this.mappedInput.push({type : AjaxViewer.KEY_DOWN, code: AjaxViewer.X11_KEY_SHIFT, modifiers: modifiers}); + this.mappedInput.push({type : AjaxViewer.KEY_DOWN, code: 42, modifiers: modifiers}); + this.mappedInput.push({type : AjaxViewer.KEY_UP, code: 42, modifiers: modifiers}); + this.mappedInput.push({type : AjaxViewer.KEY_UP, code: AjaxViewer.X11_KEY_SHIFT, modifiers: modifiers}); + return; + } + + if(code == AjaxViewer.JS_NUMPAD_PLUS) { + this.mappedInput.push({type : AjaxViewer.KEY_DOWN, code: AjaxViewer.X11_KEY_SHIFT, modifiers: modifiers}); + this.mappedInput.push({type : AjaxViewer.KEY_DOWN, code: 43, modifiers: modifiers}); + this.mappedInput.push({type : AjaxViewer.KEY_UP, code: 43, modifiers: modifiers}); + this.mappedInput.push({type : AjaxViewer.KEY_UP, code: AjaxViewer.X11_KEY_SHIFT, modifiers: modifiers}); + return; + } + + this.mappedInput.push({type : AjaxViewer.KEY_DOWN, code: X11Keysym, modifiers: modifiers}); + this.mappedInput.push({type : AjaxViewer.KEY_UP, code: X11Keysym, modifiers: modifiers}); + } +} + ///////////////////////////////////////////////////////////////////////////// // class AjaxViewer // @@ -373,6 +470,7 @@ AjaxViewer.JS_KEY_BACK_SLASH = 220; // \ AjaxViewer.JS_KEY_CLOSE_BRACKET = 221; // ] AjaxViewer.JS_KEY_SINGLE_QUOTE = 222; // ' AjaxViewer.JS_NUMPAD_PLUS = 43; +AjaxViewer.JS_NUMPAD_MULTIPLY = 42; AjaxViewer.JS_KEY_NUM8 = 56; // keycode from Japanese keyboard @@ -561,7 +659,8 @@ AjaxViewer.prototype = { setupKeyboardTranslationTable : function() { this.keyboardMappers = []; - this.keyboardMappers[AjaxViewer.KEYBOARD_TYPE_ENGLISH] = new JsX11KeyboardMapper(); + // this.keyboardMappers[AjaxViewer.KEYBOARD_TYPE_ENGLISH] = new JsX11KeyboardMapper(); + this.keyboardMappers[AjaxViewer.KEYBOARD_TYPE_ENGLISH] = new JsCookedKeyboardMapper(); // setup Japanese keyboard translation table var mapper = new JsX11KeyboardMapper(); From 3d9caa482b42cd17c718f093486f6f2e4cbacfb4 Mon Sep 17 00:00:00 2001 From: David Nalley Date: Wed, 18 Jan 2012 20:22:09 -0500 Subject: [PATCH 16/30] bug 13138: adding french language support Status 13138: resolved fixed --- .../resources/messages_fr_FR.properties | 848 ++++++++++++++++++ 1 file changed, 848 insertions(+) create mode 100644 client/WEB-INF/classes/resources/messages_fr_FR.properties diff --git a/client/WEB-INF/classes/resources/messages_fr_FR.properties b/client/WEB-INF/classes/resources/messages_fr_FR.properties new file mode 100644 index 00000000000..8730be7c58e --- /dev/null +++ b/client/WEB-INF/classes/resources/messages_fr_FR.properties @@ -0,0 +1,848 @@ +#New - Add all new parameters here. + + + + +#Labels +label.ocfs2=OCFS2 + +label.action.edit.host=Modifier l'hôte + +network.rate=Débit réseau + +ICMP.type=Type ICMP +ICMP.code=Code ICMP + +image.directory=Répertoire d'images + +label.action.create.template.from.vm=Créer un modèle depuis la VM +label.action.create.template.from.volume=Créer un modèle depuis le volume + +message.vm.create.template.confirm=Créer un modèle va redémarrer la VM automatiquement + +label.action.manage.cluster=Gérer le Cluster +message.action.manage.cluster=Confirmez que vous voulez gérer le cluster +label.action.manage.cluster.processing=Gestion du cluster... + +label.action.unmanage.cluster=Ne plus gérer le Cluster +message.action.unmanage.cluster=Confirmez que vous ne voulez plus gérer le cluster +label.action.unmanage.cluster.processing=Arrêt de la gestion du Cluster + +allocation.state=Etat de l'allocation +managed.state=Etat de la gestion + +label.default.use=Usage par défaut +label.host.tags=Etiquettes d'hôtes + +label.cidr=CIDR +label.cidr.list=CIDR Source + +label.storage.tags=Etiquettes de stockage + +label.redundant.router=Routeur redondant +label.is.redundant.router=Redondant + +force.delete=Forcer la suppression +force.delete.domain.warning=Attention\: Choisir cette opion entrainera la suppression de tous les domaines issus et l'ensemble des comptes associées, ainsi que de leur ressources + +force.remove=Forcer la suppression +force.remove.host.warning=Attention\: Choisir cette option entrainera CloudStack à  arrêter l'ensemble des machines virtuelles avant d'enlever l'hôte du cluster + +force.stop=Forcer l'arrêt +force.stop.instance.warning=Attention\: Forcer l'arrêt sur cette instance devrait être votre dernière option. Cela peut entrainer la perte de données aussi bien que de rendre l'état de la machine inconsistent. Consultez le Guide d'Administration ou le Support de Cloud.com avant d'exécuter cette commande. + +label.PreSetup=PreSetup +label.SR.name = Nom du point de montage +label.SharedMountPoint=Point de montage partagé +label.VMFS.datastore=datastore VMFS + +label.network.device=Equipement Réseau +label.add.network.device=Ajouter un équipement réseau +label.network.device.type=Type d'équipement réseau +label.DHCP.server.type=Serveur DHCP +label.Pxe.server.type=Serveur PXE +label.PING.storage.IP=adresse PING (stockage) +label.PING.dir=répertoire PING +label.TFTP.dir=répertoire TFTP +label.PING.CIFS.username=utilisateur CIFS PING +label.PING.CIFS.password=mot de passe CIFS PING +label.CPU.cap=Utilisation maximum du CPU + +label.network.domain=Nom de domaine + +label.action.enable.zone=Activer la zone +label.action.enable.zone.processing=Activation de la zone... +message.action.enable.zone=Confirmez que vous voulez activer cette zone +label.action.disable.zone=Désactivation de la zone +label.action.disable.zone.processing=Désactivation de la zone... +message.action.disable.zone=Confirmez que vous voulez désactiver cette zone + +label.action.enable.pod=Activer le Pod +label.action.enable.pod.processing=Activation du Pod... +message.action.enable.pod=Confirmez que vous souhaitez activer ce Pod +label.action.disable.pod=Désactiver le Pod +label.action.disable.pod.processing=Désactivation du Pod... +message.action.disable.pod=Confirmez que vous voulez désactiver ce Pod + +label.action.enable.cluster=Activer le cluster +label.action.enable.cluster.processing=Activation du cluster... +message.action.enable.cluster=Confirmez que vous souhaitez activer ce cluster +label.action.disable.cluster=Désactiver le cluster +label.action.disable.cluster.processing=Désactivation du cluster... +message.action.disable.cluster=Confirmez que vous souhaitez désactiver ce cluster + +label.account.id=ID du Compte +label.account.name=Nom du compte +label.account.specific=Spécifique au compte +label.account=Compte +label.accounts=Comptes +label.acquire.new.ip=Acquérir une nouvelle adresse IP +label.show.ingress.rule=Montrer la règle Ingress +label.hide.ingress.rule=Cacher la règle Ingress +label.action.attach.disk.processing=Attachement du Disque... +label.action.attach.disk=Attacher un disque +label.action.attach.iso.processing=Attachement de l'image ISO +label.action.attach.iso=Attacher une image ISO +label.action.cancel.maintenance.mode.processing=Annulation du mode maintenance... +label.action.cancel.maintenance.mode=Annuler le mode maintenance +label.action.change.password=Changer le mot de passe +label.action.change.service.processing=Changement de d'offre de service... +label.action.change.service=Changer d'offre de service +label.action.copy.ISO.processing=Copie de l'image ISO... +label.action.copy.ISO=Copier une image ISO +label.action.copy.template.processing=Copie du Modèle... +label.action.copy.template=Copier un modèle +label.action.create.template.processing=Création du Modèle... +label.action.create.template=Créer un modèle +label.action.create.vm.processing=Création de la VM.. +label.action.create.vm=Créer une VM +label.action.create.volume.processing=Création du Volume... +label.action.create.volume=Créer un Volume +label.action.delete.IP.range.processing=Suppression de la plage IP... +label.action.delete.IP.range=Supprimer la plage IP +label.action.delete.ISO.processing=Suppression de l'image ISO... +label.action.delete.ISO=Supprimer l'image ISO +label.action.delete.account.processing=Suppression du compte... +label.action.delete.account=Supprimer un compte +label.action.delete.cluster.processing=Suppression du Cluster... +label.action.delete.cluster=Supprimer le Cluster +label.action.delete.disk.offering.processing=Suppression de l'offre Disque... +label.action.delete.disk.offering=Supprimer l'offre Disque + +label.action.update.resource.count=Mettre à jour le compte d'utilisation des ressources +label.action.update.resource.count.processing=Mise à jour du compteur... + +label.action.delete.domain=Supprimer le domaine +label.action.delete.domain.processing=Suppression du domaine... + +label.action.delete.firewall.processing=Suppression du Parefeu... +label.action.delete.firewall=Supprimer le Parefeu +label.action.delete.ingress.rule.processing=Suppression de la règle Ingress.. +label.action.delete.ingress.rule=Supprimer la règle Ingress +label.action.delete.load.balancer.processing=Suppression de l'équilibreur de charge... +label.action.delete.load.balancer=Supprimer l'équilibreur de charge +label.action.edit.network.processing=Modification du Réseau... +label.action.edit.network=Modifier le réseau +label.action.delete.network.processing=Suppression du réseau... +label.action.delete.network=Supprimer le réseau +label.action.delete.pod.processing=Suppression du pod... +label.action.delete.pod=Supprimer le Pod +label.action.delete.primary.storage.processing=Suppression du stockage primaire... +label.action.delete.primary.storage=Supprimer le stockage primaire +label.action.delete.secondary.storage.processing=Suppression du stockage secondaire... +label.action.delete.secondary.storage=Supprimer le stockage secondaire +label.action.delete.security.group.processing=Suppression du groupe de sécurité +label.action.delete.security.group=Supprimer le groupe de sécurité +label.action.delete.service.offering.processing=Suppression de l'offre de service... +label.action.delete.service.offering=Supprimer l'offre de service +label.action.delete.snapshot.processing=Suppresison de l'instantané... +label.action.delete.snapshot=Supprimer l'instantané +label.action.delete.template.processing=Suppression du modèle... +label.action.delete.template=Supprimer le modèle +label.action.delete.user.processing=Suppression de l'utilisateur... +label.action.delete.user=Supprimer l'utilisateur +label.action.delete.volume.processing=Suppression du volume... +label.action.delete.volume=Supprimer le volume +label.action.delete.zone.processing=Suppression de la zone... +label.action.delete.zone=Supprimer la zone +label.action.destroy.instance.processing=Suppression de l'instance... +label.action.destroy.instance=Supprimer l'instance +label.action.destroy.systemvm.processing=Suppression de la VM Système... +label.action.destroy.systemvm=Supprimer la VM Système +label.action.detach.disk.processing=Détachement du disque... +label.action.detach.disk=Détacher le disque +label.action.detach.iso.processing=Détachement de l'image ISO... +label.action.detach.iso=Détacher l'image ISO +label.action.disable.account.processing=Désactivation du compte... +label.action.disable.account=Désactiver le compte +label.action.disable.static.NAT.processing=Désactivation du NAT Statique... +label.action.disable.static.NAT=Désactiver le NAT Statique +label.action.disable.user.processing=Désactivation du l'utilisateur... +label.action.disable.user=Désactiver l'utilisateur +label.action.download.ISO=Télécharger une image ISO +label.action.download.template=Télécharger un modèle +label.action.download.volume.processing=Téléchargement du volume... +label.action.download.volume=Télécharger un volume +label.action.edit.ISO=Modifier l'image ISO +label.action.edit.account=Modifier le Compte +label.action.edit.disk.offering=Modifier l'offre de disque +label.action.edit.domain=Modifier le domaine +label.action.edit.global.setting=Modifier la configuration globale +label.action.edit.instance=Modifier l'instancer +label.action.edit.network.offering=Modifier l'offre de service réseau +label.action.edit.pod=Modifier le pod +label.action.edit.primary.storage=Modifier le stockage primaire +label.action.edit.resource.limits=Modifier les limites de ressources +label.action.edit.service.offering=Modifier l'offre de service +label.action.edit.template=Modifier le modèle +label.action.edit.user=Modifier l'utilisateur +label.action.edit.zone=Modifier la zone +label.action.enable.account.processing=Activation du compte... +label.action.enable.account=Activer le compte +label.action.enable.maintenance.mode.processing=Activation du mode maintenance... +label.action.enable.maintenance.mode=Activer le mode maintenance +label.action.enable.static.NAT.processing=Activation du NAT Statique... +label.action.enable.static.NAT=Activer le NAT Statique +label.action.enable.user.processing=Activation de l'utilisateur.. +label.action.enable.user=Activer l'utilisateur +label.action.force.reconnect.processing=Reconnexion en cours... +label.action.force.reconnect=Forcer la reconnexion +label.action.generate.keys.processing=Génération des clés... +label.action.generate.keys=Générer les clés +label.action.lock.account.processing=Blocage du compte... +label.action.lock.account=Bloquer le compte +label.action.migrate.instance=Migrer l'instance +label.action.migrate.instance.processing=Migration de l'instance... +label.action.reboot.instance.processing=Redémarrage de l'instance... +label.action.reboot.instance=Redémarrer l'instance +label.action.reboot.router.processing=Redémarrage du routeur... +label.action.reboot.router=Redémarrer le routeur +label.action.reboot.systemvm.processing=Redémarrage de la VM Système... +label.action.reboot.systemvm=Redémarre la VM Système +label.action.recurring.snapshot=Instantané récurrent +label.action.release.ip.processing=Libération de l'adresse IP... +label.action.release.ip=Libérer l'adresse IP +label.action.remove.host.processing=Suppression de l'hôte... +label.action.remove.host=Supprimer l'hôte +label.action.reset.password.processing=Réinitialisation le mot de passe... +label.action.reset.password=Réinitialiser le mot de passe +label.action.resource.limits=Limites de ressources +label.action.restore.instance.processing=Restauration de l'instance... +label.action.restore.instance=Restaurer l'instance +label.action.start.instance.processing=Démarrage de l'instance +label.action.start.instance=Démarrer l'instance +label.action.start.router.processing=Démarrage du routeur... +label.action.start.router=Démarrer le routeur +label.action.start.systemvm.processing=Démarrage de la VM système +label.action.start.systemvm=Démarrer la VM système +label.action.stop.instance.processing=Arrêt de l'Instance... +label.action.stop.instance=Arrêter l'Instance +label.action.stop.router.processing=Arrêt du routeur... +label.action.stop.router=Arrêter le routeur +label.action.stop.systemvm.processing=Arrêt de la VM système... +label.action.stop.systemvm=Arrêter la VM système +label.action.take.snapshot.processing=Prise de l'instantané +label.action.take.snapshot=Prendre un instantané +label.action.update.OS.preference.processing=Mise à jour des préférences d'OS... +label.action.update.OS.preference=Mettre à jour les préférences d'OS +label.actions=Actions +label.active.sessions=Sessions actives +label.add.account=Ajouter un compte +label.add.by.cidr=Ajouter par CIDR +label.add.by.group=Ajouter par groupe +label.add.cluster=Ajouter un cluster +label.add.direct.iprange=Ajouter une plage d'adresse IP directe +label.add.disk.offering=Ajouter une offre disque +label.add.domain=Ajouter un domaine +label.add.firewall=Ajouter un parefeu +label.add.host=Ajouter un hôte +label.add.ingress.rule=Ajouter une règle Ingress +label.add.ip.range=Ajouter une plage IP +label.add.iso=Ajouter une ISO +label.add.load.balancer=Ajouter un partageur de charge +label.add.more=Ajouter plus +label.add.network=Ajouter un réseau +label.add.pod=Ajouter un pod +label.add.primary.storage=Ajouter un stockage primaire +label.add.secondary.storage=Ajouter un stockage secondaire +label.add.security.group=Ajouter un groupe de sécurité +label.add.service.offering=Ajouter un offre de service +label.add.system.service.offering=Ajouter une offre de service système +label.add.template=Ajouter un modèle +label.add.user=Ajouter un utilisateur +label.add.vlan=Ajouter un vlan +label.add.volume=Ajouter un volume +label.add.zone=Ajouter une zone +label.add=Ajouter +label.adding.cluster=Ajout du Cluster +label.adding.failed=Echec de l'ajout +label.adding.pod=Ajout du Pod +label.adding.processing=Ajout... +label.adding.succeeded=Ajout réussi +label.adding.user=Ajout de l'utilisateur +label.adding.zone=Ajout de la zone +label.adding=Ajout +label.additional.networks=Réseaux additionnels +label.admin.accounts=Comptes Administrateur +label.admin=Administrateur +label.advanced.mode=Mode avancé +label.advanced.search=Recherche avancée +label.advanced=Avancé +label.alert=Alerte +label.algorithm=Algorithme +label.allocated=Alloué +label.api.key=Clé d'API +label.assign.to.load.balancer=Assigner l'instance au partageur de charge +label.assign=Assigner +label.associated.network.id=ID du réseau associé +label.attached.iso=Image ISO attachée +label.availability.zone=Zone de disponibilité +label.availability=Disponibilité +label.available.public.ips=Adresses IP publiques disponibles +label.available=Disponible +label.back=Retour +label.basic.mode=Mode basique +label.bootable=Bootable +label.broadcast.domain.type=Type de domaine de broadcast +label.by.account=Par compte +label.by.availability=Par disponibilité +label.by.domain=Par domaine +label.by.end.date=Par date de fin +label.by.level=Par niveau +label.by.pod=Par Pod +label.by.role=Par role +label.by.start.date=Par date de début +label.by.state=Par état +label.by.traffic.type=Par type de traffic +label.by.type.id=Par type d'ID +label.by.type=Par type +label.by.zone=Par zone +label.bytes.received=Octets reçus +label.bytes.sent=Octets envoyés +label.cancel=Annuler +label.certificate=Certificat +label.privatekey=Clé privée PKCS#8 +label.domain.suffix=Suffixe de domaine DNS (i.e., xyz.com) +label.character=Caractère +label.cidr.account=CIDR ou Compte/Groupe de sécurité +label.close=Fermer +label.cloud.console=Console de gestion du cloud +label.cloud.managed=Géré par Cloud.com +label.cluster.type=Type de Cluster +label.cluster=Cluster +label.code=Code +label.confirmation=Confirmation +label.cpu.allocated.for.VMs=CPU alloué aux VMs +label.cpu.allocated=CPU alloué +label.cpu.mhz=CPU (en MHz) +label.cpu.utilized=CPU utilisé +label.cpu=CPU +label.created=Créé +label.cross.zones=Multi Zones +label.custom.disk.size=Taille de disque personnalisée +label.daily=Quotidien +label.data.disk.offering=Offre de disque de données +label.date=Date +label.day.of.month=Jour du mois +label.day.of.week=Jour de la semaine +label.delete=Supprimer +label.deleting.failed=Suppression échouée +label.deleting.processing=Suppression... +label.description=Description +label.detaching.disk=Détacher le disque +label.details=Details +label.device.id=ID du périphérique +label.disabled=Désactivé +label.disabling.vpn.access=Désactiver l'accès VPN +label.disk.allocated=Disque Alloué +label.disk.offering=Offre de Disque +label.disk.size.gb=Taille du disque (en Go) +label.disk.size=Taille du disque +label.disk.total=Espace disque total +label.disk.volume=Volume disque +label.display.text=Texte affiché +label.dns.1=DNS1 +label.dns.2=DNS2 +label.domain.admin=Administrateur du domaine +label.domain.id=ID du domaine +label.domain.name=Nom de domaine +label.domain=Domaine +label.double.quotes.are.not.allowed=Les guillemets ne sont pas autorisés +label.download.progress=Progression du téléchargement +label.edit=Modifier +label.email=Email +label.enabling.vpn.access=Activation de l'accès VPN +label.enabling.vpn=Activation du VPN +label.end.port=Port de fin +label.endpoint.or.operation=Terminaison ou Opération +label.error.code=Code d'erreur +label.error=Erreur +label.esx.host=Hôte ESX/ESXi +label.example=Exemple +label.failed=Echoué +label.featured=Sponsorisé +label.firewall=Parefeu +label.first.name=Prénom +label.format=Format +label.friday=Vendredi +label.full=Complet +label.gateway=Passerelle +label.general.alerts=Alertes générales +label.generating.url=Génération de l'URL +label.generating.url=Génération de l'URL +label.go.step.2=Aller à l'étape 2 +label.go.step.3=Aller à l'étape 3 +label.go.step.4=Aller à l'étape 4 +label.go.step.5=Aller à l'étape 5 +label.group.optional=Groupe (optionnel) +label.group=Groupe +label.guest.cidr=CIDR invités +label.guest.gateway=Passerelle pour les invités +label.guest.ip.range=Plage d'adresses IP des invités +label.guest.ip=Adresse IP des invités +label.guest.netmask=Masque de réseau des invités +label.ha.enabled=Haute disponibilité active +label.help=Aide +label.host.alerts=Alertes des hôtes +label.host.name=Nom de l'hôte +label.host=Hôte +label.hosts=Hôtes +label.hourly=A l'heure +label.hypervisor.type=Type d'hyperviseur +label.hypervisor=Hyperviseur +label.id=ID +label.info=Information +label.ingress.rule=Règle Ingress +label.initiated.by=Initié par +label.instance.limits=Limites des instances +label.instance.name=Nom de lìnstance +label.instance=Instance +label.instances=Instances +label.internal.dns.1=DNS interne 1 +label.internal.dns.2=DNS interne 2 +label.interval.type=Type d'ìntervalle +label.invalid.integer=Nombre entier invalide +label.invalid.number=Nombre invalide +label.ip.address=Adresse IP +label.ip.allocations=Allocations de IPs +label.ip.limits=Limite de IPs publiques +label.ip.or.fqdn=IP ou FQDN +label.ip.range=Plage IP +label.ip=IP +label.ips=IPs +label.is.default=Est par défaut +label.is.shared=Est partagé +label.is.system=Est système +label.iscsi=iSCSI +label.iso.boot=Démarrage par ISO +label.iso=ISO +label.isolation.mode=Mode d'isolation +label.keep=Conserver +label.lang.chinese=Chinois (simplifié) +label.lang.english=Anglais +label.lang.japanese=Japonais +label.lang.spanish=Espagnol +label.last.disconnected=Dernière Déconnexion +label.last.name=Nom de famille +label.level=Niveau +label.linklocal.ip=Adresse IP de lien local +label.load.balancer=Partageur de charge +label.loading=Chargement en cours +label.local=Local +label.login=Connexion +label.logout=Déconnexion +label.lun=LUN +label.manage=Gérer +label.maximum=Maximum +label.memory.allocated=Mémoire allouée +label.memory.mb=Mémoire (en MB) +label.memory.total=Mémoire totale +label.memory.used=Mémoire utilisée +label.memory=Mémoire +label.menu.accounts=Comptes +label.menu.alerts=Alertes +label.menu.all.accounts=Tout les comptes +label.menu.all.instances=Toutes les instances +label.menu.community.isos=ISO de la communauté +label.menu.community.templates=Modèles de la communauté +label.menu.configuration=Configuration +label.menu.dashboard=Tableau de bord +label.menu.destroyed.instances=Instances détruites +label.menu.disk.offerings=Offres de disque +label.menu.domains=Domaines +label.menu.events=Evénements +label.menu.featured.isos=ISOs Sponsorisées +label.menu.featured.templates=Modèles sponsorisés +label.menu.global.settings=Paramètres globaux +label.menu.instances=Instances +label.menu.ipaddresses=Adresses IP +label.menu.isos=ISOs +label.menu.my.accounts=Mes comptes +label.menu.my.instances=Mes instances +label.menu.my.isos=Mes ISOs +label.menu.my.templates=Mes modèles +label.menu.network.offerings=Offres de Service Réseau +label.menu.network=Réseau +label.menu.physical.resources=Ressources physiques +label.menu.running.instances=Instances actives +label.menu.security.groups=Groupes de sécurité +label.menu.service.offerings=Offres de Service +label.menu.system.service.offerings=Offres de Service Système +label.menu.snapshots=Instantanés +label.menu.stopped.instances=Instances Arrêtées +label.menu.storage=Stockage +label.menu.system.vms= VMs systèmes +label.menu.system=Système +label.menu.templates=Modèles +label.menu.virtual.appliances=Appliances Virtuelles +label.menu.virtual.resources=Ressources Virtuelles +label.menu.volumes=Volumes +label.migrate.instance.to=Migrer l'instance vers +label.minimum=Minimum +label.minute.past.hour=Minute(s) après l'heure +label.monday=Lundi +label.monthly=Mensuel +label.more.templates=Plus de modèles +label.my.account=Mon compte +label.name.optional=Nom (facultatif) +label.name=Nom +label.netmask=Masque de réseau +label.network.desc=Description réseau +label.network.domain=Nom de domaine +label.network.id=ID réseau +label.network.name=Nom du réseau +label.network.offering.display.text=Texte affiché d'Offre de Réseau +label.network.offering.id=ID de l'Offre de Service Réseau +label.network.offering.name=Nom de l'Offre de Service Réseau +label.network.offering=Offre de Service Réseau +label.network.rate=Débit Réseau +label.network.read=Lecture réseau +label.network.type=Type de réseau +label.network.write=Écriture réseau +label.network=Réseau +label.new.password=Nouveau mot de passe +label.next=Suivant +label.nfs.server=Serveur NFS +label.nfs.storage=Stockage NFS +label.nfs=NFS +label.nics=Cartes NIC +label.no.actions=Aucune action disponibles +label.no.alerts=Aucune alerte récentes +label.no.errors=Aucune erreur récentes +label.no.isos=Aucun ISOs disponibles +label.no.items=Aucun élément disponibles +label.no.security.groups=Aucun groupe de sécurité disponibles +label.no.thanks=Non merci +label.no=Non +label.none=Aucun +label.not.found=Introuvable +label.num.cpu.cores=Nombre de c\u0153urs de processeur +label.numretries = Nombre de tentatives +label.offer.ha=Offrir la haute disponibilité +label.optional=Facultatif +label.os.preference=Préférence du OS +label.os.type=Type du OS +label.owned.public.ips=Addresses IP Publique détenues +label.owner.account=Compte propriétaire +label.owner.domain=Domaine propriétaire +label.parent.domain=Domaine Parent +label.password.enabled=Mot de passe activé +label.password=Mot de passe +label.path=Chemin +label.please.wait=Patientez s'il vous plait +label.pod=Pod +label.port.forwarding=Redirection de port +label.port.range=Plage de ports +label.prev=Précédent +label.primary.allocated=Stockage primaire alloué +label.primary.network=Réseau primaire +label.primary.storage=Stockage primaire +label.primary.used=Stockage primaire utilisé +label.private.interface=Interface privée +label.private.ip.range=Plage d'adresses IP Privées +label.private.ip=Adresse IP Privée +label.private.ips=Adresses IP Privées +label.private.port=Port privé +label.private.zone=Zone Privée +label.protocol=Protocole +label.protocol=Protocole +label.public.interface=Interface publique +label.public.ip=Adresse IP publique +label.public.ips=Adresses IP publiques +label.public.port=Port public +label.public.zone=Zone publique +label.public=Publique +label.recent.errors=Erreurs récentes +label.refresh=Actualiser +label.related=Connexes +label.remove.from.load.balancer=Supprimer l'instance du partageur de charge +label.removing.user=Retrait de l'utilisateur +label.required=Requis +label.reserved.system.ip=Adresse IP Système réservé +label.resource.limits=Limite des ressources +label.resource=Ressource +label.resources=Ressources +label.role=Rôle +label.root.disk.offering=Offre de disque racine +label.running.vms=VMs actives +label.saturday=Samedi +label.save=Sauvegarder +label.saving.processing=Sauvegarde en cours.... +label.scope=Portée +label.search=Rechercher +label.secondary.storage=Stockage secondaire +label.secondary.used=Stockage secondaire utilisé +label.secret.key=clé privée +label.security.group.name=Nom du groupe de sécurité +label.security.group=Groupe de sécurité +label.security.groups.enabled=Groupes de sécurité Activés +label.security.groups=Groupes de sécurité +label.sent=Envoyer +label.server=Serveur +label.service.offering=Offre de Service +label.system.service.offering=Offre de Service Système +label.session.expired=Session expiré +label.shared=En partage +label.size=Taille +label.snapshot.limits=Limite d'instantanés +label.snapshot.name=Nom de l'instantané +label.snapshot.s=Instantané(s) +label.snapshot.schedule=Programmation de l'Instantané +label.snapshot=Instantané +label.snapshots=Instantanés +label.source.nat=NAT Source +label.specify.vlan=Précisez le VLAN +label.start.port=Port de +label.state=État +label.static.nat.to=NAT Static vers +label.static.nat=NAT Static +label.statistics=Statistiques +label.status=Statut +label.step.1.title=Etape 1 \: Sélectionnez un modèle +label.step.1=Étape 1 +label.step.2.title=Etape 2\: Offre de Service +label.step.2=Étape 2 +label.step.3.title=Etape 3\: Sélectionnez une offre de service +label.step.3=Étape 3 +label.step.4.title=Etape 4\: Réseau +label.step.4=Étape 4 +label.step.5.title=Etape 5\: Vérification +label.step.5=Étape 5 +label.stopped.vms=VMs arrêtés +label.storage.type=Type de stockage +label.storage=Stockage +label.submit=Envoyer +label.submitted.by=[Soumis par\: ] +label.succeeded=Réussi +label.sunday=Dimanche +label.system.capacity=Ressources disponibles pour l'ensemble du Système +label.system.vm.type=Type de VM système +label.system.vm.type=Type de VM système +label.system.vm=VM Système +label.system.vms= VMs Systèmes +label.tagged=Taggé +label.tags=Tags +label.target.iqn=IQN de la Cible +label.template.limits=Limites des modèles +label.template=Modèle +label.theme.default=Thème par défaut +label.theme.grey=Personnalisé - Gris +label.theme.lightblue=Personnalisé - Blue clair +label.thursday=Jeudi +label.time.zone=Fuseau horaire +label.time=Temps +label.timeout.in.second = Timeout(en secondes) +label.timezone=Fuseau horaire +label.total.cpu=Capacité Totale en CPU +label.total.vms=Nombre total de VMs +label.traffic.type=Type de Traffic +label.tuesday=Mardi +label.type.id=ID du Type +label.type=Type +label.unavailable=Indisponible +label.unlimited=Illimité +label.untagged=Non Taggé +label.update.ssl.cert=Mettre à jour le certificate SSL +label.update.ssl=Mettre à jour le certificate SSL +label.updating=Mise à jour +label.url=URL +label.usage.interface=Interface d'Usage +label.used=Utilisé +label.user=Utilisateur +label.username=Nom d'Utilisateur +label.users=Utilisateurs +label.value=Valeur +label.vcenter.cluster=Cluster vCenter +label.vcenter.datacenter=Datacenter vCenter +label.vcenter.datastore=Datastore vCenter +label.vcenter.host=Hôte Vcenter +label.vcenter.password=Mot de passe vCenter +label.vcenter.username=Nom d'utilisateur vCenter +label.version=Version +label.virtual.appliance=Appliance Virtuelle +label.virtual.appliances=Appliances Virtuelles +label.virtual.network=Réseau virtuel +label.vlan.id=ID du VLAN +label.vlan.range=Plage du VLAN +label.vlan=VLAN +label.vm.add=Ajouter une instance +label.vm.destroy=Détruire +label.vm.reboot=Redémarrer +label.vm.start=Démarrer +label.vm.stop=Arrêtez +label.vmfs=VMFS +label.vms=VMs +label.volume.limits=Limites des volumes +label.volume.name=Nom du volume +label.volume=Volume +label.volumes=Volumes +label.vpn=VPN +label.vsphere.managed=Gérée par vSphere +label.waiting=En attente +label.warn=Avertir +label.wednesday=Mercredi +label.weekly=Hebdomadaire +label.welcome.cloud.console=Bienvenue dans la console de gestion +label.welcome=Bienvenue +label.yes=Oui +label.zone.id=ID de la zone +label.zone.step.1.title=Etape 1\: Sélectionnez un réseau +label.zone.step.2.title=Etape 2\: Ajoutez une zone +label.zone.step.3.title=Etape 3\: Ajoutez un Pod +label.zone.step.4.title=Etape 4\: Ajoutez une plage d'adresses IP +label.zone.wide=Etendu à la zone +label.zone=Zone + +#Messages +message.acquire.public.ip=Sélectionnez la zone dans laquelle vous voulez acquérir votre nouvelle adresse IP. +message.action.cancel.maintenance.mode=Confirmer que vous souhaitez annuler cette maintenance. +message.action.cancel.maintenance=Votre hôte a été annulée de la maintenance. Ce processus peut prendre jusqu'à plusieurs minutes. +message.action.delete.ISO.for.all.zones=L'ISO est utilisé par toutes les zones. S'il vous plaît confirmer que vous voulez le supprimer de toutes les zones. +message.action.delete.ISO=Confirmer que vous souhaitez supprimer cette ISO. +message.action.delete.cluster=Confirmer que vous voulez supprimer ce cluster. +message.action.delete.disk.offering=Confirmer que vous souhaitez supprimer cette offre de disque. +message.action.delete.domain=Confirmer que vous voulez supprimer ce domaine. +message.action.delete.external.firewall=Confirmer que vous souhaitez supprimer ce pare-feu externe. Attention\: Si vous prévoyez de rajouter le même pare-feu externe de nouveau, vous devez réinitialiser les données d'utilisation sur l'appareil. +message.action.delete.external.load.balancer=Confirmez que vous souhaitez supprimer ce partageur de charge externe. Attention \: Si vous pensez ajouter le même partageur de charge plus tard, vous devez remettre à zéro les statistiques d'usage de cet équipement. +message.action.delete.ingress.rule=Confirmez que vous souhaitez supprimer cette règle Ingress +message.action.delete.network=Confirmer que vous voulez supprimer ce réseau. +message.action.delete.pod=Confirmez que vous souhaitez supprimer ce pod. +message.action.delete.primary.storage=Confirmer que vous voulez supprimer ce stockage primaire. +message.action.delete.secondary.storage=Confirmez que vous souhaitez supprimer ce stockage secondaire. +message.action.delete.security.group=Confirmez que vous souhaitez supprimer ce groupe de sécurité. +message.action.delete.service.offering=Confirmez que vous souhaitez supprimer cette offre de service. +message.action.delete.snapshot=Confirmez que vous souhaitez supprimer cet instantané +message.action.delete.template.for.all.zones=Ce modèle est utilisé par toutes les zones. Confirmez que vous souhaitez le supprimer de toutes les zones. +message.action.delete.template=Confirmez que vous souhaitez supprimer ce modèle. +message.action.delete.volume=Confirmez que vous souhaitez supprimer ce volume. +message.action.delete.zone=Confirmez que vous souhaitez supprimer cette zone. +message.action.destroy.instance=Confirmez que vous souhaitez supprimer cette instance. +message.action.destroy.systemvm=Confirmez que vous souhaitez supprimer cette VM Système. +message.action.disable.static.NAT=Confirmez que vous souhaitez désactiver le NAT statique. +message.action.enable.maintenance=Votre hôte a été mis en mode maintenance avec succès. Ce processus peut durer plusieurs minutes ou plus suivant le nombre de VMs actives sur cet hôte. +message.action.force.reconnect=Votre hôte a été forcé à se reconnecter avec succès. Ce processus peut prendre jusqu'à plusieurs minutes. +message.action.force.reconnect=Votre hôte a été forcé à se reconnecter avec succès. Ce processus peut prendre jusqu'à plusieurs minutes. +message.action.host.enable.maintenance.mode=Activer le mode maintenance va causer la migration à chaud de l'ensemble des instances de cet hôte sur les autres hôtes disponibles. +message.action.instance.reset.password=Confirmez que vous souhaitez changer le mot de passe ROOT de cette machine virtuelle. +message.action.primarystorage.enable.maintenance.mode=Attention \: placer ce stockage primaire en mode maintenance que l'ensemble des VMs utilisant des volumes sur ce stockage. Souhaitez vous continuer ? +message.action.reboot.instance=Confirmez que vous souhaitez redémarrer cette instance. +message.action.reboot.router=Confirmez que vous souhaitez redémarrer ce routeur. +message.action.reboot.systemvm=Confirmez que vous souhaitez redémarrer cette VM Système +message.action.release.ip=Confirmez que vous souhaitez libérer cette IP. +message.action.remove.host=Supprimer le dernier/seul hôte dans le cluster et le réinstaller va supprimer l'environnement/la base de données sur l'hôte et rendre les VMs invitées inutilisables. +message.action.restore.instance=Confirmez que vous souhaitez restaurer cette instance. +message.action.start.instance=Confirmez que vous souhaitez démarrer cette instance. +message.action.start.router=Confirmez que vous souhaitez démarrer ce routeur. +message.action.start.systemvm=Confirmez que vous souhaitez redémarrer cette VM système. +message.action.stop.instance=Confirmez que vous souhaitez arrêter cette instance. +message.action.stop.router=Confirmez que vous souhaitez arrêter ce routeur. +message.action.stop.systemvm=Confirmez que vous souhaitez arrêter cette VM. +message.action.take.snapshot=Confirmez que vous voulez prendre un instantané. +message.add.cluster.zone=Ajouter un cluster d'hyperviseurs géré pour cette zone +message.add.cluster=Ajouter un cluster d'hyperviseurs géré pour cette zone , pod +message.add.disk.offering=Renseignez les paramètres suivants pour ajouter un offre de service de disques +message.add.firewall=Ajouter un parefeu à cette zone +message.add.host=Renseignez les paramètres suivant pour ajouter un hôte +message.add.ip.range.direct.network=Ajouter une plage IP au réseau direct dans la zone +message.add.ip.range.to.pod=

Ajouter une plage IP pour le pod\:

+message.add.ip.range=Ajouter une plage IP pour le réseau publique dans la zone +message.add.load.balancer=Ajouter un partageur de charge à la zone +message.add.network=Ajouter un nouveau réseau à la zone\: +message.add.pod=Ajouter un nouveau pod à la zone +message.add.primary.storage=Ajouter un nouveau stockage primaire à la zone , pod +message.add.primary=Renseignez les paramètres suivants pour ajouter un sotckage primaire +message.add.secondary.storage=Ajouter un nouveau stockage pour la zone +message.add.service.offering=Renseignez les informations suivantes pour ajouter une nouvelle offre de service. +message.add.template=Renseignez les informations suivantes pour créer votre nouveau modèle +message.add.volume=Renseignez les informations suivantes pour ajouter un nouveau volume +message.additional.networks.desc=Sélectionnez le(s) réseau(x) additionnel(s) au(x)quel(s) sera connectée votre instance. +message.advanced.mode.desc=Choisissez ce modèle de réseau si vous souhaitez bénéficier du support des VLANs. Ce mode de réseau donne le plus de flexibilité aux administrateurs pour fournir des offres de service réseau personnalisées comme fournir des parefeux, vpn, partageurs de charge ou également activer des réseaux virtuels ou directs. +message.advanced.security.group=Choisissez ceci si vous souhaitez utiliser les groupes de sécurité pour fournir l'isolation des VMs invitées. +message.advanced.virtual=Choisissez ceci si vous souhaitez utiliser des VLANs pour fournir l'isolation des VMs invitées. +message.allow.vpn.access=Entrez un nom d'utilisateur et un mot de passe pour l'utilisateur que vous souhaitez autorisé à utiliser l'accès VPN. +message.attach.iso.confirm=Confirmez que vous souhaitez attacher l'image ISO à cette instance. +message.attach.volume=Renseignez les données suivante pour attacher un nouveau volume. Si vous attachez un volume disque à une machine virtuelle sous Windows, vous aurez besoin de redémarrer l'instance pour voir le nouveau disque. +message.basic.mode.desc=Choisissez ce modèle de réseau si vous *ne voulez pas* activer le support des VLANs. Toutes les instances créées avec ce modèle de réseau se verront assignées une adresse IP et les groupes de sécurité seront utilisés pour fournir l'isolation entre les VMs. + +message.change.offering.confirm=Confirmez que vous souhaitez changer l'offre de service de cette instance. +message.copy.iso.confirm=Confirmez que vous souhaitez copier votre image ISO vers +message.copy.template=Copier le modèle XXX de la zone vers +message.create.template.vm=Créer la VM depuis le modèle +message.create.template.volume=Renseignez les informations suivantes avec de créer un modèle à partir de votre volume de disque\:. La création du modèle peut prendre plusieurs minutes suivant la taille du volume. +message.delete.account=Confirmez que vous souhaitez supprimer ce compte. +message.detach.iso.confirm=Confirmez que vous souhaitez détacher l'image ISO de cette instance. +message.disable.account=Confirmez que vous souhaitez désactiver ce compte. En désactivant ce compte, tous les utilisateurs du compte ne pourront plus accéder à leurs ressources. Toutes les VMs actives seront arrêtées immédiatement. +message.disable.vpn.access=Confirmez que vous souhaitez désactiver l'accès VPN. +message.download.ISO=Cliquez sur 00000 pour télécharger l'ISO +message.download.template=Cliquez sur 00000 pour télécharger le modèle +message.download.volume=Cliquez sur 00000 pour télécharger le volume +message.edit.confirm=Vérifiez vos changements avant de cliquer sur "Sauvegarder" +message.edit.limits=Renseignez les limites pour les ressources suivantes. "-1" indique qu'il n'y a pas de limites pour la création de ressources. +message.enable.account=Confirmez que vous souhaitez activer ce compte. +message.enable.vpn.access=Le VPN est désactivé pour cette adresse IP. Voulez vous activer l'accès VPN ? +message.enable.vpn=L'accès VPN n'est pas activé. Please cliquez ici pour activer le VPN. +message.enabled.vpn.ip.sec=Votre clé partagée IPSec est +message.enabled.vpn=Votre accès VPN est activé et peut être accédé par l'IP +message.launch.vm.on.private.network=Souhaitez vous démarrer l'instance sur votre propre réseau privé dédié ? +message.lock.account=Confirmez que vous souhaitez verrouiller ce compte. En le verrouillant, les utilisateurs de ce compte ne seront plus capable de gérer leurs ressources. Les ressources existantes resteront toutefois accessibles. +message.migrate.instance.confirm=Confirmez l'hôte vers lequel vous souhaitez migrer cette instance +message.new.user=Renseignez les informations suivantes pour ajouter un nouvel utilisateur au compte. +message.no.network.support.configuration.not.true=Vous n'avez pas de zone avec les groupes de sécurité activés. Donc, pas de fonctionnalités supplémentaires pour le réseau. Continuez à l'étape 5. +message.no.network.support=Sélectionnez l'hyperviseur. vSphere, n'a pas de fonctionnalités supplémentaires pour le réseau. Continuez à l'étape 5. +message.number.clusters=

# of Clusters

+message.number.hosts=

# of Hôtes

+message.number.pods=

# of Pods

+message.number.storage=

# of Volumes de Stockage Primaire

+message.number.zones=

# of Zones

+message.remove.vpn.access=Confirmez que vous souhaitez supprimer l'accès VPN à l'utilisateur suivant. +message.restart.mgmt.server=Redémarrez votre(vos) serveur(s) de management pour appliquer les nouveaux paramètres. +message.security.group.usage=(Utilisez Ctrl-clic pour séléctionner les groupes de sécurité visés) +message.snapshot.schedule=Vous pouvez mettre en place les politiques de génération d'instantanés en sélectionnant les options disponibles ci-dessous et en appliquant votre politique. +message.step.1.continue=Sélectionnez un modèle ou une image ISO pour continuer +message.step.1.desc=Sélectionnez un template pour votre nouvelle instance virtuelle. Vous pouvez également choisir un modèle vierge sur lequel une image ISO pourra être installé. +message.step.2.continue=Sélectionnez une offre de service pour continuer +message.step.2.desc= +message.step.3.continue=Sélectionnez un offre de service de disque pour continuer +message.step.3.desc= +message.step.4.continue=Sélectionnez au moins un réseau pour continuer +message.step.4.desc=Sélectionnez le réseau principal auquel votre instance va être connecté. +message.update.os.preference=Choisissez votre OS préféré pour cet hôte. Toutes les instances avec des préférences similaires seront d'abord allouées à cet hôte avant d'en choisir un autre. +message.update.ssl=Soumettez un nouveau certificat SSL compatible X.509 qui sera mis à jour sur l'ensemble de instance de proxy console. +message.virtual.network.desc=Un réseau virtuel dédié pour votre compte. Ce domaine de broadcast est contenu dans un VLAN et l'ensemble de accès réseau publique sont routés par un routeur virtuel. +message.volume.create.template.confirm=Confirmez que vous souhaitez créer un modèle pour ce disque. La création peut prendre plusieurs minutes, voire plus, selon la taille du volume. +message.zone.step.1.desc=Sélectionnez un modèle de réseau pour votre zone. +message.zone.step.2.desc=Renseignez les informations suivantes pour ajouter une zone. +message.zone.step.3.desc=Renseignez les informations suivantes pour ajouter un pod. +message.apply.snapshot.policy=Vous avez mis à jour votre politique d'instantanés avec succès. +message.disable.snapshot.policy=Vous avez désactivé votre politique de snapshots avec succès. +message.action.change.service.warning.for.instance=Votre instance doit être arrêtée avant d'essayer de changer son offre de service. +message.action.change.service.warning.for.router=Votre routeur doit être arrêté avant d'essayer de changer son offre de service. +message.action.reset.password.warning=Votre instance doit être arrêtée avant d'essayer de changer son mot de passe. +message.action.reset.password.off=Votre instance ne supporte pas pour le moment cette fonctionnalité. + +#Errors +error.login=Votre nom d'utilisateur /mot de passe ne correspond pas à nos données. +error.menu.select=Impossible d'effectuer cette action tant que vous n'avez pas sélectionné d'éléments. +error.mgmt.server.inaccessible=Le serveur de management est indisponible. Essayez plus tard. +error.session.expired=Votre session a expiré. +error.unresolved.internet.name=Votre nom internet ne peut pas être résolu. From 992edbf2b41240f84f85593738ddd5233e64e6c5 Mon Sep 17 00:00:00 2001 From: David Nalley Date: Wed, 18 Jan 2012 20:23:13 -0500 Subject: [PATCH 17/30] bug 13139: adding pt_BR language support Status 13139: resolved fixed --- .../resources/messages_pt_BR.properties | 847 ++++++++++++++++++ 1 file changed, 847 insertions(+) create mode 100644 client/WEB-INF/classes/resources/messages_pt_BR.properties diff --git a/client/WEB-INF/classes/resources/messages_pt_BR.properties b/client/WEB-INF/classes/resources/messages_pt_BR.properties new file mode 100644 index 00000000000..a500b371884 --- /dev/null +++ b/client/WEB-INF/classes/resources/messages_pt_BR.properties @@ -0,0 +1,847 @@ +#New - Add all new parameters here. + + + + +#Labels +label.ocfs2=OCFS2 + +label.action.edit.host=Editar Host + +network.rate=Taxa de Transferência + +ICMP.type=Tipo ICMP +ICMP.code=Código ICMP + +image.directory=Diretório da Imagem + +label.action.create.template.from.vm=Criar Template a partir da VM +label.action.create.template.from.volume=Criar Template a partir do Disco + +message.vm.create.template.confirm=Criar Template reiniciará a VM automaticamente. + +label.action.manage.cluster=Vincular Cluster +message.action.manage.cluster=Confirma a vinculação do cluster. +label.action.manage.cluster.processing=Vinculando o Cluster.... + +label.action.unmanage.cluster=Desvincular Cluster +message.action.unmanage.cluster=Confirma a desvinculação do cluster. +label.action.unmanage.cluster.processing=Desvinculando Cluster.... + +allocation.state=Status da Alocação +managed.state=Status do Gerenciamento + +label.default.use=Default Use +label.host.tags=Tags de Host + +label.cidr=CIDR +label.cidr.list=CIDR de Origem + +label.storage.tags=Tags de Storage + +label.redundant.router=Roteador Redundantee +label.is.redundant.router=Redundante + +force.delete=Forçar Exclusão +force.delete.domain.warning=Atenção\: Esta opção removerá todos os domínios, contas e recursos associados. + +force.remove=Forçar Remoção +force.remove.host.warning=Atenção\: O CloudStack desligará de maneira forçada todas as VMs antes de remover o host do cluster. + +force.stop=Forçar Parada +force.stop.instance.warning=Atenção\: Forçar o desligamento deste Cloud Server deve ser usado com cautela. Pode levar a perda de dados assim como inconsistência no sistema de arquivos. + +label.PreSetup=PreSetup +label.SR.name = SR Name-Label +label.SharedMountPoint=SharedMountPoint +label.VMFS.datastore=VMFS datastore + +label.network.device=Dispositivo de Rede +label.add.network.device=Adicionar Dispositivo de Rede +label.network.device.type=Tipo de Dispositivo de Rede +label.DHCP.server.type=Tipo de Servidor DHCP +label.Pxe.server.type=Tipo de Servidor PXE +label.PING.storage.IP=Disparar PING para IP do Storage +label.PING.dir=PING Directory +label.TFTP.dir=TFTP Directory +label.PING.CIFS.username=PING CIFS username +label.PING.CIFS.password=PING CIFS password +label.CPU.cap=CPU Cap + +label.network.domain=Domínio de Rede + +label.action.enable.zone=Ativar Zona +label.action.enable.zone.processing=Ativando Zona.... +message.action.enable.zone=Confirma a ativação da zona. +label.action.disable.zone=Desativar Zona +label.action.disable.zone.processing=Desativando Zona.... +message.action.disable.zone=Confirma a desativação da zona. + +label.action.enable.pod=Ativar POD +label.action.enable.pod.processing=Ativando POD.... +message.action.enable.pod=Confirma a ativação do POD. +label.action.disable.pod=Desativar POD +label.action.disable.pod.processing=Desativando POD.... +message.action.disable.pod=Confirma a desativação do POD. + +label.action.enable.cluster=Ativar Cluster +label.action.enable.cluster.processing=Ativando Cluster.... +message.action.enable.cluster=Confirma a ativação do cluster. +label.action.disable.cluster=Desativar Cluster +label.action.disable.cluster.processing=Desativando Cluster.... +message.action.disable.cluster=Confirma a desativação do cluster. + +label.account.id=ID da Conta +label.account.name=Nome da Conta +label.account.specific=Conta-Specific +label.account=Conta +label.accounts=Contas +label.acquire.new.ip=Adquirir novo IP +label.show.ingress.rule=Mostrar Regra de Entrada +label.hide.ingress.rule=Ocultar Regra de Entrada +label.action.attach.disk.processing=Anexando Disco.... +label.action.attach.disk=Anexar Disco +label.action.attach.iso.processing=Anexando ISO.... +label.action.attach.iso=Anexar ISO +label.action.cancel.maintenance.mode.processing=Cancelando Modo de Manutenção.... +label.action.cancel.maintenance.mode=Cancelar Modo de Manutenção +label.action.change.password=Troca de Senha +label.action.change.service.processing=Trocando de Plano.... +label.action.change.service=Trocar Plano +label.action.copy.ISO.processing=Copiando ISO.... +label.action.copy.ISO=Copiar ISO +label.action.copy.template.processing=Copiando Template.... +label.action.copy.template=Copiar Template +label.action.create.template.processing=Criando Template.... +label.action.create.template=Criar Template +label.action.create.vm.processing=Criando VM.... +label.action.create.vm=Criar VM +label.action.create.volume.processing=Criando Disco.... +label.action.create.volume=Criar Disco +label.action.delete.IP.range.processing=Removendo Range de IP.... +label.action.delete.IP.range=Remover Range IP +label.action.delete.ISO.processing=Removendo ISO.... +label.action.delete.ISO=Removendo ISO +label.action.delete.account.processing=Removendo conta.... +label.action.delete.account=Remover conta +label.action.delete.cluster.processing=Removendo Cluster.... +label.action.delete.cluster=Remover Cluster +label.action.delete.disk.offering.processing=Removendo Oferta de Disco.... +label.action.delete.disk.offering=Remover Oferta de Disco + +label.action.update.resource.count=Atualiza Contador de Recursos +label.action.update.resource.count.processing=Atualizando Contador de Recursos.... + +label.action.delete.domain=Remover Domínio +label.action.delete.domain.processing=Removendo Domínio.... + +label.action.delete.firewall.processing=Removendo Firewall.... +label.action.delete.firewall=Remover Firewall +label.action.delete.ingress.rule.processing=Removendo Regra de Entrada.... +label.action.delete.ingress.rule=Remover Regra de Entrada +label.action.delete.load.balancer.processing=Removendo Load Balancer.... +label.action.delete.load.balancer=Remover Load Balancer +label.action.edit.network.processing=Editarando Rede.... +label.action.edit.network=Editar Rede +label.action.delete.network.processing=Removendo Rede.... +label.action.delete.network=Remover Rede +label.action.delete.pod.processing=Removendo POD.... +label.action.delete.pod=Remover POD +label.action.delete.primary.storage.processing=Removendo Storage Primário.... +label.action.delete.primary.storage=Remover Storage Primário +label.action.delete.secondary.storage.processing=Removendo Storage Secundário.... +label.action.delete.secondary.storage=Remover Storage Secundário +label.action.delete.security.group.processing=Removendo Security Group.... +label.action.delete.security.group=Remover Security Group +label.action.delete.service.offering.processing=Removendo Plano.... +label.action.delete.service.offering=Remover Plano +label.action.delete.snapshot.processing=Removendo Snapshot.... +label.action.delete.snapshot=Remover Snapshot +label.action.delete.template.processing=Removendo Template.... +label.action.delete.template=Remover Template +label.action.delete.user.processing=Removendo Usuário.... +label.action.delete.user=Remover Usuário +label.action.delete.volume.processing=Removendo Disco.... +label.action.delete.volume=Remover Disco +label.action.delete.zone.processing=Removendo Zona.... +label.action.delete.zone=Remover Zona +label.action.destroy.instance.processing=Apagando Cloud Server.... +label.action.destroy.instance=Apagar Cloud Server +label.action.destroy.systemvm.processing=Apagando VM de Sistema.... +label.action.destroy.systemvm=Apagar VM de Sistema +label.action.detach.disk.processing=Desplugando Disco.... +label.action.detach.disk=Desplugar Disco +label.action.detach.iso.processing=Desplugando ISO.... +label.action.detach.iso=Desplugar ISO +label.action.disable.account.processing=Desativando conta.... +label.action.disable.account=Desativar conta +label.action.disable.static.NAT.processing=Desativando NAT Estático.... +label.action.disable.static.NAT=Desativar NAT Estático +label.action.disable.user.processing=Desativando Usuário.... +label.action.disable.user=Desativar Usuário +label.action.download.ISO=Baixar ISO +label.action.download.template=Baixar Template +label.action.download.volume.processing=Baixando Disco.... +label.action.download.volume=Baixar Disco +label.action.edit.ISO=Editar ISO +label.action.edit.account=Editar conta +label.action.edit.disk.offering=Editar Oferta de Disco +label.action.edit.domain=Editar Domínio +label.action.edit.global.setting=Editar Configurações Globais +label.action.edit.instance=Editar Cloud Server +label.action.edit.network.offering=Editar Oferta de Rede +label.action.edit.pod=Editar Pod +label.action.edit.primary.storage=Editar Storage Primário +label.action.edit.resource.limits=Editar Limite de Recursos +label.action.edit.service.offering=Editar Plano +label.action.edit.template=Editar Template +label.action.edit.user=Editar Usuário +label.action.edit.zone=Editar Zona +label.action.enable.account.processing=Ativando conta.... +label.action.enable.account=Ativar conta +label.action.enable.maintenance.mode.processing=Ativando Modo de Manutenção.... +label.action.enable.maintenance.mode=Ativar Modo de Manutenção +label.action.enable.static.NAT.processing=Ativando NAT Estático.... +label.action.enable.static.NAT=Ativar NAT Estático +label.action.enable.user.processing=Ativando Usuário.... +label.action.enable.user=Ativar Usuário +label.action.force.reconnect.processing=Reconectando.... +label.action.force.reconnect=Force Reconnect +label.action.generate.keys.processing=Gerando Chaves.... +label.action.generate.keys=Gerar Chaves +label.action.lock.account.processing=Bloqueando conta.... +label.action.lock.account=Bloquear conta +label.action.migrate.instance=Migrar Cloud Server +label.action.migrate.instance.processing=Migrando Cloud Server... +label.action.reboot.instance.processing=Reiniciando Cloud Server... +label.action.reboot.instance=Reiniciar Cloud Server +label.action.reboot.router.processing=Reiniciando Roteador.... +label.action.reboot.router=Reiniciar Roteador +label.action.reboot.systemvm.processing=Reiniciando VM de Sistema.... +label.action.reboot.systemvm=Reiniciar VM de Sistema +label.action.recurring.snapshot=Snapshot Recorrente +label.action.release.ip.processing=Liberando IP.... +label.action.release.ip=Liberar IP +label.action.remove.host.processing=Removendo Host.... +label.action.remove.host=Remover Host +label.action.reset.password.processing=Recuperando a Senha.... +label.action.reset.password=Recuperar Senha +label.action.resource.limits=Limite de Recursos +label.action.restore.instance.processing=Restaurando Cloud Server... +label.action.restore.instance=Restaurar Cloud Server +label.action.start.instance.processing=Iniciando Cloud Server... +label.action.start.instance=Iniciar Cloud Server +label.action.start.router.processing=Iniciando Roteador.... +label.action.start.router=Iniciar Roteador +label.action.start.systemvm.processing=Iniciando VM de Sistema.... +label.action.start.systemvm=Iniciar VM de Sistema +label.action.stop.instance.processing=Parando Cloud Server... +label.action.stop.instance=Parar Cloud Server +label.action.stop.router.processing=Parando Roteador.... +label.action.stop.router=Parar Roteador +label.action.stop.systemvm.processing=Parando VM de Sistema.... +label.action.stop.systemvm=Parar VM de Sistema +label.action.take.snapshot.processing=Tirando Snapshot.... +label.action.take.snapshot=Tirar Snapshot +label.action.update.OS.preference.processing=Atualizando Preferência de SO.... +label.action.update.OS.preference=Atualizar Preferência de SO +label.actions=Ações +label.active.sessions=Sessões Ativas +label.add.account=Adicionar Conta +label.add.by.cidr=Adicionar por CIDR +label.add.by.group=Adicionar por Grupo +label.add.cluster=Adicionar Cluster +label.add.direct.iprange=Add Direct Ip Range +label.add.disk.offering=Adicionar Oferta de Disco +label.add.domain=Adicionar Domínio +label.add.firewall=Adicionar Firewall +label.add.host=Adicionar Host +label.add.ingress.rule=Adicionar Regra de Entrada +label.add.ip.range=Adicionar Range de IP +label.add.iso=Adicionar ISO +label.add.load.balancer=Adicionar Load Balance +label.add.more=Adicionar Mais +label.add.network=Adicionar Rede +label.add.pod=Adicionar POD +label.add.primary.storage=Adicionar Storage Primário +label.add.secondary.storage=Adicionar Storage Secundário +label.add.security.group=Adicionar Security Group +label.add.service.offering=Adicionar Plano +label.add.system.service.offering=Adicionar Plano para VM de Sistema +label.add.template=Adicionar Template +label.add.user=Adicionar Usuário +label.add.vlan=Adicionar VLAN +label.add.volume=Adicionar Disco +label.add.zone=Adicionar Zona +label.add=Adicionar +label.adding.cluster=Adicionando Cluster +label.adding.failed=Falha ao Adicionar +label.adding.pod=Adicionando POD +label.adding.processing=Adicionando.... +label.adding.succeeded=Adicionado com Sucesso +label.adding.user=Adicionando Usuário +label.adding.zone=Adicionando Zona +label.adding=Adicionando +label.additional.networks=Redes Adicionais +label.admin.accounts=Contas Administrativas +label.admin=Administrador +label.advanced.mode=Modo Avançado +label.advanced.search=Busca Avançada +label.advanced=Avançado +label.alert=Alerta +label.algorithm=Algoritmo +label.allocated=Alocado +label.api.key=API Key +label.assign.to.load.balancer=Atribuindo o Cloud Server ao Load Balancer +label.assign=Atribuir +label.associated.network.id=ID de Rede Associado +label.attached.iso=Imagem ISO Plugada +label.availability.zone=Datacenter +label.availability=Availability +label.available.public.ips=IP Público Disponível +label.available=Disponível +label.back=Voltar +label.basic.mode=Modo Básico +label.bootable=Inicializável +label.broadcast.domain.type=Tipo de Domínio Broadcast +label.by.account=por Conta +label.by.availability=By Availability +label.by.domain=por Domínio +label.by.end.date=por Data Final +label.by.level=por Nível +label.by.pod=por Pod +label.by.role=por Função +label.by.start.date=por Data Inicial +label.by.state=por estado +label.by.traffic.type=por Tipo de Tráfego +label.by.type.id=por Tipo de ID +label.by.type=por Tipo +label.by.zone=por Zona +label.bytes.received=Bytes Recebidos +label.bytes.sent=Bytes Enviados +label.cancel=Cancelar +label.certificate=Certificado +label.privatekey=PKCS#8 Private Key +label.domain.suffix=Sufixo de Domínio DNS (ex. xyz.com) +label.character=Caracter +label.cidr.account=CIDR ou Conta/Security Group +label.close=Fechar +label.cloud.console=Console de Gerenciamento da Nuvem +label.cloud.managed=Cloud.com Managed +label.cluster.type=Tipo de Cluster +label.cluster=Cluster +label.code=Código +label.confirmation=Confirmação +label.cpu.allocated.for.VMs=CPU Alocada por VMs +label.cpu.allocated=CPU Alocada +label.cpu.mhz=CPU (em MHz) +label.cpu.utilized=CPU Utilizada +label.cpu=CPU +label.created=Criado +label.cross.zones=Inter Zonas +label.custom.disk.size=Tamanho Customizado +label.daily=Diário +label.data.disk.offering=Oferta de Disco Adicional +label.date=Data +label.day.of.month=Dia do Mês +label.day.of.week=Dia da Semana +label.delete=Remover +label.deleting.failed=Falha ao remover +label.deleting.processing=Removendo.... +label.description=Descrição +label.detaching.disk=Desplugando Disco +label.details=Detalhes +label.device.id=ID do Dispositivo +label.disabled=Desativado +label.disabling.vpn.access=Desativando Acesso VPN +label.disk.allocated=Disco Alocado +label.disk.offering=Oferta de Disco +label.disk.size.gb=Tamanho (em GB) +label.disk.size=Tamanho do Disco +label.disk.total=Disco Total +label.disk.volume=Disco +label.display.text=Descrição +label.dns.1=DNS 1 +label.dns.2=DNS 2 +label.domain.admin=Administrador de Domínio +label.domain.id=ID do Domínio +label.domain.name=Nome do Domínio +label.domain=Domínio +label.double.quotes.are.not.allowed=Aspas duplas não são permitidas +label.download.progress=Status do Download +label.edit=Editar +label.email=Email +label.enabling.vpn.access=Ativando Acesso VPN +label.enabling.vpn=Ativando VPN +label.end.port=Porta Final +label.endpoint.or.operation=Endpoint or Operation +label.error.code=Código de Erro +label.error=Erro +label.esx.host=ESX/ESXi Host +label.example=Examplo +label.failed=Falhou +label.featured=Featured +label.firewall=Firewall +label.first.name=Primeiro Nome +label.format=Formato +label.friday=Sexta-feira +label.full=Full +label.gateway=Gateway +label.general.alerts=Alertas Gerais +label.generating.url=Criando URL +label.generating.url=Criando URL +label.go.step.2=Vá para passo 2 +label.go.step.3=Vá para passo 3 +label.go.step.4=Vá para passo 4 +label.go.step.5=Vá para passo 5 +label.group.optional=Grupo (Opcional) +label.group=Grupo +label.guest.cidr=CIDR de rede Convidado +label.guest.gateway=Gateway de rede Convidado +label.guest.ip.range=Intervalo de rede convidado +label.guest.ip=Endereço IP Convidado +label.guest.netmask=Máscara de rede Convidado +label.ha.enabled=HA Ativado +label.help=Ajuda +label.host.alerts=Alertas de Host +label.host.name=Nome do Host +label.host=Host +label.hosts=Hosts +label.hourly=A cada hora +label.hypervisor.type=Tipo do Hypervisor +label.hypervisor=Hypervisor +label.id=ID +label.info=Info +label.ingress.rule=Regra de Entrada +label.initiated.by=Iniciado por +label.instance.limits=Limites do Cloud Server +label.instance.name=Nome do Cloud Server +label.instance=Cloud Server +label.instances=Cloud Servers +label.internal.dns.1=DNS 1 Interno +label.internal.dns.2=DNS 2 Interno +label.interval.type=Tipo de Intervalo +label.invalid.integer=Invalid Integer +label.invalid.number=Número Inválido +label.ip.address=Endereço IP +label.ip.allocations=Alocações de IP +label.ip.limits=Limites de IP Público +label.ip.or.fqdn=IP ou FQDN +label.ip.range=Range de IP +label.ip=IP +label.ips=IPs +label.is.default=Ã\u0089 Padrão +label.is.shared=Ã\u0089 Compartilhado +label.is.system=Ã\u0089 Sistema +label.iscsi=iSCSI +label.iso.boot=ISO de Boot +label.iso=ISO +label.isolation.mode=Modo Isolado +label.keep=Manter +label.lang.chinese=Chinese (Simplified) +label.lang.english=English +label.lang.japanese=Japanese +label.lang.spanish=Spanish +label.last.disconnected=Last Disconnected +label.last.name=Ã\u009altimo Nome +label.level=Nível +label.linklocal.ip=Endereço IP Link Local +label.load.balancer=Load Balancer +label.loading=Carregando +label.local=Local +label.login=Entrar +label.logout=Sair +label.lun=LUN +label.manage=Gerenciar +label.maximum=Máximo +label.memory.allocated=Memória Alocada +label.memory.mb=Memória (em MB) +label.memory.total=Memória Total +label.memory.used=Memória Usada +label.memory=Memória +label.menu.accounts=Contas +label.menu.alerts=Alertas +label.menu.all.accounts=Todas as Contas +label.menu.all.instances=Todos Cloud Servers +label.menu.community.isos=ISOs Públicas +label.menu.community.templates=Templates Públicos +label.menu.configuration=Configuração +label.menu.dashboard=Dashboard +label.menu.destroyed.instances=Cloud Servers Apagados +label.menu.disk.offerings=Oferta de Discos +label.menu.domains=Domínios +label.menu.events=Eventos +label.menu.featured.isos=ISOs Customizada +label.menu.featured.templates=Templates Customizados +label.menu.global.settings=Configurações Globais +label.menu.instances=Cloud Servers +label.menu.ipaddresses=Endereço IP +label.menu.isos=ISOs +label.menu.my.accounts=Minhas Contas +label.menu.my.instances=Meus Cloud Servers +label.menu.my.isos=Minhas ISOs +label.menu.my.templates=Meus Templates +label.menu.network.offerings=Oferta de Rede +label.menu.network=Rede +label.menu.physical.resources=Recursos Físicos +label.menu.running.instances=Cloud Servers Rodando +label.menu.security.groups=Security Groups +label.menu.service.offerings=Planos +label.menu.system.service.offerings=System Service Offering +label.menu.snapshots=Snapshots +label.menu.stopped.instances=Cloud Servers Parados +label.menu.storage=Storage +label.menu.system.vms=VM de Sistema +label.menu.system=Sistema +label.menu.templates=Templates +label.menu.virtual.appliances=Appliance Virtual +label.menu.virtual.resources=Recursos Virtuais +label.menu.volumes=Discos +label.migrate.instance.to=Migrar Cloud Server para +label.minimum=Mínimo +label.minute.past.hour=Minute(s) Past the Hour +label.monday=Segunda +label.monthly=Mensal +label.more.templates=Mais Templates +label.my.account=Minha Conta +label.name.optional=Nome (Opcional) +label.name=Nome +label.netmask=Másrca de Rede +label.network.desc=Descrição de Rede +label.network.domain=Domínio de Rede +label.network.id=ID de Rede +label.network.name=Nome de Rede +label.network.offering.display.text=Network Offering Display Text +label.network.offering.id=Network Offering ID +label.network.offering.name=Network Offering Name +label.network.offering=Network Offering +label.network.rate=Taxa de Transferência +label.network.read=Network Read +label.network.type=Tipo de Rede +label.network.write=Network Write +label.network=Rede +label.new.password=Nova Senha +label.next=Próximo +label.nfs.server=Servidor NFS +label.nfs.storage=Storage NFS +label.nfs=NFS +label.nics=REDE +label.no.actions=Sem Ações Disponíveis +label.no.alerts=Sem Alertas Recentes +label.no.errors=Sem Erros Recentes +label.no.isos=Sem ISO Disponível +label.no.items=Sem Ã\u008dtens Disponíveis +label.no.security.groups=Sem Security Groups Disponíveis +label.no.thanks=Não, Obrigado +label.no=Não +label.none=Nenhum +label.not.found=Não Encontrado +label.num.cpu.cores=# de Core CPU +label.numretries = Número de Tentativas +label.offer.ha=Offer HA +label.optional=Opcional +label.os.preference=Preferência de SO +label.os.type=Tipo de SO +label.owned.public.ips=IP Público Utilizado +label.owner.account=Dono da Conta +label.owner.domain=Dono do Domínio +label.parent.domain=Domínio Principal +label.password.enabled=Senha Ativada +label.password=Senha +label.path=Caminho (Path) +label.please.wait=Por Favor Aguarde +label.pod=POD +label.port.forwarding=Encaminhamento de Porta +label.port.range=Range de Porta +label.prev=Prev +label.primary.allocated=Alocação do Storage Primário +label.primary.network=Rede Primária +label.primary.storage=Storage Primário +label.primary.used=Uso do Storage Primário +label.private.interface=Interface Privada +label.private.ip.range=Range de IP Privado +label.private.ip=Endereço IP Privado +label.private.ips=IPs Privados +label.private.port=Porta Privada +label.private.zone=Zona Privada +label.protocol=Protocolo +label.protocol=Protocolo +label.public.interface=Interface Pública +label.public.ip=Endereço IP Público +label.public.ips=IPs Públicos +label.public.port=Porta Pública +label.public.zone=Zona Pública +label.public=Público +label.recent.errors=Erros Recentes +label.refresh=Atualizar +label.related=Relacionado +label.remove.from.load.balancer=Removendo Cloud Server do Load Balancer +label.removing.user=Removendo Usuário +label.required=Requerido +label.reserved.system.ip=IP de Sistema Reservado +label.resource.limits=Limite de Recursos +label.resource=Recurso +label.resources=Recursos +label.role=Função +label.root.disk.offering=Oferta de Disco ROOT +label.running.vms=VMs Rodando +label.saturday=Sábado +label.save=Salvar +label.saving.processing=Salvando.... +label.scope=Escopo +label.search=Pesquisar +label.secondary.storage=Storage Secundário +label.secondary.used=Uso do Storage Secundário +label.secret.key=Chave Secreta +label.security.group.name=Nome do Security Group +label.security.group=Security Group +label.security.groups.enabled=Security Groups Ativado +label.security.groups=Security Groups +label.sent=Enviado +label.server=Servidor +label.service.offering=Plano +label.system.service.offering=System Service Offering +label.session.expired=Sessão Expirada +label.shared=Compatilhado +label.size=Tamanho +label.snapshot.limits=Limites de Snapshot +label.snapshot.name=Nome do Snapshot +label.snapshot.s=Snapshot (s) +label.snapshot.schedule=Agenda de Snapshot +label.snapshot=Snapshot +label.snapshots=Snapshots +label.source.nat=Source NAT +label.specify.vlan=Especificar VLAN +label.start.port=Porta de Início +label.state=Estado +label.static.nat.to=NAT Estático para +label.static.nat=NAT Estático +label.statistics=Estatísticas +label.status=Estado +label.step.1.title=Passo 1\: Selecione o Template +label.step.1=Passo 1 +label.step.2.title=Passo 2\: Plano +label.step.2=Passo 2 +label.step.3.title=Passo 3\: Selecione o Disco Adicional +label.step.3=Passo 3 +label.step.4.title=Passo 4\: Rede +label.step.4=Passo 4 +label.step.5.title=Passo 5\: Revisar +label.step.5=Passo 5 +label.stopped.vms=VMs Paradas +label.storage.type=Tipo de Storage +label.storage=Storage +label.submit=Enviar +label.submitted.by=[Enviado por\: ] +label.succeeded=Sucedido +label.sunday=Domingo +label.system.capacity=Capacidade Geral +label.system.vm.type=Tipo de VM de Sistema +label.system.vm.type=Tipo de VM de Sistema +label.system.vm=VM de Sistema +label.system.vms=VM de Sistemas +label.tagged=Tagged +label.tags=Tags +label.target.iqn=Target IQN +label.template.limits=Limites do Template +label.template=Template +label.theme.default=Tema Padrão +label.theme.grey=Custom - Grey +label.theme.lightblue=Custom - Light Blue +label.thursday=Quinta +label.time.zone=Fuso Horário +label.time=Time +label.timeout.in.second = Timeout(segundos) +label.timezone=Fuso Horário +label.total.cpu=CPU TOTAL +label.total.vms=Total VMs +label.traffic.type=Tipo de Tráfego +label.tuesday=Terça +label.type.id=Tipo do ID +label.type=Tipo +label.unavailable=Indisponível +label.unlimited=Ilimitado +label.untagged=Não Marcado +label.update.ssl.cert=Atualizar Certificado SSL +label.update.ssl=Atualizar Certificado SSL +label.updating=Atualizando +label.url=URL +label.usage.interface=Usage Interface +label.used=Usado +label.user=Usuário +label.username=Nome de Usuário +label.users=Usuários +label.value=Valor +label.vcenter.cluster=vCenter Cluster +label.vcenter.datacenter=vCenter Datacenter +label.vcenter.datastore=vCenter Datastore +label.vcenter.host=vCenter Host +label.vcenter.password=vCenter Password +label.vcenter.username=vCenter Username +label.version=Versão +label.virtual.appliance=Appliance Virtual +label.virtual.appliances=Appliances Virtuais +label.virtual.network=Rede Virtual +label.vlan.id=VLAN ID +label.vlan.range=Intervalo de VLAN +label.vlan=VLAN +label.vm.add=Adicionar Cloud Server +label.vm.destroy=Apagar +label.vm.reboot=Reiniciar +label.vm.start=Iniciar +label.vm.stop=Parar +label.vmfs=VMFS +label.vms=VMs +label.volume.limits=Limites de Disco +label.volume.name=Nome do Disco +label.volume=Disco +label.volumes=Discos +label.vpn=VPN +label.vsphere.managed=vSphere Managed +label.waiting=Aguardando +label.warn=Avisar +label.wednesday=Quarta-Feira +label.weekly=Semanal +label.welcome.cloud.console=Painel de Controle +label.welcome=Bem-Vindo +label.yes=Sim +label.zone.id=ID da Zona +label.zone.step.1.title=Passo 1\: Selecionar a Rede +label.zone.step.2.title=Passo 2\: Adicionar a Zona +label.zone.step.3.title=Passo 3\: Adicionar o POD +label.zone.step.4.title=Passo 4\: Adicionar um Intervalo de IP +label.zone.wide=Zone-Wide +label.zone=Zona + +#Messages +message.acquire.public.ip=Selecione a zona de onde você deseja adquirir o novo IP +message.action.cancel.maintenance.mode=Confirme que você deseja cancelar esta manutenção +message.action.cancel.maintenance=A manutenção do seu HOST foi cancelada com sucesso +message.action.delete.ISO.for.all.zones=Esta ISO é usada por todas as Zonas. Confirme se você deseja excluir a ISO de todas as Zonas +message.action.delete.ISO=Confirme que você deseja excluir esta ISO +message.action.delete.cluster=Confirme que você deseja excluir este HOST +message.action.delete.disk.offering=Confirme que você deseja excluir esta oferta de disco +message.action.delete.domain=Confirme que você deseja excluir este domínio +message.action.delete.external.firewall=Confirme que você gostaria de remover este Firewall externo. Aviso\: Se você está planejando adicionar novamente este mesmo Firewall, é necessário apagar os contadores do dispositivo. +message.action.delete.external.load.balancer=Confirme que você gostaria de remover este Load Balancer Externo. Aviso\: Se você está planejando adicionar novamente este mesmo Load Balancer, é necessário apagar os contadores do dispositivo. +message.action.delete.ingress.rule=Confirme que você deseja excluir esta regra de entrada. +message.action.delete.network=Confirme que você deseja remover esta rede. +message.action.delete.pod=Confirme que você deseja remover este POD. +message.action.delete.primary.storage=Confirme que você deseja remover este Storage Primário. +message.action.delete.secondary.storage=Confirme que você deseja remover este Storage Secundário. +message.action.delete.security.group=Confirme que você deseja remover este Security Group. +message.action.delete.service.offering=Confirme que você deseja remover este Plano. +message.action.delete.snapshot=Confirme que você deseja remover este Snapshot. +message.action.delete.template.for.all.zones=Este Template é usado por todas as zonas. Confirme que você deseja remover o Template de todas as zonas. +message.action.delete.template=Confirme que você deseja remover este Template. +message.action.delete.volume=Confirme que você deseja remover este Disco. +message.action.delete.zone=Confirme que você deseja remover esta Zona. +message.action.destroy.instance=Confirme que você deseja excluir este Cloud Server. +message.action.destroy.systemvm=Confirme que você deseja excluir esta VM de Sistema. +message.action.disable.static.NAT=Confirme que você deseja desativar o NAT estático. +message.action.enable.maintenance=O Host foi preparado com sucesso para manutenção. Este processo poderá levar alguns minutos ou mais dependendo do número de VMs hospedadas neste Host. +message.action.force.reconnect=O procedimento de reconexão forçada foi preparado com sucesso. Este processo poderá levar alguns minutos. +message.action.force.reconnect=O procedimento de reconexão forçada foi preparado com sucesso. Este processo poderá levar alguns minutos. +message.action.host.enable.maintenance.mode=Ativar o modo de manutenção irá causar o live migration de todos Cloud Server hospedados neste Host para o próximo disponível. +message.action.instance.reset.password=Confirme que você deseja trocar a senha de ROOT para este Cloud Server. +message.action.primarystorage.enable.maintenance.mode=Aviso\: Colocar o Storage primário em modo de manutenção irá causar a parada de todas as VMs hospedadas nesta unidade. Deseja continuar? +message.action.reboot.instance=Confirme que você deseja reiniciar este Cloud Server. +message.action.reboot.router=Confirme que você deseja reiniciar este roteador. +message.action.reboot.systemvm=Confirme que você deseja reiniciar esta VM de sistema. +message.action.release.ip=Confirme que você deseja liberar este IP. +message.action.remove.host=Remover o único/último host do cluster e reinstalar o host irá provocar a perda do ambiente/banco do host tornando os Cloud Servers inutilizáveis. +message.action.restore.instance=Confirme que você deseja restaurar este Cloud Server. +message.action.start.instance=Confirme que você deseja iniciar este Cloud Server. +message.action.start.router=Confirme que você deseja inciar este roteador. +message.action.start.systemvm=Confirme que você deseja iniciar esta VM de sistema. +message.action.stop.instance=Confirme que você deseja parar este Cloud Server. +message.action.stop.router=Confirme que você deseja parar este roteador. +message.action.stop.systemvm=Confirme que você deseja parar esta VM de Sistema. +message.action.take.snapshot=Confirme que você deseja gerar um Snapshot. +message.add.cluster.zone=Add a hypervisor managed cluster for zone +message.add.cluster=Add a hypervisor managed cluster for zone , pod +message.add.disk.offering=Especifique o seguintes parâmetros para adicionar uma nova oferta de disco. +message.add.firewall=Adicionar Firewall à zona. +message.add.host=Especifique os seguintes parâmetros para adicionar um novo host. +message.add.ip.range.direct.network=Add an IP range to direct network in zone +message.add.ip.range.to.pod=

Add an IP range to pod\:

+message.add.ip.range=Add an IP range to public network in zone +message.add.load.balancer=Add a load balancer to zone +message.add.network=Add a new network for zone\: +message.add.pod=Add a new pod for zone +message.add.primary.storage=Adicionar novo Storage primário à zona , pod +message.add.primary=Especifique os seguintes parâmetros para adicionar um novo Storage primário. +message.add.secondary.storage=Add a new storage for zone +message.add.service.offering=Preencha os seguintes dados para adicionar um novo plano. +message.add.template=Entre com os dados para criar um novo template. +message.add.volume=Entre com os dados para criar um novo disco. +message.additional.networks.desc=Selecione a(s) rede(s) adicionais que seu Cloud Server terá acesso. +message.advanced.mode.desc=Escolhe este modelo de rede se deseja ter habilitar o suporte a VLAN. Este modelo permite maior flexibilidade ao administrador ao permitir ofertas de rede customizada, firewall, vpn ou load balancer bem como acesso via rede virtual ou acesso direto. +message.advanced.security.group=Escolha esta opção se desejar utilizar Security Groups para isolamento das VMs guest. +message.advanced.virtual=Escolha esta opção se desejar utilizar VLANs para isolamento das VMs guest. +message.allow.vpn.access=Entre com nome de usuário e senha do usuário que terá acesso VPN. +message.attach.iso.confirm=Confirme que você deseja conectar a ISO ao Cloud Server. +message.attach.volume=Preencha os seguintes dados para conectar o novo disco. Se você está conectando um disco a um Cloud Server Windows, será necessário reiniciar o Cloud Server para visualizar o novo disco. +message.basic.mode.desc=Escolha este modelo de rede se você *não* quer suporte a VLAN. Todo Cloud Server criado neste modelo de rede estará ligado diretamente a um IP da rede e será usado Security Groups para prover segurança e separação. +message.change.offering.confirm=Confirme que você deseja mudar o plano deste Cloud Server. +message.copy.iso.confirm=Confirme se você deseja copiar a ISO para +message.copy.template=Copiar template XXX da zona para +message.create.template.vm=Criar VM do template +message.create.template.volume=Especifique as seguintes informações antes de criar o template a partir do disco\: . A criação de um template a partir de um disco pode levar alguns minutos ou mais dependendo do tamnho do disco. +message.delete.account=Confirme se você deseja excluir esta conta. +message.detach.iso.confirm=Confirme se você deseja desconectar a ISO do Cloud Server. +message.disable.account=Confirme se você deseja desativar a conta. Desativando a conta, todos os usuários desta conta não poderão acessar seus recursos na nuvem. Todos Cloud Server serão automaticamente desligados. +message.disable.vpn.access=Confirme se você deseja desativar o acesso VPN. +message.download.ISO=Clique 00000 para baixar a ISO +message.download.template=Clique 00000 para baixar o template +message.download.volume=Clique 00000 para baixar o disco +message.edit.confirm=Confira as alterações antes de clicar em 'Salvar'. +message.edit.limits=Especifique os limites para os seguintes recursos. "-1" indica sem limite para o total de recursos criados. +message.enable.account=Confirme se você deseja ativar a conta. +message.enable.vpn.access=VPN está desativada para este endereço IP. Gostaria de ativar o acesso VPN? +message.enable.vpn=Acesso VPN não está ativado. Por favor clique aqui para ativar a VPN. +message.enabled.vpn.ip.sec=Sua chave IPSec (pre-shared) é +message.enabled.vpn=Seu acesso VPN está ativado e pode ser acessado através do IP +message.launch.vm.on.private.network=Você deseja carregar seu Cloud Server na sua rede privada dedicada? +message.lock.account=Confirme se você deseja bloquear esta conta. Bloqueando a conta, todos os usuários desta conta não estarão mais habilitados a gerenciar os recursos na nuvem. Os recursos existentes (Cloud Server) ainda poderão ser acessados. +message.migrate.instance.confirm=Confirme o host que você deseja migrar o Cloud Server. +message.new.user=Especifique a seguir para adicionar um novo usuário na conta +message.no.network.support.configuration.not.true=Você não possui nenhuma zona com Security Group ativado. Assim, sem recursos de rede adicionais. Por favor vá para o passo 5. +message.no.network.support=O hypervisor escolhido, vSphere, não possui nenhum recurso de rede adicional. Por favor, vá para o passo 5. +message.number.clusters=

Clusters

+message.number.hosts=

Hosts

+message.number.pods=

PODs

+message.number.storage=

Volumes do Storage Primário

+message.number.zones=

Zonas

+message.remove.vpn.access=Confirme se você deseja remover acesso VPN do seguinte usuário. +message.restart.mgmt.server=Reinicie o(s) servidor(es) de gerenciamento para que a nova configuração tenha efeito. +message.security.group.usage=(Use Ctrl-clique para selecionar todos os Security Groups) +message.snapshot.schedule=Você pode configurar Snapshots recorrentes agendados selecionando as opções disponíveis abaixo +message.step.1.continue=Selecione o template ou ISO para continuar +message.step.1.desc=Selecione o template para o novo Cloud Server. +message.step.2.continue=Selecione o plano +message.step.2.desc= +message.step.3.continue=Seleciona a oferta de disco +message.step.3.desc= +message.step.4.continue=Selecione pelo menos uma rede para continuar +message.step.4.desc=Selecione a rede principal que seu Cloud Server será conectado. +message.update.os.preference=Escolha o SO de preferencia para este host. Todos Cloud Server com preferencias similares serão alocados neste host antes de tentar em outro. +message.update.ssl=Envie o novo certificado SSL X.509 para ser atualizado em cada console proxy\: +message.virtual.network.desc=Rede virtual dedicado para sua conta. O domínio de broadcast está na VLAN e todo acesso a internet é roteado através do virtual router. +message.volume.create.template.confirm=Confirme se você deseja criar um template a partir deste disco. A criação do template pode levar alguns minutos ou mais dependendo do tamanho do disco. +message.zone.step.1.desc=Seleciona o modelo de rede para a zona. +message.zone.step.2.desc=Entre com as informações a seguir para adicionar a nova zona +message.zone.step.3.desc=Entre com as informações a seguir para adicionar o novo POD +message.apply.snapshot.policy=Você atualizou com sucesso sua política de Snapshot. +message.disable.snapshot.policy=Você desativou com sucesso sua política de Snapshot. +message.action.change.service.warning.for.instance=Para troca de plano é necessário parar o Cloud Server. +message.action.change.service.warning.for.router=O roteador precisa ser desligado antes de trocar o plano/tamanho. +message.action.reset.password.warning=Para recuperar a senha é necessário parar o Cloud Server. +message.action.reset.password.off=Seu Cloud Server não suporta esta funcionalidade. + +#Errors +error.login=Usuário ou senha inválido. +error.menu.select=Impossível executar ação. Selecionar um ou mais itens. +error.mgmt.server.inaccessible=O servidor de gerenciamento está inacessível. Tente novamente mais tarde. +error.session.expired=Sua sessão expirou. +error.unresolved.internet.name=Impossível resolver DNS From 6e96d6892e0c0c9e495557bbb586e46d9b1c4ae6 Mon Sep 17 00:00:00 2001 From: kishan Date: Thu, 19 Jan 2012 12:05:52 +0530 Subject: [PATCH 18/30] Bug 12072: Add premium configs if they do not exist. Upgrades from OSS will be missing there configs. Status 12072: resolved fixed Reviewed-By: Nitin --- setup/db/db/schema-2213to2214.sql | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/setup/db/db/schema-2213to2214.sql b/setup/db/db/schema-2213to2214.sql index 8c3c1f0124f..c1fd41c5d3b 100644 --- a/setup/db/db/schema-2213to2214.sql +++ b/setup/db/db/schema-2213to2214.sql @@ -26,3 +26,11 @@ INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Storage', 'DEFAULT', 'UserVm INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Storage', 'DEFAULT', 'UserVmManager', 'create.private.template.from.volume.wait', '10800', 'In second, timeout for CreatePrivateTemplateFromVolumeCommand'); INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Storage', 'DEFAULT', 'StorageManager', 'create.volume.from.snapshot.wait', '10800', 'In second, timeout for create template from snapshot'); INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Storage', 'DEFAULT', 'TemplateManager', 'primary.storage.download.wait', '10800', 'In second, timeout for download template to primary storage'); + +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Premium', 'DEFAULT', 'management-server', 'usage.execution.timezone', null, 'The timezone to use for usage job execution time'); +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Premium', 'DEFAULT', 'management-server', 'usage.stats.job.aggregation.range', '1440', 'The range of time for aggregating the user statistics specified in minutes (e.g. 1440 for daily, 60 for hourly.'); +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Premium', 'DEFAULT', 'management-server', 'usage.stats.job.exec.time', '00:15', 'The time at which the usage statistics aggregation job will run as an HH24:MM time, e.g. 00:30 to run at 12:30am.'); +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Premium', 'DEFAULT', 'management-server', 'enable.usage.server', 'true', 'Flag for enabling usage'); +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Premium', 'DEFAULT', 'management-server', 'direct.network.stats.interval', '86400', 'Interval (in seconds) to collect stats from Traffic Monitor'); +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Premium', 'DEFAULT', 'management-server', 'usage.sanity.check.interval', null, 'Interval (in days) to check sanity of usage data'); +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Premium', 'DEFAULT', 'management-server', 'usage.aggregation.timezone', 'GMT', 'The timezone to use for usage stats aggregation'); From 09e0fa09629d9b904d27285228d0b7c79262f6c9 Mon Sep 17 00:00:00 2001 From: Nitin Mehta Date: Thu, 19 Jan 2012 15:27:57 +0530 Subject: [PATCH 19/30] Bug 13027: ListIsos shouldnt display isos that are not dowloaded when asked for only ready templates. Status 13027: resolved fixed Reviewed-By: Kishan --- api/src/com/cloud/api/commands/ListIsosCmd.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/src/com/cloud/api/commands/ListIsosCmd.java b/api/src/com/cloud/api/commands/ListIsosCmd.java index d28923bfb0b..c43c4db865e 100755 --- a/api/src/com/cloud/api/commands/ListIsosCmd.java +++ b/api/src/com/cloud/api/commands/ListIsosCmd.java @@ -127,11 +127,11 @@ public class ListIsosCmd extends BaseListCmd { public boolean listInReadyState() { Account account = UserContext.current().getCaller(); // It is account specific if account is admin type and domainId and accountName are not null - boolean isAccountSpecific = (account == null || isAdmin(account.getType())) && (getAccountName() != null) && (getDomainId() != null); + //boolean isAccountSpecific = (account == null || isAdmin(account.getType())) && (getAccountName() != null) && (getDomainId() != null); // Show only those that are downloaded. TemplateFilter templateFilter = TemplateFilter.valueOf(getIsoFilter()); boolean onlyReady = (templateFilter == TemplateFilter.featured) || (templateFilter == TemplateFilter.selfexecutable) || (templateFilter == TemplateFilter.sharedexecutable) - || (templateFilter == TemplateFilter.executable && isAccountSpecific) || (templateFilter == TemplateFilter.community); + || (templateFilter == TemplateFilter.executable) || (templateFilter == TemplateFilter.community); return onlyReady; } From 7fd7a4ae58711a82fee806aca829120fcda402fa Mon Sep 17 00:00:00 2001 From: Naredula Janardhana Reddy Date: Thu, 19 Jan 2012 20:18:46 +0530 Subject: [PATCH 20/30] Bug 12808: Summary of changes: - Mutiple routing table for each public interface is added (previously there is only one routing table ). when the packet is send out of public interface corresponding per-interface routing table will be used. per-interface routing table will modified when ever ip/interface added/deleted. - New parameter is added to ipassoc command to include the default gateway for every interface/ip. prevously it is using only one public interface to send out, default gateway is obtained at the boot up time. - In the DNAT case. In the revese path(from guest vm to outside, or when DNAT packet receives from the eth0) the public ip/source ip will not be available till POSTROUTING. to overcome this, DNAT connection are marked with routing table number at the time of connection creation, in the reverse path the routing table# from DNAT connection is used to detect per-interface routing table. --- .../VirtualRoutingResource.java | 3 + .../vmware/resource/VmwareResource.java | 5 +- .../xen/resource/CitrixResourceBase.java | 3 + .../config/etc/iptables/iptables-router | 4 + .../systemvm/debian/config/root/firewall.sh | 6 ++ .../systemvm/debian/config/root/ipassoc.sh | 76 ++++++++++++++++++- 6 files changed, 94 insertions(+), 3 deletions(-) diff --git a/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java b/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java index cf11a75a8b2..ff467db2190 100755 --- a/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java +++ b/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java @@ -594,6 +594,9 @@ public class VirtualRoutingResource implements Manager { String publicNic = "eth" + nicNum; command.add("-c", publicNic); + + command.add("-g", vlanGateway); + return command.execute(); } diff --git a/core/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/core/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java index f8be5a7691d..2c6380160f5 100755 --- a/core/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java +++ b/core/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java @@ -740,7 +740,10 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa } args += " -c "; - args += "eth" + publicNicInfo.first(); + args += "eth" + publicNicInfo.first(); + + args += " -g "; + args += vlanGateway; if (s_logger.isDebugEnabled()) { s_logger.debug("Run command on domain router " + privateIpAddress + ", /root/ipassoc.sh " + args); diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index 433ae3ed6fe..70b3beb90ee 100755 --- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -1599,6 +1599,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe args += " -c "; args += "eth" + correctVif.getDevice(conn); + args += " -g "; + args += vlanGateway; + String result = callHostPlugin(conn, "vmops", "ipassoc", "args", args); if (result == null || result.isEmpty()) { diff --git a/patches/systemvm/debian/config/etc/iptables/iptables-router b/patches/systemvm/debian/config/etc/iptables/iptables-router index 9b56209159e..f50eebe584f 100644 --- a/patches/systemvm/debian/config/etc/iptables/iptables-router +++ b/patches/systemvm/debian/config/etc/iptables/iptables-router @@ -23,4 +23,8 @@ COMMIT -A FORWARD -i eth0 -o eth2 -j ACCEPT -A FORWARD -i eth2 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT COMMIT +*mangle +-A PREROUTING -m state --state ESTABLISHED,RELATED -j CONNMARK --restore-mark +COMMIT + diff --git a/patches/systemvm/debian/config/root/firewall.sh b/patches/systemvm/debian/config/root/firewall.sh index d16e539a862..9bc72869eb3 100755 --- a/patches/systemvm/debian/config/root/firewall.sh +++ b/patches/systemvm/debian/config/root/firewall.sh @@ -62,6 +62,7 @@ tcp_or_udp_entry() { local op=$5 local proto=$6 local cidrs=$7 + logger -t cloud "$(basename $0): creating port fwd entry for PAT: public ip=$publicIp \ instance ip=$instIp proto=$proto port=$port dport=$dport op=$op" @@ -70,11 +71,16 @@ tcp_or_udp_entry() { # the delete operation may have errored out but the only possible reason is # that the rules didn't exist in the first place local dev=$(ip_to_dev $publicIp) + local tableNo=$(echo $dev | awk -F'eth' '{print $2}') # shortcircuit the process if error and it is an append operation # continue if it is delete (sudo iptables -t nat $op PREROUTING --proto $proto -i $dev -d $publicIp \ --destination-port $port -j DNAT \ --to-destination $instIp:$dport &>> $OUTFILE || [ "$op" == "-D" ]) && + (sudo iptables -t mangle $op PREROUTING --proto $proto -i $dev -d $publicIp \ + --destination-port $port -j MARK --set-mark $tableNo) && + (sudo iptables -t mangle $op PREROUTING --proto $proto -i $dev -d $publicIp \ + --destination-port $port -m state --state NEW -j CONNMARK --save-mark) && (sudo iptables -t nat $op OUTPUT --proto $proto -d $publicIp \ --destination-port $port -j DNAT \ --to-destination $instIp:$dport &>> $OUTFILE || [ "$op" == "-D" ]) && diff --git a/patches/systemvm/debian/config/root/ipassoc.sh b/patches/systemvm/debian/config/root/ipassoc.sh index 17278a3fd9b..5b7acc05622 100644 --- a/patches/systemvm/debian/config/root/ipassoc.sh +++ b/patches/systemvm/debian/config/root/ipassoc.sh @@ -137,6 +137,72 @@ convert_primary_to_32() { done } +remove_routing() { + local pubIp=$1 + local ipNoMask=$(echo $pubIp | awk -F'/' '{print $1}') + local mask=$(echo $pubIp | awk -F'/' '{print $2}') + local tableNo=$(echo $ethDev | awk -F'eth' '{print $2}') + + local tableName="Table_$ethDev" + local ethMask=$(ip route show | grep $ethDev | grep src | awk '{print $1}') + if [ "$ethMask" != "" ] + then +# rules and routes will be deleted for the last ip of the interface. + sudo ip route delete throw $ethMask table $tableName proto static + sudo ip rule delete from $ethMask table $tableName + sudo ip rule delete fwmark $tableNo table $tableName + sudo ip route flush cache + fi +} + +# copy eth0,eth1 and the current public interface +copy_routes_from_main() { + local tableName=$1 + +#get the network masks from the main table + local eth0Mask=$(ip route show | grep eth0 | grep src | awk '{print $1}') + local eth1Mask=$(ip route show | grep eth1 | grep src | awk '{print $1}') + local ethMask=$(ip route show | grep $ethDev | grep src | awk '{print $1}') + +# eth0,eth1 and other know routes will be skipped, so as main routing table will decide the route. This will be useful if the interface is down and up. + sudo ip route add throw $eth0Mask table $tableName proto static + sudo ip route add throw $eth1Mask table $tableName proto static + sudo ip route add throw $ethMask table $tableName proto static + return 0; +} + +add_routing() { + local pubIp=$1 + local ipNoMask=$(echo $1 | awk -F'/' '{print $1}') + local mask=$(echo $1 | awk -F'/' '{print $2}') + + local tableName="Table_$ethDev" + local tablePresent=$(grep $tableName /etc/iproute2/rt_tables) + local tableNo=$(echo $ethDev | awk -F'eth' '{print $2}') + if [ "$tablePresent" == "" ] + then + if [ "$tableNo" == ""] + then + return 0; + fi + echo "$tableNo $tableName" >> /etc/iproute2/rt_tables + fi + + copy_routes_from_main $tableName +# NOTE: this entry will be deleted if the interface is down without knowing to Management server, in that case all the outside traffic will be send through main routing table or it will be the first public NIC. + sudo ip route add default via $defaultGwIP table $tableName proto static + sudo ip route flush cache + + local ethMask=$(ip route show | grep $ethDev | grep src | awk '{print $1}') + local rulePresent=$(ip rule show | grep $ethMask) + if [ "$rulePresent" == "" ] + then +# rules will be added while adding the first ip of the interface + sudo ip rule add from $ethMask table $tableName + sudo ip rule add fwmark $tableNo table $tableName + fi + return 0; +} add_nat_entry() { local pubIp=$1 @@ -170,6 +236,7 @@ add_nat_entry() { sudo ip link set $ethDev up sudo arping -c 3 -I $ethDev -A -U -s $ipNoMask $ipNoMask; fi + add_routing $1 return 0 } @@ -185,6 +252,7 @@ del_nat_entry() { sudo iptables -t nat -D POSTROUTING -j SNAT -o $ethDev --to-source $ipNoMask; sudo ip addr del dev $ethDev "$ipNoMask/$mask" + remove_routing $1 if [ $? -gt 0 -a $? -ne 2 ] then return 1 @@ -208,7 +276,7 @@ add_an_ip () { sudo ip link set $ethDev up sudo arping -c 3 -I $ethDev -A -U -s $ipNoMask $ipNoMask; fi - + add_routing $1 return $? } @@ -239,6 +307,7 @@ remove_an_ip () { fi result=$? fi + remove_routing $1 if [ $result -gt 0 -a $result -ne 2 ] then return 1 @@ -271,7 +340,7 @@ then if_keep_state=1 fi -while getopts 'fADa:l:c:' OPTION +while getopts 'fADa:l:c:g:' OPTION do case $OPTION in A) Aflag=1 @@ -288,6 +357,9 @@ do c) cflag=1 ethDev="$OPTARG" ;; + g) gflag=1 + defaultGwIP="$OPTARG" + ;; ?) usage unlock_exit 2 $lock $locked ;; From ee1971526c14f1a20b6287ad7f48c19589e26621 Mon Sep 17 00:00:00 2001 From: Nitin Mehta Date: Thu, 19 Jan 2012 21:27:18 +0530 Subject: [PATCH 21/30] Bug 12897: Make updateHostPassword more robust. Allow only KVM's individual host password be changed and Xenserver cluster password be changed. For rest of the hypervisors throw an exception. Reviewed-By: Abhi --- .../api/commands/UpdateHostPasswordCmd.java | 4 ++-- .../cloud/server/ManagementServerImpl.java | 20 +++++++++++++------ 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/api/src/com/cloud/api/commands/UpdateHostPasswordCmd.java b/api/src/com/cloud/api/commands/UpdateHostPasswordCmd.java index b386d700d27..38b70b7744a 100644 --- a/api/src/com/cloud/api/commands/UpdateHostPasswordCmd.java +++ b/api/src/com/cloud/api/commands/UpdateHostPasswordCmd.java @@ -41,10 +41,10 @@ public class UpdateHostPasswordCmd extends BaseCmd { // ////////////// API parameters ///////////////////// // /////////////////////////////////////////////////// - @Parameter(name=ApiConstants.HOST_ID, type=CommandType.LONG, description="the host ID") + @Parameter(name=ApiConstants.HOST_ID, type=CommandType.LONG, description="the host ID. Either this parameter, or clusterId has to be passed in") private Long hostId; - @Parameter(name=ApiConstants.CLUSTER_ID, type=CommandType.LONG, description="the cluster ID for the host") + @Parameter(name=ApiConstants.CLUSTER_ID, type=CommandType.LONG, description="the cluster ID. Either this parameter, or hostId has to be passed in") private Long clusterId; @Parameter(name=ApiConstants.USERNAME, type=CommandType.STRING, required=true, description="the username for the host/cluster") diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 24b173310fe..db227f54316 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -4757,22 +4757,30 @@ public class ManagementServerImpl implements ManagementServer { @Override @DB public boolean updateHostPassword(UpdateHostPasswordCmd cmd) { - if (cmd.getClusterId() == null && cmd.getHostId() == null) { + if ( !((cmd.getClusterId() == null) ^ (cmd.getHostId() == null)) ) {//Using Xor operator here. throw new InvalidParameterValueException("You should provide one of cluster id or a host id."); } else if (cmd.getClusterId() == null) { - HostVO h = _hostDao.findById(cmd.getHostId()); - if (h.getHypervisorType() == HypervisorType.XenServer) { - throw new InvalidParameterValueException("You should provide cluster id for Xenserver cluster."); + HostVO host = _hostDao.findById(cmd.getHostId()); + if (host == null){ + throw new InvalidParameterValueException("The hostId " +cmd.getHostId()+ " doesnt exist"); + }if (host.getHypervisorType() != HypervisorType.KVM) { + throw new InvalidParameterValueException("This operation is not permitted for " + host.getHypervisorType() + " with the parameter hostId"); } - DetailVO nv = _detailsDao.findDetail(h.getId(), ApiConstants.USERNAME); + DetailVO nv = _detailsDao.findDetail(host.getId(), ApiConstants.USERNAME); if (nv.getValue().equals(cmd.getUsername())) { - DetailVO nvp = new DetailVO(h.getId(), ApiConstants.PASSWORD, cmd.getPassword()); + DetailVO nvp = new DetailVO(host.getId(), ApiConstants.PASSWORD, cmd.getPassword()); nvp.setValue(cmd.getPassword()); _detailsDao.persist(nvp); } else { throw new InvalidParameterValueException("The username is not under use by management server."); } } else { + ClusterVO cluster = _clusterDao.findById(cmd.getClusterId()); + if (cluster == null){ + throw new InvalidParameterValueException("The clusterId " +cmd.getClusterId()+ " doesnt exist"); + }if (cluster.getHypervisorType() != HypervisorType.XenServer){ + throw new InvalidParameterValueException("This operation is not permitted for " + cluster.getHypervisorType() + " with the parameter clusterId"); + } // get all the hosts in this cluster List hosts = _hostDao.listByCluster(cmd.getClusterId()); Transaction txn = Transaction.currentTxn(); From afc61710b02d24a0c5a7afe470c954bd11119594 Mon Sep 17 00:00:00 2001 From: Edison Su Date: Thu, 19 Jan 2012 15:18:17 -0800 Subject: [PATCH 22/30] windows use localtime and set timer as catchup --- .../computing/LibvirtComputingResource.java | 10 +++ .../resource/computing/LibvirtVMDef.java | 66 +++++++++++++++++++ 2 files changed, 76 insertions(+) diff --git a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java index b093ba3c91e..3c0b6b9580c 100644 --- a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java +++ b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java @@ -68,6 +68,7 @@ import org.libvirt.StoragePoolInfo; import org.libvirt.StorageVol; import org.libvirt.StorageVolInfo; + import com.cloud.agent.api.Answer; import com.cloud.agent.api.AttachIsoCommand; import com.cloud.agent.api.AttachVolumeAnswer; @@ -170,6 +171,7 @@ import com.cloud.agent.resource.computing.LibvirtVMDef.InterfaceDef; import com.cloud.agent.resource.computing.LibvirtVMDef.InterfaceDef.hostNicType; import com.cloud.agent.resource.computing.LibvirtVMDef.SerialDef; import com.cloud.agent.resource.computing.LibvirtVMDef.TermPolicy; +import com.cloud.agent.resource.computing.LibvirtVMDef.ClockDef; import com.cloud.agent.resource.virtualnetwork.VirtualRoutingResource; import com.cloud.dc.Vlan; import com.cloud.exception.InternalErrorException; @@ -2232,6 +2234,14 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv term.setPowerOffPolicy("destroy"); term.setRebootPolicy("restart"); vm.addComp(term); + + ClockDef clock = new ClockDef(); + if (vmTO.getOs().startsWith("Windows")) { + clock.setClockOffset(ClockDef.ClockOffset.LOCALTIME); + clock.setTimer("rtc", "catchup", null); + } + + vm.addComp(clock); DevicesDef devices = new DevicesDef(); devices.setEmulatorPath(_hypervisorPath); diff --git a/agent/src/com/cloud/agent/resource/computing/LibvirtVMDef.java b/agent/src/com/cloud/agent/resource/computing/LibvirtVMDef.java index 607385948cb..66a8bb380c6 100644 --- a/agent/src/com/cloud/agent/resource/computing/LibvirtVMDef.java +++ b/agent/src/com/cloud/agent/resource/computing/LibvirtVMDef.java @@ -183,6 +183,72 @@ public class LibvirtVMDef { } } + public static class ClockDef { + public enum ClockOffset { + UTC("utc"), + LOCALTIME("localtime"), + TIMEZONE("timezone"), + VARIABLE("variable"); + + private String _offset; + private ClockOffset(String offset) { + _offset = offset; + } + @Override + public String toString() { + return _offset; + } + } + private ClockOffset _offset; + private String _timerName; + private String _tickPolicy; + private String _track; + + public ClockDef() { + _offset = ClockOffset.UTC; + } + + public void setClockOffset(ClockOffset offset) { + _offset = offset; + } + + public void setTimer(String timerName, String tickPolicy, String track) { + _timerName = timerName; + _tickPolicy = tickPolicy; + _track = track; + } + + @Override + public String toString() { + StringBuilder clockBuilder = new StringBuilder(); + clockBuilder.append("\n"); + if (_timerName != null) { + clockBuilder.append("\n"); + clockBuilder.append("\n"); + } + clockBuilder.append("\n"); + return clockBuilder.toString(); + } + } + public static class DevicesDef { private String _emulator; private final Map> devices = new HashMap>(); From 86b51dedcfcabe6992997ee8f7a7779f169625a5 Mon Sep 17 00:00:00 2001 From: Edison Su Date: Thu, 19 Jan 2012 16:44:30 -0800 Subject: [PATCH 23/30] bug 12605: if agent is in maintenance mode, don't reconnect to mgt server status 12605: resolved fixed --- agent/src/com/cloud/agent/Agent.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/agent/src/com/cloud/agent/Agent.java b/agent/src/com/cloud/agent/Agent.java index 76fafe48ff6..5a5724ccf0c 100755 --- a/agent/src/com/cloud/agent/Agent.java +++ b/agent/src/com/cloud/agent/Agent.java @@ -43,6 +43,8 @@ import com.cloud.agent.api.AgentControlCommand; import com.cloud.agent.api.Answer; import com.cloud.agent.api.Command; import com.cloud.agent.api.CronCommand; +import com.cloud.agent.api.MaintainAnswer; +import com.cloud.agent.api.MaintainCommand; import com.cloud.agent.api.ModifySshKeysCommand; import com.cloud.agent.api.PingCommand; import com.cloud.agent.api.ReadyCommand; @@ -479,6 +481,11 @@ public class Agent implements HandlerFactory, IAgentControl { cancelTasks(); _reconnectAllowed = false; answer = new Answer(cmd, true, null); + } else if (cmd instanceof MaintainCommand) { + s_logger.debug("Received maintainCommand" ); + cancelTasks(); + _reconnectAllowed = false; + answer = new MaintainAnswer((MaintainCommand)cmd); } else if (cmd instanceof ReadyCommand) { ReadyCommand ready = (ReadyCommand)cmd; s_logger.debug("Received shutdownCommand, due to: " + ready.getDetails()); From d9287f0e430e9fb02b098884e69826edb18ee3a5 Mon Sep 17 00:00:00 2001 From: Edison Su Date: Thu, 19 Jan 2012 17:14:00 -0800 Subject: [PATCH 24/30] tell agent to reconnect to mgt server, if cancelmaintainance cmd is called --- agent/src/com/cloud/agent/Agent.java | 9 +++++++-- api/src/com/cloud/agent/api/MaintainCommand.java | 11 ++++++++++- .../src/com/cloud/agent/manager/AgentManagerImpl.java | 6 ++++++ 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/agent/src/com/cloud/agent/Agent.java b/agent/src/com/cloud/agent/Agent.java index 5a5724ccf0c..843eb5734f5 100755 --- a/agent/src/com/cloud/agent/Agent.java +++ b/agent/src/com/cloud/agent/Agent.java @@ -483,8 +483,13 @@ public class Agent implements HandlerFactory, IAgentControl { answer = new Answer(cmd, true, null); } else if (cmd instanceof MaintainCommand) { s_logger.debug("Received maintainCommand" ); - cancelTasks(); - _reconnectAllowed = false; + MaintainCommand maintainCmd = (MaintainCommand)cmd; + if (maintainCmd.getMaintain()) { + cancelTasks(); + _reconnectAllowed = false; + } else { + _reconnectAllowed = true; + } answer = new MaintainAnswer((MaintainCommand)cmd); } else if (cmd instanceof ReadyCommand) { ReadyCommand ready = (ReadyCommand)cmd; diff --git a/api/src/com/cloud/agent/api/MaintainCommand.java b/api/src/com/cloud/agent/api/MaintainCommand.java index 040309adaa7..e3281bc8f6f 100644 --- a/api/src/com/cloud/agent/api/MaintainCommand.java +++ b/api/src/com/cloud/agent/api/MaintainCommand.java @@ -18,8 +18,17 @@ package com.cloud.agent.api; public class MaintainCommand extends Command { - + private boolean _maintain; public MaintainCommand() { + _maintain = true; + } + + public void setMaintain(boolean maintain) { + _maintain = maintain; + } + + public boolean getMaintain() { + return _maintain; } @Override diff --git a/server/src/com/cloud/agent/manager/AgentManagerImpl.java b/server/src/com/cloud/agent/manager/AgentManagerImpl.java index 411a5ecf240..537cdc7d77b 100755 --- a/server/src/com/cloud/agent/manager/AgentManagerImpl.java +++ b/server/src/com/cloud/agent/manager/AgentManagerImpl.java @@ -1570,6 +1570,12 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, Manager { return false; } } + + if (host.getHypervisorType() == HypervisorType.KVM) { + MaintainCommand cmd = new MaintainCommand(); + cmd.setMaintain(false); + easySend(hostId, cmd); + } disconnect(hostId, Event.ResetRequested, false); return true; } From a976f1c23c31e8a15f9d5abdc39f87102868c8c3 Mon Sep 17 00:00:00 2001 From: Edison Su Date: Thu, 19 Jan 2012 20:02:17 -0800 Subject: [PATCH 25/30] bug 13145: update user data in domr when updatevmcmd is called status 13145: resolved fixed --- .../network/router/UpdateUserDataElement.java | 11 ++++ .../src/com/cloud/network/NetworkManager.java | 3 ++ .../com/cloud/network/NetworkManagerImpl.java | 41 ++++++++++++++ .../cloud/network/element/DhcpElement.java | 19 ++++++- .../network/element/VirtualRouterElement.java | 17 ++++++ .../VirtualNetworkApplianceManager.java | 6 +++ .../VirtualNetworkApplianceManagerImpl.java | 53 +++++++++++++------ .../src/com/cloud/vm/UserVmManagerImpl.java | 5 ++ 8 files changed, 139 insertions(+), 16 deletions(-) create mode 100644 api/src/com/cloud/network/router/UpdateUserDataElement.java diff --git a/api/src/com/cloud/network/router/UpdateUserDataElement.java b/api/src/com/cloud/network/router/UpdateUserDataElement.java new file mode 100644 index 00000000000..0dd02fd7f05 --- /dev/null +++ b/api/src/com/cloud/network/router/UpdateUserDataElement.java @@ -0,0 +1,11 @@ +package com.cloud.network.router; + +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.Network; +import com.cloud.vm.NicProfile; +import com.cloud.vm.VirtualMachine; +import com.cloud.vm.VirtualMachineProfile; + +public interface UpdateUserDataElement { + public boolean updateUserData(Network network, NicProfile nic, VirtualMachineProfile vm) throws ResourceUnavailableException; +} diff --git a/server/src/com/cloud/network/NetworkManager.java b/server/src/com/cloud/network/NetworkManager.java index 59be681a169..b6e1a4d2415 100644 --- a/server/src/com/cloud/network/NetworkManager.java +++ b/server/src/com/cloud/network/NetworkManager.java @@ -41,6 +41,7 @@ import com.cloud.network.vpn.RemoteAccessVpnElement; import com.cloud.offerings.NetworkOfferingVO; import com.cloud.user.Account; import com.cloud.user.AccountVO; +import com.cloud.uservm.UserVm; import com.cloud.utils.Pair; import com.cloud.vm.Nic; import com.cloud.vm.NicProfile; @@ -217,4 +218,6 @@ public interface NetworkManager extends NetworkService { String getIpInNetwork(long vmId, long networkId); String getIpInNetworkIncludingRemoved(long vmId, long networkId); + + boolean updateVmData(UserVm vm); } diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index c3bf61bcc8f..a471ccc909a 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -100,6 +100,7 @@ import com.cloud.network.dao.NetworkDomainDao; import com.cloud.network.element.NetworkElement; import com.cloud.network.guru.NetworkGuru; import com.cloud.network.lb.LoadBalancingRulesManager; +import com.cloud.network.router.UpdateUserDataElement; import com.cloud.network.rules.FirewallManager; import com.cloud.network.rules.FirewallRule; import com.cloud.network.rules.FirewallRule.Purpose; @@ -121,6 +122,7 @@ import com.cloud.user.User; import com.cloud.user.UserContext; import com.cloud.user.dao.AccountDao; import com.cloud.user.dao.UserStatisticsDao; +import com.cloud.uservm.UserVm; import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; import com.cloud.utils.component.Adapters; @@ -147,6 +149,7 @@ import com.cloud.vm.ReservationContextImpl; import com.cloud.vm.UserVmVO; import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VirtualMachine; +import com.cloud.vm.VirtualMachineProfileImpl; import com.cloud.vm.VirtualMachine.Type; import com.cloud.vm.VirtualMachineProfile; import com.cloud.vm.dao.DomainRouterDao; @@ -2801,6 +2804,44 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } return elements; } + + private List getUpdateUserDataElements() { + List elements = new ArrayList(); + for (NetworkElement element : _networkElements) { + if (element instanceof UpdateUserDataElement) { + elements.add((UpdateUserDataElement) element); + } + } + return elements; + } + + @Override + public boolean updateVmData(UserVm vm) { + Nic defaultNic = getDefaultNic(vm.getId()); + if (defaultNic == null) { + s_logger.error("Unable to update vm data for vm " + vm.getDisplayName() + " as the instance doesn't have default nic"); + return false; + } + + Network defaultNetwork = getNetwork(defaultNic.getNetworkId()); + NicProfile defaultNicProfile = new NicProfile(defaultNic, defaultNetwork, null, null, null); + VirtualMachineProfile vmProfile = new VirtualMachineProfileImpl((VMInstanceVO)vm); + + List elements = getUpdateUserDataElements(); + + boolean result = true; + try { + for (UpdateUserDataElement element : elements) { + if (!element.updateUserData(defaultNetwork, defaultNicProfile, vmProfile)) { + result = false; + } + } + } catch (ResourceUnavailableException e) { + + } + + return true; + } @Override public boolean zoneIsConfiguredForExternalNetworking(long zoneId) { diff --git a/server/src/com/cloud/network/element/DhcpElement.java b/server/src/com/cloud/network/element/DhcpElement.java index aaad390a607..1d8dfb30add 100644 --- a/server/src/com/cloud/network/element/DhcpElement.java +++ b/server/src/com/cloud/network/element/DhcpElement.java @@ -42,6 +42,7 @@ import com.cloud.network.NetworkManager; import com.cloud.network.Networks.TrafficType; import com.cloud.network.PublicIpAddress; import com.cloud.network.dao.NetworkDao; +import com.cloud.network.router.UpdateUserDataElement; import com.cloud.network.router.VirtualNetworkApplianceManager; import com.cloud.network.router.VirtualRouter; import com.cloud.network.router.VirtualRouter.Role; @@ -65,7 +66,7 @@ import com.cloud.vm.dao.UserVmDao; @Local(value=NetworkElement.class) -public class DhcpElement extends AdapterBase implements NetworkElement, PasswordResetElement{ +public class DhcpElement extends AdapterBase implements NetworkElement, PasswordResetElement, UpdateUserDataElement { private static final Logger s_logger = Logger.getLogger(DhcpElement.class); private static final Map> capabilities = setCapabilities(); @@ -258,4 +259,20 @@ public class DhcpElement extends AdapterBase implements NetworkElement, Password public boolean applyStaticNats(Network config, List rules) throws ResourceUnavailableException { return false; } + + @Override + public boolean updateUserData(Network network, NicProfile nic, + VirtualMachineProfile vm) + throws ResourceUnavailableException { + List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.DHCP_USERDATA); + if (routers == null || routers.isEmpty()) { + s_logger.trace("Can't find dhcp element in network " + network.getId()); + return true; + } + + @SuppressWarnings("unchecked") + VirtualMachineProfile uservm = (VirtualMachineProfile)vm; + + return _routerMgr.updateVmData(network, nic, uservm, routers); + } } diff --git a/server/src/com/cloud/network/element/VirtualRouterElement.java b/server/src/com/cloud/network/element/VirtualRouterElement.java index 230b9f17b27..4512e69c5bd 100644 --- a/server/src/com/cloud/network/element/VirtualRouterElement.java +++ b/server/src/com/cloud/network/element/VirtualRouterElement.java @@ -45,6 +45,7 @@ import com.cloud.network.VpnUser; import com.cloud.network.dao.LoadBalancerDao; import com.cloud.network.dao.NetworkDao; import com.cloud.network.lb.LoadBalancingRulesManager; +import com.cloud.network.router.UpdateUserDataElement; import com.cloud.network.router.VirtualNetworkApplianceManager; import com.cloud.network.router.VirtualRouter; import com.cloud.network.router.VirtualRouter.Role; @@ -372,4 +373,20 @@ public class VirtualRouterElement extends DhcpElement implements NetworkElement, return _routerMgr.savePasswordToRouter(network, nic, uservm, routers); } + + @Override + public boolean updateUserData(Network network, NicProfile nic, + VirtualMachineProfile vm) + throws ResourceUnavailableException { + List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.DHCP_FIREWALL_LB_PASSWD_USERDATA); + if (routers == null || routers.isEmpty()) { + s_logger.trace("Can't find virtual router element in network " + network.getId()); + return true; + } + + @SuppressWarnings("unchecked") + VirtualMachineProfile uservm = (VirtualMachineProfile)vm; + + return _routerMgr.updateVmData(network, nic, uservm, routers); + } } diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java index 4d68faece9a..923aec1234f 100644 --- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java +++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java @@ -38,6 +38,7 @@ import com.cloud.utils.component.Manager; import com.cloud.vm.DomainRouterVO; import com.cloud.vm.NicProfile; import com.cloud.vm.ReservationContext; +import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachineProfile; /** @@ -92,4 +93,9 @@ public interface VirtualNetworkApplianceManager extends Manager, VirtualNetworkA boolean applyStaticNats(Network network, List rules, List routers) throws ResourceUnavailableException; + boolean updateVmData(Network network, NicProfile nic, + VirtualMachineProfile profile, + List routers) + throws ResourceUnavailableException; + } diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index 1177339d9a0..713fcfdfe91 100755 --- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -2324,27 +2324,32 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian cmds.addCommand("users", addUsersCmd); cmds.addCommand("startVpn", startVpnCmd); } + + private void createvmDataCommand(DomainRouterVO router, UserVmVO userVM, DataCenterVO dc, Commands cmds) { + boolean createVmData = true; + long networkId = router.getNetworkId(); + if (dc.getNetworkType() == NetworkType.Basic && router.getPodIdToDeployIn().longValue() != userVM.getPodIdToDeployIn().longValue()) { + createVmData = false; + } + + if (createVmData) { + NicVO nic = _nicDao.findByInstanceIdAndNetworkId(networkId, userVM.getId()); + if (nic != null) { + s_logger.debug("Creating user data entry for vm " + userVM + " on domR " + router); + String serviceOffering = _serviceOfferingDao.findByIdIncludingRemoved(userVM.getServiceOfferingId()).getDisplayText(); + String zoneName = _dcDao.findById(router.getDataCenterIdToDeployIn()).getName(); + cmds.addCommand("vmdata", + generateVmDataCommand(router, nic.getIp4Address(), userVM.getUserData(), serviceOffering, zoneName, nic.getIp4Address(), userVM.getHostName(), userVM.getInstanceName(), userVM.getId(), null)); + } + } + } private void createVmDataCommands(DomainRouterVO router, Commands cmds) { long networkId = router.getNetworkId(); List vms = _userVmDao.listByNetworkIdAndStates(networkId, State.Running, State.Migrating, State.Stopping); DataCenterVO dc = _dcDao.findById(router.getDataCenterIdToDeployIn()); for (UserVmVO vm : vms) { - boolean createVmData = true; - if (dc.getNetworkType() == NetworkType.Basic && router.getPodIdToDeployIn().longValue() != vm.getPodIdToDeployIn().longValue()) { - createVmData = false; - } - - if (createVmData) { - NicVO nic = _nicDao.findByInstanceIdAndNetworkId(networkId, vm.getId()); - if (nic != null) { - s_logger.debug("Creating user data entry for vm " + vm + " on domR " + router); - String serviceOffering = _serviceOfferingDao.findByIdIncludingRemoved(vm.getServiceOfferingId()).getDisplayText(); - String zoneName = _dcDao.findById(router.getDataCenterIdToDeployIn()).getName(); - cmds.addCommand("vmdata", - generateVmDataCommand(router, nic.getIp4Address(), vm.getUserData(), serviceOffering, zoneName, nic.getIp4Address(), vm.getHostName(), vm.getInstanceName(), vm.getId(), null)); - } - } + createvmDataCommand(router, vm, dc, cmds); } } @@ -2509,6 +2514,24 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian } return result; } + + @Override + public boolean updateVmData(Network network, NicProfile nic, VirtualMachineProfile profile, List routers) throws ResourceUnavailableException { + if (routers == null || routers.isEmpty()) { + s_logger.warn("Unable save password, router doesn't exist in network " + network.getId()); + throw new CloudRuntimeException("Unable to save password to router"); + } + + boolean result = true; + UserVm userVm = profile.getVirtualMachine(); + DataCenterVO dc = _dcDao.findById(userVm.getDataCenterIdToDeployIn()); + for (VirtualRouter router : routers) { + Commands cmds = new Commands(OnError.Continue); + createvmDataCommand((DomainRouterVO)router, (UserVmVO)userVm, dc, cmds); + result = result && sendCommandsToRouter(router, cmds); + } + return result; + } @Override public boolean applyFirewallRules(Network network, List rules, List routers) throws ResourceUnavailableException { diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 593ed7c3c0d..8b175d0191a 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -1818,9 +1818,11 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager throw new InvalidParameterValueException("Vm with id " + id + " is not in the right state"); } + boolean updateUserdata = false; if (userData != null) { validateUserData(userData); // update userData on domain router. + updateUserdata = true; } else { userData = vmInstance.getUserData(); } @@ -1852,6 +1854,9 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager _vmDao.updateVM(id, displayName, ha, osTypeId, userData); + if (updateUserdata) { + _networkMgr.updateVmData(vmInstance); + } return _vmDao.findById(id); } From 432cfacf2a6a01fccf5e394d3b207972c87b376e Mon Sep 17 00:00:00 2001 From: anthony Date: Thu, 19 Jan 2012 20:38:30 -0800 Subject: [PATCH 26/30] cleanup snapshot in secondary storage in background --- .../resource/NfsSecondaryStorageResource.java | 34 +++- .../src/com/cloud/storage/StorageManager.java | 2 + .../com/cloud/storage/StorageManagerImpl.java | 186 ++++++++++++++---- 3 files changed, 180 insertions(+), 42 deletions(-) diff --git a/core/src/com/cloud/storage/resource/NfsSecondaryStorageResource.java b/core/src/com/cloud/storage/resource/NfsSecondaryStorageResource.java index 143f5f96137..336dddb362c 100755 --- a/core/src/com/cloud/storage/resource/NfsSecondaryStorageResource.java +++ b/core/src/com/cloud/storage/resource/NfsSecondaryStorageResource.java @@ -40,6 +40,7 @@ import org.apache.log4j.Logger; import com.cloud.agent.api.Answer; import com.cloud.agent.api.CheckHealthAnswer; import com.cloud.agent.api.CheckHealthCommand; +import com.cloud.agent.api.CleanupSnapshotBackupCommand; import com.cloud.agent.api.Command; import com.cloud.agent.api.ComputeChecksumCommand; import com.cloud.agent.api.GetStorageStatsAnswer; @@ -140,7 +141,9 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S } else if (cmd instanceof ComputeChecksumCommand){ return execute((ComputeChecksumCommand)cmd); } else if (cmd instanceof ListTemplateCommand){ - return execute((ListTemplateCommand)cmd); + return execute((ListTemplateCommand)cmd); + } else if (cmd instanceof CleanupSnapshotBackupCommand){ + return execute((CleanupSnapshotBackupCommand)cmd); } else { return Answer.createUnsupportedCommandAnswer(cmd); } @@ -364,6 +367,35 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S return new Answer(cmd, true, null); } + Answer execute(CleanupSnapshotBackupCommand cmd) { + String parent = getRootDir(cmd.getSecondaryStoragePoolURL()); + if (!parent.endsWith(File.separator)) { + parent += File.separator; + } + String absoluteSnapsthotDir = parent + File.separator + "snapshots" + File.separator + cmd.getAccountId() + File.separator + cmd.getVolumeId(); + File ssParent = new File(absoluteSnapsthotDir); + if (ssParent.exists() && ssParent.isDirectory()) { + File[] files = ssParent.listFiles(); + for (File file : files) { + boolean found = false; + String filename = file.getName(); + for (String uuid : cmd.getValidBackupUUIDs()) { + if (filename.startsWith(uuid)) { + found = true; + break; + } + } + if (!found) { + file.delete(); + String msg = "snapshot " + filename + " is not recorded in DB, remove it"; + s_logger.warn(msg); + } + } + } + return new Answer(cmd, true, null); + } + + synchronized public String getRootDir(String secUrl) { try { URI uri = new URI(secUrl); diff --git a/server/src/com/cloud/storage/StorageManager.java b/server/src/com/cloud/storage/StorageManager.java index 9b2bfda2c47..11ee7afe3ce 100755 --- a/server/src/com/cloud/storage/StorageManager.java +++ b/server/src/com/cloud/storage/StorageManager.java @@ -206,4 +206,6 @@ public interface StorageManager extends Manager { StoragePoolVO findLocalStorageOnHost(long hostId); VMTemplateHostVO getTemplateHostRef(long zoneId, long tmpltId, boolean readyOnly); + + void cleanupSecondaryStorage(boolean recurring); } diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index a0dac2e7d7b..6330111b858 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -20,6 +20,8 @@ package com.cloud.storage; import java.net.URI; import java.net.URISyntaxException; import java.net.UnknownHostException; +import java.sql.PreparedStatement; +import java.sql.ResultSet; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -46,6 +48,7 @@ import org.apache.log4j.Logger; import com.cloud.agent.AgentManager; import com.cloud.agent.api.Answer; import com.cloud.agent.api.BackupSnapshotCommand; +import com.cloud.agent.api.CleanupSnapshotBackupCommand; import com.cloud.agent.api.Command; import com.cloud.agent.api.CreateStoragePoolCommand; import com.cloud.agent.api.CreateVolumeFromSnapshotAnswer; @@ -1049,7 +1052,9 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag @Override public boolean start() { if (_storageCleanupEnabled) { - _executor.scheduleWithFixedDelay(new StorageGarbageCollector(), _storageCleanupInterval, _storageCleanupInterval, TimeUnit.SECONDS); + Random generator = new Random(); + int initialDelay = generator.nextInt(_storageCleanupInterval); + _executor.scheduleWithFixedDelay(new StorageGarbageCollector(), initialDelay, _storageCleanupInterval, TimeUnit.SECONDS); } else { s_logger.debug("Storage cleanup is not enabled, so the storage cleanup thread is not being scheduled."); } @@ -1982,46 +1987,8 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag } } } - - // Cleanup secondary storage hosts - List secondaryStorageHosts = _hostDao.listSecondaryStorageHosts(); - for (HostVO secondaryStorageHost : secondaryStorageHosts) { - try { - long hostId = secondaryStorageHost.getId(); - List destroyedTemplateHostVOs = _vmTemplateHostDao.listDestroyed(hostId); - s_logger.debug("Secondary storage garbage collector found " + destroyedTemplateHostVOs.size() + " templates to cleanup on secondary storage host: " - + secondaryStorageHost.getName()); - for (VMTemplateHostVO destroyedTemplateHostVO : destroyedTemplateHostVOs) { - if (!_tmpltMgr.templateIsDeleteable(destroyedTemplateHostVO)) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Not deleting template at: " + destroyedTemplateHostVO); - } - continue; - } - - if (s_logger.isDebugEnabled()) { - s_logger.debug("Deleting template host: " + destroyedTemplateHostVO); - } - - String installPath = destroyedTemplateHostVO.getInstallPath(); - - if (installPath != null) { - Answer answer = _agentMgr.sendToSecStorage(secondaryStorageHost, new DeleteTemplateCommand(secondaryStorageHost.getStorageUrl(),destroyedTemplateHostVO.getInstallPath())); - - if (answer == null || !answer.getResult()) { - s_logger.debug("Failed to delete " + destroyedTemplateHostVO + " due to " + ((answer == null) ? "answer is null" : answer.getDetails())); - } else { - _vmTemplateHostDao.remove(destroyedTemplateHostVO.getId()); - s_logger.debug("Deleted template at: " + destroyedTemplateHostVO.getInstallPath()); - } - } else { - _vmTemplateHostDao.remove(destroyedTemplateHostVO.getId()); - } - } - } catch (Exception e) { - s_logger.warn("problem cleaning up secondary storage " + secondaryStorageHost, e); - } - } + + cleanupSecondaryStorage(recurring); List vols = _volsDao.listVolumesToBeDestroyed(); for (VolumeVO vol : vols) { @@ -2039,6 +2006,142 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag scanLock.releaseRef(); } } + + @DB + List findAllVolumeIdInSnapshotTable(Long hostId) { + String sql = "SELECT volume_id from snapshots WHERE sechost_id=? GROUP BY volume_id"; + List list = new ArrayList(); + try { + Transaction txn = Transaction.currentTxn(); + ResultSet rs = null; + PreparedStatement pstmt = null; + pstmt = txn.prepareAutoCloseStatement(sql); + pstmt.setLong(1, hostId); + rs = pstmt.executeQuery(); + while (rs.next()) { + list.add(rs.getLong(1)); + } + return list; + } catch (Exception e) { + s_logger.debug("failed to get all volumes who has snapshots in secondary storage " + hostId + " due to " + e.getMessage()); + return null; + } + + } + + + List findAllSnapshotForVolume(Long volumeId) { + String sql = "SELECT backup_snap_id FROM snapshots WHERE volume_id=? and backup_snap_id is not NULL"; + try { + Transaction txn = Transaction.currentTxn(); + ResultSet rs = null; + PreparedStatement pstmt = null; + pstmt = txn.prepareAutoCloseStatement(sql); + pstmt.setLong(1, volumeId); + rs = pstmt.executeQuery(); + List list = new ArrayList(); + while (rs.next()) { + list.add(rs.getString(1)); + } + return list; + } catch (Exception e) { + s_logger.debug("failed to get all snapshots for a volume " + volumeId + " due to " + e.getMessage()); + return null; + } + } + + @Override + @DB + public void cleanupSecondaryStorage(boolean recurring) { + try { + // Cleanup templates in secondary storage hosts + List secondaryStorageHosts = _hostDao.listSecondaryStorageHosts(); + for (HostVO secondaryStorageHost : secondaryStorageHosts) { + try { + long hostId = secondaryStorageHost.getId(); + List destroyedTemplateHostVOs = _vmTemplateHostDao.listDestroyed(hostId); + s_logger.debug("Secondary storage garbage collector found " + destroyedTemplateHostVOs.size() + " templates to cleanup on secondary storage host: " + + secondaryStorageHost.getName()); + for (VMTemplateHostVO destroyedTemplateHostVO : destroyedTemplateHostVOs) { + if (!_tmpltMgr.templateIsDeleteable(destroyedTemplateHostVO)) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Not deleting template at: " + destroyedTemplateHostVO); + } + continue; + } + + if (s_logger.isDebugEnabled()) { + s_logger.debug("Deleting template host: " + destroyedTemplateHostVO); + } + + String installPath = destroyedTemplateHostVO.getInstallPath(); + + if (installPath != null) { + Answer answer = _agentMgr.sendToSecStorage(secondaryStorageHost, new DeleteTemplateCommand(secondaryStorageHost.getStorageUrl(), destroyedTemplateHostVO.getInstallPath())); + + if (answer == null || !answer.getResult()) { + s_logger.debug("Failed to delete " + destroyedTemplateHostVO + " due to " + ((answer == null) ? "answer is null" : answer.getDetails())); + } else { + _vmTemplateHostDao.remove(destroyedTemplateHostVO.getId()); + s_logger.debug("Deleted template at: " + destroyedTemplateHostVO.getInstallPath()); + } + } else { + _vmTemplateHostDao.remove(destroyedTemplateHostVO.getId()); + } + } + } catch (Exception e) { + s_logger.warn("problem cleaning up templates in secondary storage " + secondaryStorageHost, e); + } + } + + // Cleanup snapshot in secondary storage hosts + for (HostVO secondaryStorageHost : secondaryStorageHosts) { + try { + long hostId = secondaryStorageHost.getId(); + List vIDs = findAllVolumeIdInSnapshotTable(hostId); + if (vIDs == null) { + continue; + } + for (Long volumeId : vIDs) { + boolean lock = false; + try { + VolumeVO volume = _volsDao.findByIdIncludingRemoved(volumeId); + if (volume.getRemoved() == null) { + volume = _volsDao.acquireInLockTable(volumeId, 10); + if (volume == null) { + continue; + } + lock = true; + } + List snapshots = findAllSnapshotForVolume(volumeId); + if (snapshots == null) { + continue; + } + CleanupSnapshotBackupCommand cmd = new CleanupSnapshotBackupCommand(secondaryStorageHost.getStorageUrl(), secondaryStorageHost.getDataCenterId(), volume.getAccountId(), + volumeId, snapshots); + + Answer answer = _agentMgr.sendToSecStorage(secondaryStorageHost, cmd); + if ((answer == null) || !answer.getResult()) { + String details = "Failed to cleanup snapshots for volume " + volumeId + " due to " + (answer == null ? "null" : answer.getDetails()); + s_logger.warn(details); + } + } catch (Exception e1) { + s_logger.warn("problem cleaning up snapshots in secondary storage " + secondaryStorageHost, e1); + } finally { + if (lock) { + _volsDao.releaseFromLockTable(volumeId); + } + } + } + } catch (Exception e2) { + s_logger.warn("problem cleaning up snapshots in secondary storage " + secondaryStorageHost, e2); + } + } + + } catch (Exception e3) { + s_logger.warn("problem cleaning up secondary storage ", e3); + } + } @Override public String getPrimaryStorageNameLabel(VolumeVO volume) { @@ -2927,6 +3030,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag } } } + @Override public void onManagementNodeJoined(List nodeList, long selfNodeId) { From b851f635719c698783aeecbde72d7176c9d514a0 Mon Sep 17 00:00:00 2001 From: anthony Date: Thu, 19 Jan 2012 20:40:24 -0800 Subject: [PATCH 27/30] cleanup snapshot in secondary storage in background --- .../api/CleanupSnapshotBackupCommand.java | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 api/src/com/cloud/agent/api/CleanupSnapshotBackupCommand.java diff --git a/api/src/com/cloud/agent/api/CleanupSnapshotBackupCommand.java b/api/src/com/cloud/agent/api/CleanupSnapshotBackupCommand.java new file mode 100644 index 00000000000..5c168fedf8f --- /dev/null +++ b/api/src/com/cloud/agent/api/CleanupSnapshotBackupCommand.java @@ -0,0 +1,76 @@ +/** + * Copyright (C) 2012 Citrix.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.agent.api; + +import java.util.List; + +public class CleanupSnapshotBackupCommand extends Command { + private String secondaryStoragePoolURL; + private Long dcId; + private Long accountId; + private Long volumeId; + private List validBackupUUIDs; + + protected CleanupSnapshotBackupCommand() { + + } + + /* + * @param secondaryStoragePoolURL This is what shows up in the UI when you click on Secondary storage. + * In the code, it is present as: In the vmops.host_details table, there is a field mount.parent. This is the value of that field + * If you have better ideas on how to get it, you are welcome. + * @param validBackupUUID The VHD which are valid + */ + public CleanupSnapshotBackupCommand(String secondaryStoragePoolURL, + Long dcId, + Long accountId, + Long volumeId, + List validBackupUUIDs) + { + this.secondaryStoragePoolURL = secondaryStoragePoolURL; + this.dcId = dcId; + this.accountId = accountId; + this.volumeId = volumeId; + this.validBackupUUIDs = validBackupUUIDs; + } + + public String getSecondaryStoragePoolURL() { + return secondaryStoragePoolURL; + } + + public Long getDcId() { + return dcId; + } + + public Long getAccountId() { + return accountId; + } + + public Long getVolumeId() { + return volumeId; + } + + public List getValidBackupUUIDs() { + return validBackupUUIDs; + } + + @Override + public boolean executeInSequence() { + return false; + } +} \ No newline at end of file From 67d4b32c0edea900f5625147bd209812e3711bdd Mon Sep 17 00:00:00 2001 From: Naredula Janardhana Reddy Date: Fri, 20 Jan 2012 14:11:40 +0530 Subject: [PATCH 28/30] Bug 12808: Logging added, Improved remove_routing --- .../systemvm/debian/config/root/ipassoc.sh | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/patches/systemvm/debian/config/root/ipassoc.sh b/patches/systemvm/debian/config/root/ipassoc.sh index 5b7acc05622..65007268c4b 100644 --- a/patches/systemvm/debian/config/root/ipassoc.sh +++ b/patches/systemvm/debian/config/root/ipassoc.sh @@ -139,19 +139,21 @@ convert_primary_to_32() { remove_routing() { local pubIp=$1 + logger -t cloud "$(basename $0):Remove routing $pubIp on interface $ethDev" local ipNoMask=$(echo $pubIp | awk -F'/' '{print $1}') local mask=$(echo $pubIp | awk -F'/' '{print $2}') local tableNo=$(echo $ethDev | awk -F'eth' '{print $2}') local tableName="Table_$ethDev" - local ethMask=$(ip route show | grep $ethDev | grep src | awk '{print $1}') - if [ "$ethMask" != "" ] + local ethMask=$(ip route list scope link dev $ethDev | awk '{print $1}') + if [ "$ethMask" == "" ] then # rules and routes will be deleted for the last ip of the interface. - sudo ip route delete throw $ethMask table $tableName proto static - sudo ip rule delete from $ethMask table $tableName sudo ip rule delete fwmark $tableNo table $tableName + sudo ip rule delete table $tableName + sudo ip route flush table $tableName sudo ip route flush cache + logger -t cloud "$(basename $0):Remove routing $pubIp - routes and rules deleted" fi } @@ -160,9 +162,9 @@ copy_routes_from_main() { local tableName=$1 #get the network masks from the main table - local eth0Mask=$(ip route show | grep eth0 | grep src | awk '{print $1}') - local eth1Mask=$(ip route show | grep eth1 | grep src | awk '{print $1}') - local ethMask=$(ip route show | grep $ethDev | grep src | awk '{print $1}') + local eth0Mask=$(ip route list scope link dev eth0 | awk '{print $1}') + local eth1Mask=$(ip route list scope link dev eth1 | awk '{print $1}') + local ethMask=$(ip route list scope link dev $ethDev | awk '{print $1}') # eth0,eth1 and other know routes will be skipped, so as main routing table will decide the route. This will be useful if the interface is down and up. sudo ip route add throw $eth0Mask table $tableName proto static @@ -173,6 +175,7 @@ copy_routes_from_main() { add_routing() { local pubIp=$1 + logger -t cloud "$(basename $0):Add routing $pubIp on interface $ethDev" local ipNoMask=$(echo $1 | awk -F'/' '{print $1}') local mask=$(echo $1 | awk -F'/' '{print $2}') @@ -185,7 +188,7 @@ add_routing() { then return 0; fi - echo "$tableNo $tableName" >> /etc/iproute2/rt_tables + sudo echo "$tableNo $tableName" >> /etc/iproute2/rt_tables fi copy_routes_from_main $tableName @@ -193,13 +196,14 @@ add_routing() { sudo ip route add default via $defaultGwIP table $tableName proto static sudo ip route flush cache - local ethMask=$(ip route show | grep $ethDev | grep src | awk '{print $1}') + local ethMask=$(ip route list scope link dev $ethDev | awk '{print $1}') local rulePresent=$(ip rule show | grep $ethMask) if [ "$rulePresent" == "" ] then # rules will be added while adding the first ip of the interface sudo ip rule add from $ethMask table $tableName sudo ip rule add fwmark $tableNo table $tableName + logger -t cloud "$(basename $0):Add routing $pubIp rules added" fi return 0; } From 5c0f84e540f369b502edc9312b3c6f7003c6c19b Mon Sep 17 00:00:00 2001 From: Kelven Yang Date: Fri, 20 Jan 2012 17:57:50 -0800 Subject: [PATCH 29/30] bug 13225: setup firewall rules for all ESX/ESXi hosts under a cluster as worker VM may be created at any host available, also add connect retry when work with vCenter and ESX/ESXi hosts --- ...VmwareSecondaryStorageResourceHandler.java | 19 +++++++-- .../hypervisor/vmware/util/VmwareContext.java | 40 +++++++++++++++---- 2 files changed, 48 insertions(+), 11 deletions(-) diff --git a/core/src/com/cloud/storage/resource/VmwareSecondaryStorageResourceHandler.java b/core/src/com/cloud/storage/resource/VmwareSecondaryStorageResourceHandler.java index 53db3a1da29..f8d8a02e44c 100644 --- a/core/src/com/cloud/storage/resource/VmwareSecondaryStorageResourceHandler.java +++ b/core/src/com/cloud/storage/resource/VmwareSecondaryStorageResourceHandler.java @@ -4,6 +4,8 @@ package com.cloud.storage.resource; +import java.util.List; + import org.apache.log4j.Logger; import com.cloud.agent.api.Answer; @@ -28,6 +30,7 @@ import com.cloud.hypervisor.vmware.mo.VmwareHypervisorHostNetworkSummary; import com.cloud.hypervisor.vmware.util.VmwareContext; import com.cloud.hypervisor.vmware.util.VmwareHelper; import com.cloud.serializer.GsonHelper; +import com.cloud.utils.Pair; import com.google.gson.Gson; import com.vmware.vim25.ManagedObjectReference; @@ -232,9 +235,19 @@ public class VmwareSecondaryStorageResourceHandler implements SecondaryStorageRe HostMO hostMo = new HostMO(context, morHyperHost); try { - VmwareHypervisorHostNetworkSummary netSummary = hostMo.getHyperHostNetworkSummary( - hostMo.getHostType() == VmwareHostType.ESXi ? cmd.getContextParam("manageportgroup") : cmd.getContextParam("serviceconsole")); - _resource.ensureOutgoingRuleForAddress(netSummary.getHostIp()); + + ManagedObjectReference mor = hostMo.getHyperHostCluster(); + ClusterMO clusterMo = new ClusterMO(hostMo.getContext(), mor); + List> hostsInCluster = clusterMo.getClusterHosts(); + for(Pair hostPair : hostsInCluster) { + HostMO hostIteratorMo = new HostMO(hostMo.getContext(), hostPair.first()); + + VmwareHypervisorHostNetworkSummary netSummary = hostIteratorMo.getHyperHostNetworkSummary( + hostIteratorMo.getHostType() == VmwareHostType.ESXi ? cmd.getContextParam("manageportgroup") : cmd.getContextParam("serviceconsole")); + _resource.ensureOutgoingRuleForAddress(netSummary.getHostIp()); + + s_logger.info("Setup firewall rule for host: " + netSummary.getHostIp()); + } } catch(Throwable e) { s_logger.warn("Unable to retrive host network information due to exception " + e.toString() + ", host: " + hostTokens[0] + "-" + hostTokens[1]); } diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareContext.java b/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareContext.java index 7491a90fee0..2a30db48468 100755 --- a/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareContext.java +++ b/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareContext.java @@ -14,6 +14,7 @@ import java.io.FileOutputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; +import java.net.ConnectException; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; @@ -47,12 +48,16 @@ import com.vmware.vim25.VimPortType; public class VmwareContext { private static final Logger s_logger = Logger.getLogger(VmwareContext.class); - + + private static int MAX_CONNECT_RETRY = 5; + private static int CONNECT_RETRY_INTERVAL = 1000; + private ExtendedAppUtil _appUtil; private String _serverAddress; private Map _stockMap = new HashMap(); - private int _CHUNKSIZE = 1*1024*1024; // 1M + private int _CHUNKSIZE = 1*1024*1024; // 1M + static { try { @@ -328,7 +333,7 @@ public class VmwareContext { conn.setRequestProperty("Connection", "Keep-Alive"); conn.setRequestProperty("Content-Type", "application/x-vnd.vmware-streamVmdk"); conn.setRequestProperty("Content-Length", Long.toString(new File(localFileName).length())); - conn.connect(); + connectWithRetry(conn); BufferedOutputStream bos = null; BufferedInputStream is = null; @@ -367,8 +372,8 @@ public class VmwareContext { conn.setRequestProperty(org.apache.axis.transport.http.HTTPConstants.HEADER_COOKIE, cookieString); conn.setDoInput(true); conn.setDoOutput(true); - conn.setAllowUserInteraction(true); - conn.connect(); + conn.setAllowUserInteraction(true); + connectWithRetry(conn); long bytesWritten = 0; InputStream in = null; @@ -387,8 +392,6 @@ public class VmwareContext { if(progressUpdater != null) progressUpdater.action(new Long(totalBytesDownloaded)); } - } catch(Throwable e) { - s_logger.error("Unexpected exception ", e); } finally { if(in != null) in.close(); @@ -533,7 +536,7 @@ public class VmwareContext { conn.setAllowUserInteraction(true); conn.setRequestProperty(org.apache.axis.transport.http.HTTPConstants.HEADER_COOKIE, cookieString); conn.setRequestMethod(httpMethod); - conn.connect(); + connectWithRetry(conn); return conn; } @@ -556,6 +559,27 @@ public class VmwareContext { org.apache.axis.MessageContext msgContext = callObj.getMessageContext(); String cookieString = (String)msgContext.getProperty(org.apache.axis.transport.http.HTTPConstants.HEADER_COOKIE); return cookieString; + } + + private static void connectWithRetry(HttpURLConnection conn) throws Exception { + boolean connected = false; + for(int i = 0; i < MAX_CONNECT_RETRY && !connected; i++) { + try { + conn.connect(); + connected = true; + s_logger.info("Connected, conn: " + conn.toString() + ", retry: " + i); + } catch (Exception e) { + s_logger.warn("Unable to connect, conn: " + conn.toString() + ", message: " + e.toString() + ", retry: " + i); + + try { + Thread.sleep(CONNECT_RETRY_INTERVAL); + } catch(InterruptedException ex) { + } + } + } + + if(!connected) + throw new Exception("Unable to connect to " + conn.toString()); } public void close() { From 8e82c19601c0bcae64a3355e552baa343d18f290 Mon Sep 17 00:00:00 2001 From: Kelven Yang Date: Fri, 20 Jan 2012 18:48:00 -0800 Subject: [PATCH 30/30] bug 12985: give it 3 seconds to realize a poweroff state --- .../vmware/mo/VirtualMachineMO.java | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java b/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java index 20f8149551c..4890ee5ea0c 100755 --- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java +++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java @@ -247,7 +247,29 @@ public class VirtualMachineMO extends BaseMO { } public VirtualMachinePowerState getPowerState() throws Exception { - return (VirtualMachinePowerState)getContext().getServiceUtil().getDynamicProperty(_mor, "runtime.powerState"); + + VirtualMachinePowerState powerState = VirtualMachinePowerState.poweredOff; + + // This is really ugly, there is a case that when windows guest VM is doing sysprep, the temporary + // rebooting process may let us pick up a "poweredOff" state during VMsync process, this can trigger + // a series actions. Unfortunately, from VMware API we can not distinguish power state into such details. + // We hope by giving it 3 second to re-read the state can cover this as a short-term solution. + // + // In the future, VMsync should not kick off CloudStack action (this is not a HA case) based on VM + // state report, until then we can remove this hacking fix + for(int i = 0; i < 3; i++) { + powerState = (VirtualMachinePowerState)getContext().getServiceUtil().getDynamicProperty(_mor, "runtime.powerState"); + if(powerState == VirtualMachinePowerState.poweredOff) { + try { + Thread.sleep(1000); + } catch(InterruptedException e) { + } + } else { + break; + } + } + + return powerState; } public boolean reset() throws Exception {