Merge branch '2.2.y' of ssh://git.cloud.com/var/lib/git/cloudstack-oss into 2.2.y

This commit is contained in:
Chirag Jog 2012-01-22 08:14:35 -08:00
commit 0102e3f61d
42 changed files with 2591 additions and 152 deletions

View File

@ -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,16 @@ 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" );
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;
s_logger.debug("Received shutdownCommand, due to: " + ready.getDetails());

View File

@ -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);

View File

@ -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("<clock offset='");
clockBuilder.append(_offset.toString());
clockBuilder.append("'>\n");
if (_timerName != null) {
clockBuilder.append("<timer name='");
clockBuilder.append(_timerName);
clockBuilder.append("' ");
if (_tickPolicy != null) {
clockBuilder.append("tickpolicy='");
clockBuilder.append(_tickPolicy);
clockBuilder.append("' ");
}
if (_track != null) {
clockBuilder.append("track='");
clockBuilder.append(_track);
clockBuilder.append("' ");
}
clockBuilder.append(">\n");
clockBuilder.append("</timer>\n");
}
clockBuilder.append("</clock>\n");
return clockBuilder.toString();
}
}
public static class DevicesDef {
private String _emulator;
private final Map<String, List<?>> devices = new HashMap<String, List<?>>();

View File

@ -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 <http://www.gnu.org/licenses/>.
*
*/
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<String> 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<String> 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<String> getValidBackupUUIDs() {
return validBackupUUIDs;
}
@Override
public boolean executeInSequence() {
return false;
}
}

View File

@ -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

View File

@ -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;
}

View File

@ -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")

View File

@ -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<? extends VirtualMachine> vm) throws ResourceUnavailableException;
}

View File

@ -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 \: <strong>Sélectionnez un modèle</strong>
label.step.1=Étape 1
label.step.2.title=Etape 2\: <strong>Offre de Service</strong>
label.step.2=Étape 2
label.step.3.title=Etape 3\: <strong id\="step3_label">Sélectionnez une offre de service</strong>
label.step.3=Étape 3
label.step.4.title=Etape 4\: <strong>Réseau</strong>
label.step.4=Étape 4
label.step.5.title=Etape 5\: <strong>Vérification</strong>
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\: <span id\="submitted_by"></span>]
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\: <strong>Sélectionnez un réseau</strong>
label.zone.step.2.title=Etape 2\: <strong>Ajoutez une zone</strong>
label.zone.step.3.title=Etape 3\: <strong>Ajoutez un Pod</strong>
label.zone.step.4.title=Etape 4\: <strong>Ajoutez une plage d'adresses IP</strong>
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 <b><span id\="zone_name"></span></b>
message.add.cluster=Ajouter un cluster d'hyperviseurs géré pour cette zone <b><span id\="zone_name"></span></b>, pod <b><span id\="pod_name"></span></b>
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 <b><span id\="directnetwork_name"></span></b> dans la zone <b><span id\="zone_name"></span></b>
message.add.ip.range.to.pod=<p>Ajouter une plage IP pour le pod\: <b><span id\="pod_name_label"></span></b></p>
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\: <b><span id\="zone_name"></span></b>
message.add.pod=Ajouter un nouveau pod à la zone <b><span id\="add_pod_zone_name"></span></b>
message.add.primary.storage=Ajouter un nouveau stockage primaire à la zone <b><span id\="zone_name"></span></b>, pod <b><span id\="pod_name"></span></b>
message.add.primary=Renseignez les paramètres suivants pour ajouter un sotckage primaire
message.add.secondary.storage=Ajouter un nouveau stockage pour la zone <b><span id\="zone_name"></span></b>
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 <b>*<u>ne voulez pas</u>*</b> 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 <b id\="copy_template_name_text">XXX</b> de la zone <b id\="copy_template_source_zone_text"></b> vers
message.create.template.vm=Créer la VM depuis le modèle <b id\="p_name"></b>
message.create.template.volume=Renseignez les informations suivantes avec de créer un modèle à partir de votre volume de disque\:<b><span id\="volume_name"></span></b>. 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 <a href\="#">00000</a> pour télécharger l'ISO
message.download.template=Cliquez sur <a href\="#">00000</a> pour télécharger le modèle
message.download.volume=Cliquez sur <a href\="#">00000</a> 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 <a href\="#" id\="enable_vpn_link">cliquez ici</a> 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=<h2><span> # of </span> Clusters</h2>
message.number.hosts=<h2><span> # of </span> Hôtes</h2>
message.number.pods=<h2><span> # of </span> Pods</h2>
message.number.storage=<h2><span> # of </span> Volumes de Stockage Primaire</h2>
message.number.zones=<h2><span> # of </span> Zones</h2>
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 <strong>Ctrl-clic</strong> 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.

View File

@ -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=­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=­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\: <strong>Selecione o Template</strong>
label.step.1=Passo 1
label.step.2.title=Passo 2\: <strong>Plano</strong>
label.step.2=Passo 2
label.step.3.title=Passo 3\: <strong id\="step3_label">Selecione o Disco Adicional</strong>
label.step.3=Passo 3
label.step.4.title=Passo 4\: <strong>Rede</strong>
label.step.4=Passo 4
label.step.5.title=Passo 5\: <strong>Revisar</strong>
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\: <span id\="submitted_by"></span>]
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\: <strong>Selecionar a Rede</strong>
label.zone.step.2.title=Passo 2\: <strong>Adicionar a Zona</strong>
label.zone.step.3.title=Passo 3\: <strong>Adicionar o POD</strong>
label.zone.step.4.title=Passo 4\: <strong>Adicionar um Intervalo de IP</strong>
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 <b><span id\="zone_name"></span></b>
message.add.cluster=Add a hypervisor managed cluster for zone <b><span id\="zone_name"></span></b>, pod <b><span id\="pod_name"></span></b>
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 <b><span id\="directnetwork_name"></span></b> in zone <b><span id\="zone_name"></span></b>
message.add.ip.range.to.pod=<p>Add an IP range to pod\: <b><span id\="pod_name_label"></span></b></p>
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\: <b><span id\="zone_name"></span></b>
message.add.pod=Add a new pod for zone <b><span id\="add_pod_zone_name"></span></b>
message.add.primary.storage=Adicionar novo Storage primário à zona <b><span id\="zone_name"></span></b>, pod <b><span id\="pod_name"></span></b>
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 <b><span id\="zone_name"></span></b>
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ê <b>*<u>não</u>*</b> 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 <b id\="copy_template_name_text">XXX</b> da zona <b id\="copy_template_source_zone_text"></b> para
message.create.template.vm=Criar VM do template <b id\="p_name"></b>
message.create.template.volume=Especifique as seguintes informações antes de criar o template a partir do disco\: <b><span id\="volume_name"></span></b>. 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 <a href\="#">00000</a> para baixar a ISO
message.download.template=Clique <a href\="#">00000</a> para baixar o template
message.download.volume=Clique <a href\="#">00000</a> 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 <a href\="#" id\="enable_vpn_link">clique aqui</a> 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=<h2>Clusters</h2>
message.number.hosts=<h2>Hosts</h2>
message.number.pods=<h2>PODs</h2>
message.number.storage=<h2>Volumes do Storage Primário</h2>
message.number.zones=<h2>Zonas</h2>
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 <strong>Ctrl-clique</strong> 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=<strong>Selecione o template para o novo Cloud Server.</strong>
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

View File

@ -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();

View File

@ -594,6 +594,9 @@ public class VirtualRoutingResource implements Manager {
String publicNic = "eth" + nicNum;
command.add("-c", publicNic);
command.add("-g", vlanGateway);
return command.execute();
}

View File

@ -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);

View File

@ -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);
@ -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()) {
@ -2138,7 +2141,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 +2165,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 +2445,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 +2511,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 +2636,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 +2662,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 +3131,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 +3156,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 +3220,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 +6676,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
protected HashMap<String, Pair<String, State>> deltaClusterSync(Connection conn) {
final HashMap<String, Pair<String, State>> changes = new HashMap<String, Pair<String, State>>();
synchronized (s_vms) {
synchronized (_cluster.intern()) {
HashMap<String, Pair<String, State>> newStates = getAllVms(conn);
if (newStates == null) {
s_logger.warn("Unable to get the vm states so no state sync at this point.");

View File

@ -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);
}

View File

@ -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);

View File

@ -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<Pair<ManagedObjectReference, String>> hostsInCluster = clusterMo.getClusterHosts();
for(Pair<ManagedObjectReference, String> 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]);
}

View File

@ -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

View File

@ -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" ]) &&

View File

@ -137,6 +137,76 @@ convert_primary_to_32() {
done
}
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 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 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
}
# 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 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
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
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}')
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
sudo 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 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;
}
add_nat_entry() {
local pubIp=$1
@ -170,6 +240,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 +256,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 +280,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 +311,7 @@ remove_an_ip () {
fi
result=$?
fi
remove_routing $1
if [ $result -gt 0 -a $result -ne 2 ]
then
return 1
@ -271,7 +344,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 +361,9 @@ do
c) cflag=1
ethDev="$OPTARG"
;;
g) gflag=1
defaultGwIP="$OPTARG"
;;
?) usage
unlock_exit 2 $lock $locked
;;

View File

@ -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

View File

@ -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;
}

View File

@ -31,7 +31,7 @@ import com.cloud.utils.db.SearchCriteria;
public class AlertDaoImpl extends GenericDaoBase<AlertVO, Long> 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<AlertVO> sc = createSearchCriteria();
sc.addAnd("type", SearchCriteria.Op.EQ, Short.valueOf(type));

View File

@ -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");
@ -682,10 +683,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 +701,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);

View File

@ -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);
}

View File

@ -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<? extends UpdateUserDataElement> getUpdateUserDataElements() {
List<UpdateUserDataElement> elements = new ArrayList<UpdateUserDataElement>();
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<VMInstanceVO> vmProfile = new VirtualMachineProfileImpl<VMInstanceVO>((VMInstanceVO)vm);
List<? extends UpdateUserDataElement> 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) {

View File

@ -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<Service, Map<Capability, String>> capabilities = setCapabilities();
@ -258,4 +259,20 @@ public class DhcpElement extends AdapterBase implements NetworkElement, Password
public boolean applyStaticNats(Network config, List<? extends StaticNat> rules) throws ResourceUnavailableException {
return false;
}
@Override
public boolean updateUserData(Network network, NicProfile nic,
VirtualMachineProfile<? extends VirtualMachine> vm)
throws ResourceUnavailableException {
List<DomainRouterVO> 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> uservm = (VirtualMachineProfile<UserVm>)vm;
return _routerMgr.updateVmData(network, nic, uservm, routers);
}
}

View File

@ -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<? extends VirtualMachine> vm)
throws ResourceUnavailableException {
List<DomainRouterVO> 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> uservm = (VirtualMachineProfile<UserVm>)vm;
return _routerMgr.updateVmData(network, nic, uservm, routers);
}
}

View File

@ -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<? extends StaticNat> rules, List<? extends VirtualRouter> routers) throws ResourceUnavailableException;
boolean updateVmData(Network network, NicProfile nic,
VirtualMachineProfile<UserVm> profile,
List<? extends VirtualRouter> routers)
throws ResourceUnavailableException;
}

View File

@ -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<UserVmVO> 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<UserVm> profile, List<? extends VirtualRouter> 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<? extends FirewallRule> rules, List<? extends VirtualRouter> routers) throws ResourceUnavailableException {

View File

@ -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<? extends Discoverer> _discoverers;
protected long _nodeId = ManagementServerNode.getManagementServerId();
protected HashMap<Integer, List<ResourceListener>> _lifeCycleListeners = new HashMap<Integer, List<ResourceListener>>();
protected HashMap<Integer, List<ResourceListener>> _lifeCycleListeners = new HashMap<Integer, List<ResourceListener>>();
private void insertListener(Integer event, ResourceListener listener) {
List<ResourceListener> 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;

View File

@ -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) {

View File

@ -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<HostVO> hosts = _hostDao.listByCluster(cmd.getClusterId());
Transaction txn = Transaction.currentTxn();

View File

@ -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);
}

View File

@ -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.");
}
@ -1718,11 +1723,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
@ -1867,17 +1874,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);
@ -1980,46 +1987,8 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
}
}
}
// Cleanup secondary storage hosts
List<HostVO> secondaryStorageHosts = _hostDao.listSecondaryStorageHosts();
for (HostVO secondaryStorageHost : secondaryStorageHosts) {
try {
long hostId = secondaryStorageHost.getId();
List<VMTemplateHostVO> 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<VolumeVO> vols = _volsDao.listVolumesToBeDestroyed();
for (VolumeVO vol : vols) {
@ -2037,6 +2006,142 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
scanLock.releaseRef();
}
}
@DB
List<Long> findAllVolumeIdInSnapshotTable(Long hostId) {
String sql = "SELECT volume_id from snapshots WHERE sechost_id=? GROUP BY volume_id";
List<Long> list = new ArrayList<Long>();
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<String> 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<String> list = new ArrayList<String>();
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<HostVO> secondaryStorageHosts = _hostDao.listSecondaryStorageHosts();
for (HostVO secondaryStorageHost : secondaryStorageHosts) {
try {
long hostId = secondaryStorageHost.getId();
List<VMTemplateHostVO> 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<Long> 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<String> 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) {
@ -2925,6 +3030,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
}
}
}
@Override
public void onManagementNodeJoined(List<ManagementServerHostVO> nodeList, long selfNodeId) {

View File

@ -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<SnapshotVO> 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");

View File

@ -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);
}
}
}

View File

@ -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();
@ -1817,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();
}
@ -1851,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);
}

View File

@ -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;
}
}

View File

@ -20,3 +20,17 @@ 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');
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');

View File

@ -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 {

View File

@ -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<String, Object> _stockMap = new HashMap<String, Object>();
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() {