getValidBackupUUIDs() {
+ return validBackupUUIDs;
+ }
+
+ @Override
+ public boolean executeInSequence() {
+ return false;
+ }
+}
\ No newline at end of file
diff --git a/api/src/com/cloud/agent/api/MaintainCommand.java b/api/src/com/cloud/agent/api/MaintainCommand.java
index 040309adaa7..e3281bc8f6f 100644
--- a/api/src/com/cloud/agent/api/MaintainCommand.java
+++ b/api/src/com/cloud/agent/api/MaintainCommand.java
@@ -18,8 +18,17 @@
package com.cloud.agent.api;
public class MaintainCommand extends Command {
-
+ private boolean _maintain;
public MaintainCommand() {
+ _maintain = true;
+ }
+
+ public void setMaintain(boolean maintain) {
+ _maintain = maintain;
+ }
+
+ public boolean getMaintain() {
+ return _maintain;
}
@Override
diff --git a/api/src/com/cloud/api/commands/ListIsosCmd.java b/api/src/com/cloud/api/commands/ListIsosCmd.java
index d28923bfb0b..c43c4db865e 100755
--- a/api/src/com/cloud/api/commands/ListIsosCmd.java
+++ b/api/src/com/cloud/api/commands/ListIsosCmd.java
@@ -127,11 +127,11 @@ public class ListIsosCmd extends BaseListCmd {
public boolean listInReadyState() {
Account account = UserContext.current().getCaller();
// It is account specific if account is admin type and domainId and accountName are not null
- boolean isAccountSpecific = (account == null || isAdmin(account.getType())) && (getAccountName() != null) && (getDomainId() != null);
+ //boolean isAccountSpecific = (account == null || isAdmin(account.getType())) && (getAccountName() != null) && (getDomainId() != null);
// Show only those that are downloaded.
TemplateFilter templateFilter = TemplateFilter.valueOf(getIsoFilter());
boolean onlyReady = (templateFilter == TemplateFilter.featured) || (templateFilter == TemplateFilter.selfexecutable) || (templateFilter == TemplateFilter.sharedexecutable)
- || (templateFilter == TemplateFilter.executable && isAccountSpecific) || (templateFilter == TemplateFilter.community);
+ || (templateFilter == TemplateFilter.executable) || (templateFilter == TemplateFilter.community);
return onlyReady;
}
diff --git a/api/src/com/cloud/api/commands/UpdateHostPasswordCmd.java b/api/src/com/cloud/api/commands/UpdateHostPasswordCmd.java
index b386d700d27..38b70b7744a 100644
--- a/api/src/com/cloud/api/commands/UpdateHostPasswordCmd.java
+++ b/api/src/com/cloud/api/commands/UpdateHostPasswordCmd.java
@@ -41,10 +41,10 @@ public class UpdateHostPasswordCmd extends BaseCmd {
// ////////////// API parameters /////////////////////
// ///////////////////////////////////////////////////
- @Parameter(name=ApiConstants.HOST_ID, type=CommandType.LONG, description="the host ID")
+ @Parameter(name=ApiConstants.HOST_ID, type=CommandType.LONG, description="the host ID. Either this parameter, or clusterId has to be passed in")
private Long hostId;
- @Parameter(name=ApiConstants.CLUSTER_ID, type=CommandType.LONG, description="the cluster ID for the host")
+ @Parameter(name=ApiConstants.CLUSTER_ID, type=CommandType.LONG, description="the cluster ID. Either this parameter, or hostId has to be passed in")
private Long clusterId;
@Parameter(name=ApiConstants.USERNAME, type=CommandType.STRING, required=true, description="the username for the host/cluster")
diff --git a/api/src/com/cloud/network/router/UpdateUserDataElement.java b/api/src/com/cloud/network/router/UpdateUserDataElement.java
new file mode 100644
index 00000000000..0dd02fd7f05
--- /dev/null
+++ b/api/src/com/cloud/network/router/UpdateUserDataElement.java
@@ -0,0 +1,11 @@
+package com.cloud.network.router;
+
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.network.Network;
+import com.cloud.vm.NicProfile;
+import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.VirtualMachineProfile;
+
+public interface UpdateUserDataElement {
+ public boolean updateUserData(Network network, NicProfile nic, VirtualMachineProfile extends VirtualMachine> vm) throws ResourceUnavailableException;
+}
diff --git a/client/WEB-INF/classes/resources/messages_fr_FR.properties b/client/WEB-INF/classes/resources/messages_fr_FR.properties
new file mode 100644
index 00000000000..8730be7c58e
--- /dev/null
+++ b/client/WEB-INF/classes/resources/messages_fr_FR.properties
@@ -0,0 +1,848 @@
+#New - Add all new parameters here.
+
+
+
+
+#Labels
+label.ocfs2=OCFS2
+
+label.action.edit.host=Modifier l'hôte
+
+network.rate=Débit réseau
+
+ICMP.type=Type ICMP
+ICMP.code=Code ICMP
+
+image.directory=Répertoire d'images
+
+label.action.create.template.from.vm=Créer un modèle depuis la VM
+label.action.create.template.from.volume=Créer un modèle depuis le volume
+
+message.vm.create.template.confirm=Créer un modèle va redémarrer la VM automatiquement
+
+label.action.manage.cluster=Gérer le Cluster
+message.action.manage.cluster=Confirmez que vous voulez gérer le cluster
+label.action.manage.cluster.processing=Gestion du cluster...
+
+label.action.unmanage.cluster=Ne plus gérer le Cluster
+message.action.unmanage.cluster=Confirmez que vous ne voulez plus gérer le cluster
+label.action.unmanage.cluster.processing=Arrêt de la gestion du Cluster
+
+allocation.state=Etat de l'allocation
+managed.state=Etat de la gestion
+
+label.default.use=Usage par défaut
+label.host.tags=Etiquettes d'hôtes
+
+label.cidr=CIDR
+label.cidr.list=CIDR Source
+
+label.storage.tags=Etiquettes de stockage
+
+label.redundant.router=Routeur redondant
+label.is.redundant.router=Redondant
+
+force.delete=Forcer la suppression
+force.delete.domain.warning=Attention\: Choisir cette opion entrainera la suppression de tous les domaines issus et l'ensemble des comptes associées, ainsi que de leur ressources
+
+force.remove=Forcer la suppression
+force.remove.host.warning=Attention\: Choisir cette option entrainera CloudStack à arrêter l'ensemble des machines virtuelles avant d'enlever l'hôte du cluster
+
+force.stop=Forcer l'arrêt
+force.stop.instance.warning=Attention\: Forcer l'arrêt sur cette instance devrait être votre dernière option. Cela peut entrainer la perte de données aussi bien que de rendre l'état de la machine inconsistent. Consultez le Guide d'Administration ou le Support de Cloud.com avant d'exécuter cette commande.
+
+label.PreSetup=PreSetup
+label.SR.name = Nom du point de montage
+label.SharedMountPoint=Point de montage partagé
+label.VMFS.datastore=datastore VMFS
+
+label.network.device=Equipement Réseau
+label.add.network.device=Ajouter un équipement réseau
+label.network.device.type=Type d'équipement réseau
+label.DHCP.server.type=Serveur DHCP
+label.Pxe.server.type=Serveur PXE
+label.PING.storage.IP=adresse PING (stockage)
+label.PING.dir=répertoire PING
+label.TFTP.dir=répertoire TFTP
+label.PING.CIFS.username=utilisateur CIFS PING
+label.PING.CIFS.password=mot de passe CIFS PING
+label.CPU.cap=Utilisation maximum du CPU
+
+label.network.domain=Nom de domaine
+
+label.action.enable.zone=Activer la zone
+label.action.enable.zone.processing=Activation de la zone...
+message.action.enable.zone=Confirmez que vous voulez activer cette zone
+label.action.disable.zone=Désactivation de la zone
+label.action.disable.zone.processing=Désactivation de la zone...
+message.action.disable.zone=Confirmez que vous voulez désactiver cette zone
+
+label.action.enable.pod=Activer le Pod
+label.action.enable.pod.processing=Activation du Pod...
+message.action.enable.pod=Confirmez que vous souhaitez activer ce Pod
+label.action.disable.pod=Désactiver le Pod
+label.action.disable.pod.processing=Désactivation du Pod...
+message.action.disable.pod=Confirmez que vous voulez désactiver ce Pod
+
+label.action.enable.cluster=Activer le cluster
+label.action.enable.cluster.processing=Activation du cluster...
+message.action.enable.cluster=Confirmez que vous souhaitez activer ce cluster
+label.action.disable.cluster=Désactiver le cluster
+label.action.disable.cluster.processing=Désactivation du cluster...
+message.action.disable.cluster=Confirmez que vous souhaitez désactiver ce cluster
+
+label.account.id=ID du Compte
+label.account.name=Nom du compte
+label.account.specific=Spécifique au compte
+label.account=Compte
+label.accounts=Comptes
+label.acquire.new.ip=Acquérir une nouvelle adresse IP
+label.show.ingress.rule=Montrer la règle Ingress
+label.hide.ingress.rule=Cacher la règle Ingress
+label.action.attach.disk.processing=Attachement du Disque...
+label.action.attach.disk=Attacher un disque
+label.action.attach.iso.processing=Attachement de l'image ISO
+label.action.attach.iso=Attacher une image ISO
+label.action.cancel.maintenance.mode.processing=Annulation du mode maintenance...
+label.action.cancel.maintenance.mode=Annuler le mode maintenance
+label.action.change.password=Changer le mot de passe
+label.action.change.service.processing=Changement de d'offre de service...
+label.action.change.service=Changer d'offre de service
+label.action.copy.ISO.processing=Copie de l'image ISO...
+label.action.copy.ISO=Copier une image ISO
+label.action.copy.template.processing=Copie du Modèle...
+label.action.copy.template=Copier un modèle
+label.action.create.template.processing=Création du Modèle...
+label.action.create.template=Créer un modèle
+label.action.create.vm.processing=Création de la VM..
+label.action.create.vm=Créer une VM
+label.action.create.volume.processing=Création du Volume...
+label.action.create.volume=Créer un Volume
+label.action.delete.IP.range.processing=Suppression de la plage IP...
+label.action.delete.IP.range=Supprimer la plage IP
+label.action.delete.ISO.processing=Suppression de l'image ISO...
+label.action.delete.ISO=Supprimer l'image ISO
+label.action.delete.account.processing=Suppression du compte...
+label.action.delete.account=Supprimer un compte
+label.action.delete.cluster.processing=Suppression du Cluster...
+label.action.delete.cluster=Supprimer le Cluster
+label.action.delete.disk.offering.processing=Suppression de l'offre Disque...
+label.action.delete.disk.offering=Supprimer l'offre Disque
+
+label.action.update.resource.count=Mettre à jour le compte d'utilisation des ressources
+label.action.update.resource.count.processing=Mise à jour du compteur...
+
+label.action.delete.domain=Supprimer le domaine
+label.action.delete.domain.processing=Suppression du domaine...
+
+label.action.delete.firewall.processing=Suppression du Parefeu...
+label.action.delete.firewall=Supprimer le Parefeu
+label.action.delete.ingress.rule.processing=Suppression de la règle Ingress..
+label.action.delete.ingress.rule=Supprimer la règle Ingress
+label.action.delete.load.balancer.processing=Suppression de l'équilibreur de charge...
+label.action.delete.load.balancer=Supprimer l'équilibreur de charge
+label.action.edit.network.processing=Modification du Réseau...
+label.action.edit.network=Modifier le réseau
+label.action.delete.network.processing=Suppression du réseau...
+label.action.delete.network=Supprimer le réseau
+label.action.delete.pod.processing=Suppression du pod...
+label.action.delete.pod=Supprimer le Pod
+label.action.delete.primary.storage.processing=Suppression du stockage primaire...
+label.action.delete.primary.storage=Supprimer le stockage primaire
+label.action.delete.secondary.storage.processing=Suppression du stockage secondaire...
+label.action.delete.secondary.storage=Supprimer le stockage secondaire
+label.action.delete.security.group.processing=Suppression du groupe de sécurité
+label.action.delete.security.group=Supprimer le groupe de sécurité
+label.action.delete.service.offering.processing=Suppression de l'offre de service...
+label.action.delete.service.offering=Supprimer l'offre de service
+label.action.delete.snapshot.processing=Suppresison de l'instantané...
+label.action.delete.snapshot=Supprimer l'instantané
+label.action.delete.template.processing=Suppression du modèle...
+label.action.delete.template=Supprimer le modèle
+label.action.delete.user.processing=Suppression de l'utilisateur...
+label.action.delete.user=Supprimer l'utilisateur
+label.action.delete.volume.processing=Suppression du volume...
+label.action.delete.volume=Supprimer le volume
+label.action.delete.zone.processing=Suppression de la zone...
+label.action.delete.zone=Supprimer la zone
+label.action.destroy.instance.processing=Suppression de l'instance...
+label.action.destroy.instance=Supprimer l'instance
+label.action.destroy.systemvm.processing=Suppression de la VM Système...
+label.action.destroy.systemvm=Supprimer la VM Système
+label.action.detach.disk.processing=Détachement du disque...
+label.action.detach.disk=Détacher le disque
+label.action.detach.iso.processing=Détachement de l'image ISO...
+label.action.detach.iso=Détacher l'image ISO
+label.action.disable.account.processing=Désactivation du compte...
+label.action.disable.account=Désactiver le compte
+label.action.disable.static.NAT.processing=Désactivation du NAT Statique...
+label.action.disable.static.NAT=Désactiver le NAT Statique
+label.action.disable.user.processing=Désactivation du l'utilisateur...
+label.action.disable.user=Désactiver l'utilisateur
+label.action.download.ISO=Télécharger une image ISO
+label.action.download.template=Télécharger un modèle
+label.action.download.volume.processing=Téléchargement du volume...
+label.action.download.volume=Télécharger un volume
+label.action.edit.ISO=Modifier l'image ISO
+label.action.edit.account=Modifier le Compte
+label.action.edit.disk.offering=Modifier l'offre de disque
+label.action.edit.domain=Modifier le domaine
+label.action.edit.global.setting=Modifier la configuration globale
+label.action.edit.instance=Modifier l'instancer
+label.action.edit.network.offering=Modifier l'offre de service réseau
+label.action.edit.pod=Modifier le pod
+label.action.edit.primary.storage=Modifier le stockage primaire
+label.action.edit.resource.limits=Modifier les limites de ressources
+label.action.edit.service.offering=Modifier l'offre de service
+label.action.edit.template=Modifier le modèle
+label.action.edit.user=Modifier l'utilisateur
+label.action.edit.zone=Modifier la zone
+label.action.enable.account.processing=Activation du compte...
+label.action.enable.account=Activer le compte
+label.action.enable.maintenance.mode.processing=Activation du mode maintenance...
+label.action.enable.maintenance.mode=Activer le mode maintenance
+label.action.enable.static.NAT.processing=Activation du NAT Statique...
+label.action.enable.static.NAT=Activer le NAT Statique
+label.action.enable.user.processing=Activation de l'utilisateur..
+label.action.enable.user=Activer l'utilisateur
+label.action.force.reconnect.processing=Reconnexion en cours...
+label.action.force.reconnect=Forcer la reconnexion
+label.action.generate.keys.processing=Génération des clés...
+label.action.generate.keys=Générer les clés
+label.action.lock.account.processing=Blocage du compte...
+label.action.lock.account=Bloquer le compte
+label.action.migrate.instance=Migrer l'instance
+label.action.migrate.instance.processing=Migration de l'instance...
+label.action.reboot.instance.processing=Redémarrage de l'instance...
+label.action.reboot.instance=Redémarrer l'instance
+label.action.reboot.router.processing=Redémarrage du routeur...
+label.action.reboot.router=Redémarrer le routeur
+label.action.reboot.systemvm.processing=Redémarrage de la VM Système...
+label.action.reboot.systemvm=Redémarre la VM Système
+label.action.recurring.snapshot=Instantané récurrent
+label.action.release.ip.processing=Libération de l'adresse IP...
+label.action.release.ip=Libérer l'adresse IP
+label.action.remove.host.processing=Suppression de l'hôte...
+label.action.remove.host=Supprimer l'hôte
+label.action.reset.password.processing=Réinitialisation le mot de passe...
+label.action.reset.password=Réinitialiser le mot de passe
+label.action.resource.limits=Limites de ressources
+label.action.restore.instance.processing=Restauration de l'instance...
+label.action.restore.instance=Restaurer l'instance
+label.action.start.instance.processing=Démarrage de l'instance
+label.action.start.instance=Démarrer l'instance
+label.action.start.router.processing=Démarrage du routeur...
+label.action.start.router=Démarrer le routeur
+label.action.start.systemvm.processing=Démarrage de la VM système
+label.action.start.systemvm=Démarrer la VM système
+label.action.stop.instance.processing=Arrêt de l'Instance...
+label.action.stop.instance=Arrêter l'Instance
+label.action.stop.router.processing=Arrêt du routeur...
+label.action.stop.router=Arrêter le routeur
+label.action.stop.systemvm.processing=Arrêt de la VM système...
+label.action.stop.systemvm=Arrêter la VM système
+label.action.take.snapshot.processing=Prise de l'instantané
+label.action.take.snapshot=Prendre un instantané
+label.action.update.OS.preference.processing=Mise à jour des préférences d'OS...
+label.action.update.OS.preference=Mettre à jour les préférences d'OS
+label.actions=Actions
+label.active.sessions=Sessions actives
+label.add.account=Ajouter un compte
+label.add.by.cidr=Ajouter par CIDR
+label.add.by.group=Ajouter par groupe
+label.add.cluster=Ajouter un cluster
+label.add.direct.iprange=Ajouter une plage d'adresse IP directe
+label.add.disk.offering=Ajouter une offre disque
+label.add.domain=Ajouter un domaine
+label.add.firewall=Ajouter un parefeu
+label.add.host=Ajouter un hôte
+label.add.ingress.rule=Ajouter une règle Ingress
+label.add.ip.range=Ajouter une plage IP
+label.add.iso=Ajouter une ISO
+label.add.load.balancer=Ajouter un partageur de charge
+label.add.more=Ajouter plus
+label.add.network=Ajouter un réseau
+label.add.pod=Ajouter un pod
+label.add.primary.storage=Ajouter un stockage primaire
+label.add.secondary.storage=Ajouter un stockage secondaire
+label.add.security.group=Ajouter un groupe de sécurité
+label.add.service.offering=Ajouter un offre de service
+label.add.system.service.offering=Ajouter une offre de service système
+label.add.template=Ajouter un modèle
+label.add.user=Ajouter un utilisateur
+label.add.vlan=Ajouter un vlan
+label.add.volume=Ajouter un volume
+label.add.zone=Ajouter une zone
+label.add=Ajouter
+label.adding.cluster=Ajout du Cluster
+label.adding.failed=Echec de l'ajout
+label.adding.pod=Ajout du Pod
+label.adding.processing=Ajout...
+label.adding.succeeded=Ajout réussi
+label.adding.user=Ajout de l'utilisateur
+label.adding.zone=Ajout de la zone
+label.adding=Ajout
+label.additional.networks=Réseaux additionnels
+label.admin.accounts=Comptes Administrateur
+label.admin=Administrateur
+label.advanced.mode=Mode avancé
+label.advanced.search=Recherche avancée
+label.advanced=Avancé
+label.alert=Alerte
+label.algorithm=Algorithme
+label.allocated=Alloué
+label.api.key=Clé d'API
+label.assign.to.load.balancer=Assigner l'instance au partageur de charge
+label.assign=Assigner
+label.associated.network.id=ID du réseau associé
+label.attached.iso=Image ISO attachée
+label.availability.zone=Zone de disponibilité
+label.availability=Disponibilité
+label.available.public.ips=Adresses IP publiques disponibles
+label.available=Disponible
+label.back=Retour
+label.basic.mode=Mode basique
+label.bootable=Bootable
+label.broadcast.domain.type=Type de domaine de broadcast
+label.by.account=Par compte
+label.by.availability=Par disponibilité
+label.by.domain=Par domaine
+label.by.end.date=Par date de fin
+label.by.level=Par niveau
+label.by.pod=Par Pod
+label.by.role=Par role
+label.by.start.date=Par date de début
+label.by.state=Par état
+label.by.traffic.type=Par type de traffic
+label.by.type.id=Par type d'ID
+label.by.type=Par type
+label.by.zone=Par zone
+label.bytes.received=Octets reçus
+label.bytes.sent=Octets envoyés
+label.cancel=Annuler
+label.certificate=Certificat
+label.privatekey=Clé privée PKCS#8
+label.domain.suffix=Suffixe de domaine DNS (i.e., xyz.com)
+label.character=Caractère
+label.cidr.account=CIDR ou Compte/Groupe de sécurité
+label.close=Fermer
+label.cloud.console=Console de gestion du cloud
+label.cloud.managed=Géré par Cloud.com
+label.cluster.type=Type de Cluster
+label.cluster=Cluster
+label.code=Code
+label.confirmation=Confirmation
+label.cpu.allocated.for.VMs=CPU alloué aux VMs
+label.cpu.allocated=CPU alloué
+label.cpu.mhz=CPU (en MHz)
+label.cpu.utilized=CPU utilisé
+label.cpu=CPU
+label.created=Créé
+label.cross.zones=Multi Zones
+label.custom.disk.size=Taille de disque personnalisée
+label.daily=Quotidien
+label.data.disk.offering=Offre de disque de données
+label.date=Date
+label.day.of.month=Jour du mois
+label.day.of.week=Jour de la semaine
+label.delete=Supprimer
+label.deleting.failed=Suppression échouée
+label.deleting.processing=Suppression...
+label.description=Description
+label.detaching.disk=Détacher le disque
+label.details=Details
+label.device.id=ID du périphérique
+label.disabled=Désactivé
+label.disabling.vpn.access=Désactiver l'accès VPN
+label.disk.allocated=Disque Alloué
+label.disk.offering=Offre de Disque
+label.disk.size.gb=Taille du disque (en Go)
+label.disk.size=Taille du disque
+label.disk.total=Espace disque total
+label.disk.volume=Volume disque
+label.display.text=Texte affiché
+label.dns.1=DNS1
+label.dns.2=DNS2
+label.domain.admin=Administrateur du domaine
+label.domain.id=ID du domaine
+label.domain.name=Nom de domaine
+label.domain=Domaine
+label.double.quotes.are.not.allowed=Les guillemets ne sont pas autorisés
+label.download.progress=Progression du téléchargement
+label.edit=Modifier
+label.email=Email
+label.enabling.vpn.access=Activation de l'accès VPN
+label.enabling.vpn=Activation du VPN
+label.end.port=Port de fin
+label.endpoint.or.operation=Terminaison ou Opération
+label.error.code=Code d'erreur
+label.error=Erreur
+label.esx.host=Hôte ESX/ESXi
+label.example=Exemple
+label.failed=Echoué
+label.featured=Sponsorisé
+label.firewall=Parefeu
+label.first.name=Prénom
+label.format=Format
+label.friday=Vendredi
+label.full=Complet
+label.gateway=Passerelle
+label.general.alerts=Alertes générales
+label.generating.url=Génération de l'URL
+label.generating.url=Génération de l'URL
+label.go.step.2=Aller à l'étape 2
+label.go.step.3=Aller à l'étape 3
+label.go.step.4=Aller à l'étape 4
+label.go.step.5=Aller à l'étape 5
+label.group.optional=Groupe (optionnel)
+label.group=Groupe
+label.guest.cidr=CIDR invités
+label.guest.gateway=Passerelle pour les invités
+label.guest.ip.range=Plage d'adresses IP des invités
+label.guest.ip=Adresse IP des invités
+label.guest.netmask=Masque de réseau des invités
+label.ha.enabled=Haute disponibilité active
+label.help=Aide
+label.host.alerts=Alertes des hôtes
+label.host.name=Nom de l'hôte
+label.host=Hôte
+label.hosts=Hôtes
+label.hourly=A l'heure
+label.hypervisor.type=Type d'hyperviseur
+label.hypervisor=Hyperviseur
+label.id=ID
+label.info=Information
+label.ingress.rule=Règle Ingress
+label.initiated.by=Initié par
+label.instance.limits=Limites des instances
+label.instance.name=Nom de lìnstance
+label.instance=Instance
+label.instances=Instances
+label.internal.dns.1=DNS interne 1
+label.internal.dns.2=DNS interne 2
+label.interval.type=Type d'ìntervalle
+label.invalid.integer=Nombre entier invalide
+label.invalid.number=Nombre invalide
+label.ip.address=Adresse IP
+label.ip.allocations=Allocations de IPs
+label.ip.limits=Limite de IPs publiques
+label.ip.or.fqdn=IP ou FQDN
+label.ip.range=Plage IP
+label.ip=IP
+label.ips=IPs
+label.is.default=Est par défaut
+label.is.shared=Est partagé
+label.is.system=Est système
+label.iscsi=iSCSI
+label.iso.boot=Démarrage par ISO
+label.iso=ISO
+label.isolation.mode=Mode d'isolation
+label.keep=Conserver
+label.lang.chinese=Chinois (simplifié)
+label.lang.english=Anglais
+label.lang.japanese=Japonais
+label.lang.spanish=Espagnol
+label.last.disconnected=Dernière Déconnexion
+label.last.name=Nom de famille
+label.level=Niveau
+label.linklocal.ip=Adresse IP de lien local
+label.load.balancer=Partageur de charge
+label.loading=Chargement en cours
+label.local=Local
+label.login=Connexion
+label.logout=Déconnexion
+label.lun=LUN
+label.manage=Gérer
+label.maximum=Maximum
+label.memory.allocated=Mémoire allouée
+label.memory.mb=Mémoire (en MB)
+label.memory.total=Mémoire totale
+label.memory.used=Mémoire utilisée
+label.memory=Mémoire
+label.menu.accounts=Comptes
+label.menu.alerts=Alertes
+label.menu.all.accounts=Tout les comptes
+label.menu.all.instances=Toutes les instances
+label.menu.community.isos=ISO de la communauté
+label.menu.community.templates=Modèles de la communauté
+label.menu.configuration=Configuration
+label.menu.dashboard=Tableau de bord
+label.menu.destroyed.instances=Instances détruites
+label.menu.disk.offerings=Offres de disque
+label.menu.domains=Domaines
+label.menu.events=Evénements
+label.menu.featured.isos=ISOs Sponsorisées
+label.menu.featured.templates=Modèles sponsorisés
+label.menu.global.settings=Paramètres globaux
+label.menu.instances=Instances
+label.menu.ipaddresses=Adresses IP
+label.menu.isos=ISOs
+label.menu.my.accounts=Mes comptes
+label.menu.my.instances=Mes instances
+label.menu.my.isos=Mes ISOs
+label.menu.my.templates=Mes modèles
+label.menu.network.offerings=Offres de Service Réseau
+label.menu.network=Réseau
+label.menu.physical.resources=Ressources physiques
+label.menu.running.instances=Instances actives
+label.menu.security.groups=Groupes de sécurité
+label.menu.service.offerings=Offres de Service
+label.menu.system.service.offerings=Offres de Service Système
+label.menu.snapshots=Instantanés
+label.menu.stopped.instances=Instances Arrêtées
+label.menu.storage=Stockage
+label.menu.system.vms= VMs systèmes
+label.menu.system=Système
+label.menu.templates=Modèles
+label.menu.virtual.appliances=Appliances Virtuelles
+label.menu.virtual.resources=Ressources Virtuelles
+label.menu.volumes=Volumes
+label.migrate.instance.to=Migrer l'instance vers
+label.minimum=Minimum
+label.minute.past.hour=Minute(s) après l'heure
+label.monday=Lundi
+label.monthly=Mensuel
+label.more.templates=Plus de modèles
+label.my.account=Mon compte
+label.name.optional=Nom (facultatif)
+label.name=Nom
+label.netmask=Masque de réseau
+label.network.desc=Description réseau
+label.network.domain=Nom de domaine
+label.network.id=ID réseau
+label.network.name=Nom du réseau
+label.network.offering.display.text=Texte affiché d'Offre de Réseau
+label.network.offering.id=ID de l'Offre de Service Réseau
+label.network.offering.name=Nom de l'Offre de Service Réseau
+label.network.offering=Offre de Service Réseau
+label.network.rate=Débit Réseau
+label.network.read=Lecture réseau
+label.network.type=Type de réseau
+label.network.write=Écriture réseau
+label.network=Réseau
+label.new.password=Nouveau mot de passe
+label.next=Suivant
+label.nfs.server=Serveur NFS
+label.nfs.storage=Stockage NFS
+label.nfs=NFS
+label.nics=Cartes NIC
+label.no.actions=Aucune action disponibles
+label.no.alerts=Aucune alerte récentes
+label.no.errors=Aucune erreur récentes
+label.no.isos=Aucun ISOs disponibles
+label.no.items=Aucun élément disponibles
+label.no.security.groups=Aucun groupe de sécurité disponibles
+label.no.thanks=Non merci
+label.no=Non
+label.none=Aucun
+label.not.found=Introuvable
+label.num.cpu.cores=Nombre de c\u0153urs de processeur
+label.numretries = Nombre de tentatives
+label.offer.ha=Offrir la haute disponibilité
+label.optional=Facultatif
+label.os.preference=Préférence du OS
+label.os.type=Type du OS
+label.owned.public.ips=Addresses IP Publique détenues
+label.owner.account=Compte propriétaire
+label.owner.domain=Domaine propriétaire
+label.parent.domain=Domaine Parent
+label.password.enabled=Mot de passe activé
+label.password=Mot de passe
+label.path=Chemin
+label.please.wait=Patientez s'il vous plait
+label.pod=Pod
+label.port.forwarding=Redirection de port
+label.port.range=Plage de ports
+label.prev=Précédent
+label.primary.allocated=Stockage primaire alloué
+label.primary.network=Réseau primaire
+label.primary.storage=Stockage primaire
+label.primary.used=Stockage primaire utilisé
+label.private.interface=Interface privée
+label.private.ip.range=Plage d'adresses IP Privées
+label.private.ip=Adresse IP Privée
+label.private.ips=Adresses IP Privées
+label.private.port=Port privé
+label.private.zone=Zone Privée
+label.protocol=Protocole
+label.protocol=Protocole
+label.public.interface=Interface publique
+label.public.ip=Adresse IP publique
+label.public.ips=Adresses IP publiques
+label.public.port=Port public
+label.public.zone=Zone publique
+label.public=Publique
+label.recent.errors=Erreurs récentes
+label.refresh=Actualiser
+label.related=Connexes
+label.remove.from.load.balancer=Supprimer l'instance du partageur de charge
+label.removing.user=Retrait de l'utilisateur
+label.required=Requis
+label.reserved.system.ip=Adresse IP Système réservé
+label.resource.limits=Limite des ressources
+label.resource=Ressource
+label.resources=Ressources
+label.role=Rôle
+label.root.disk.offering=Offre de disque racine
+label.running.vms=VMs actives
+label.saturday=Samedi
+label.save=Sauvegarder
+label.saving.processing=Sauvegarde en cours....
+label.scope=Portée
+label.search=Rechercher
+label.secondary.storage=Stockage secondaire
+label.secondary.used=Stockage secondaire utilisé
+label.secret.key=clé privée
+label.security.group.name=Nom du groupe de sécurité
+label.security.group=Groupe de sécurité
+label.security.groups.enabled=Groupes de sécurité Activés
+label.security.groups=Groupes de sécurité
+label.sent=Envoyer
+label.server=Serveur
+label.service.offering=Offre de Service
+label.system.service.offering=Offre de Service Système
+label.session.expired=Session expiré
+label.shared=En partage
+label.size=Taille
+label.snapshot.limits=Limite d'instantanés
+label.snapshot.name=Nom de l'instantané
+label.snapshot.s=Instantané(s)
+label.snapshot.schedule=Programmation de l'Instantané
+label.snapshot=Instantané
+label.snapshots=Instantanés
+label.source.nat=NAT Source
+label.specify.vlan=Précisez le VLAN
+label.start.port=Port de
+label.state=État
+label.static.nat.to=NAT Static vers
+label.static.nat=NAT Static
+label.statistics=Statistiques
+label.status=Statut
+label.step.1.title=Etape 1 \: Sélectionnez un modèle
+label.step.1=Étape 1
+label.step.2.title=Etape 2\: Offre de Service
+label.step.2=Étape 2
+label.step.3.title=Etape 3\: Sélectionnez une offre de service
+label.step.3=Étape 3
+label.step.4.title=Etape 4\: Réseau
+label.step.4=Étape 4
+label.step.5.title=Etape 5\: Vérification
+label.step.5=Étape 5
+label.stopped.vms=VMs arrêtés
+label.storage.type=Type de stockage
+label.storage=Stockage
+label.submit=Envoyer
+label.submitted.by=[Soumis par\: ]
+label.succeeded=Réussi
+label.sunday=Dimanche
+label.system.capacity=Ressources disponibles pour l'ensemble du Système
+label.system.vm.type=Type de VM système
+label.system.vm.type=Type de VM système
+label.system.vm=VM Système
+label.system.vms= VMs Systèmes
+label.tagged=Taggé
+label.tags=Tags
+label.target.iqn=IQN de la Cible
+label.template.limits=Limites des modèles
+label.template=Modèle
+label.theme.default=Thème par défaut
+label.theme.grey=Personnalisé - Gris
+label.theme.lightblue=Personnalisé - Blue clair
+label.thursday=Jeudi
+label.time.zone=Fuseau horaire
+label.time=Temps
+label.timeout.in.second = Timeout(en secondes)
+label.timezone=Fuseau horaire
+label.total.cpu=Capacité Totale en CPU
+label.total.vms=Nombre total de VMs
+label.traffic.type=Type de Traffic
+label.tuesday=Mardi
+label.type.id=ID du Type
+label.type=Type
+label.unavailable=Indisponible
+label.unlimited=Illimité
+label.untagged=Non Taggé
+label.update.ssl.cert=Mettre à jour le certificate SSL
+label.update.ssl=Mettre à jour le certificate SSL
+label.updating=Mise à jour
+label.url=URL
+label.usage.interface=Interface d'Usage
+label.used=Utilisé
+label.user=Utilisateur
+label.username=Nom d'Utilisateur
+label.users=Utilisateurs
+label.value=Valeur
+label.vcenter.cluster=Cluster vCenter
+label.vcenter.datacenter=Datacenter vCenter
+label.vcenter.datastore=Datastore vCenter
+label.vcenter.host=Hôte Vcenter
+label.vcenter.password=Mot de passe vCenter
+label.vcenter.username=Nom d'utilisateur vCenter
+label.version=Version
+label.virtual.appliance=Appliance Virtuelle
+label.virtual.appliances=Appliances Virtuelles
+label.virtual.network=Réseau virtuel
+label.vlan.id=ID du VLAN
+label.vlan.range=Plage du VLAN
+label.vlan=VLAN
+label.vm.add=Ajouter une instance
+label.vm.destroy=Détruire
+label.vm.reboot=Redémarrer
+label.vm.start=Démarrer
+label.vm.stop=Arrêtez
+label.vmfs=VMFS
+label.vms=VMs
+label.volume.limits=Limites des volumes
+label.volume.name=Nom du volume
+label.volume=Volume
+label.volumes=Volumes
+label.vpn=VPN
+label.vsphere.managed=Gérée par vSphere
+label.waiting=En attente
+label.warn=Avertir
+label.wednesday=Mercredi
+label.weekly=Hebdomadaire
+label.welcome.cloud.console=Bienvenue dans la console de gestion
+label.welcome=Bienvenue
+label.yes=Oui
+label.zone.id=ID de la zone
+label.zone.step.1.title=Etape 1\: Sélectionnez un réseau
+label.zone.step.2.title=Etape 2\: Ajoutez une zone
+label.zone.step.3.title=Etape 3\: Ajoutez un Pod
+label.zone.step.4.title=Etape 4\: Ajoutez une plage d'adresses IP
+label.zone.wide=Etendu à la zone
+label.zone=Zone
+
+#Messages
+message.acquire.public.ip=Sélectionnez la zone dans laquelle vous voulez acquérir votre nouvelle adresse IP.
+message.action.cancel.maintenance.mode=Confirmer que vous souhaitez annuler cette maintenance.
+message.action.cancel.maintenance=Votre hôte a été annulée de la maintenance. Ce processus peut prendre jusqu'à plusieurs minutes.
+message.action.delete.ISO.for.all.zones=L'ISO est utilisé par toutes les zones. S'il vous plaît confirmer que vous voulez le supprimer de toutes les zones.
+message.action.delete.ISO=Confirmer que vous souhaitez supprimer cette ISO.
+message.action.delete.cluster=Confirmer que vous voulez supprimer ce cluster.
+message.action.delete.disk.offering=Confirmer que vous souhaitez supprimer cette offre de disque.
+message.action.delete.domain=Confirmer que vous voulez supprimer ce domaine.
+message.action.delete.external.firewall=Confirmer que vous souhaitez supprimer ce pare-feu externe. Attention\: Si vous prévoyez de rajouter le même pare-feu externe de nouveau, vous devez réinitialiser les données d'utilisation sur l'appareil.
+message.action.delete.external.load.balancer=Confirmez que vous souhaitez supprimer ce partageur de charge externe. Attention \: Si vous pensez ajouter le même partageur de charge plus tard, vous devez remettre à zéro les statistiques d'usage de cet équipement.
+message.action.delete.ingress.rule=Confirmez que vous souhaitez supprimer cette règle Ingress
+message.action.delete.network=Confirmer que vous voulez supprimer ce réseau.
+message.action.delete.pod=Confirmez que vous souhaitez supprimer ce pod.
+message.action.delete.primary.storage=Confirmer que vous voulez supprimer ce stockage primaire.
+message.action.delete.secondary.storage=Confirmez que vous souhaitez supprimer ce stockage secondaire.
+message.action.delete.security.group=Confirmez que vous souhaitez supprimer ce groupe de sécurité.
+message.action.delete.service.offering=Confirmez que vous souhaitez supprimer cette offre de service.
+message.action.delete.snapshot=Confirmez que vous souhaitez supprimer cet instantané
+message.action.delete.template.for.all.zones=Ce modèle est utilisé par toutes les zones. Confirmez que vous souhaitez le supprimer de toutes les zones.
+message.action.delete.template=Confirmez que vous souhaitez supprimer ce modèle.
+message.action.delete.volume=Confirmez que vous souhaitez supprimer ce volume.
+message.action.delete.zone=Confirmez que vous souhaitez supprimer cette zone.
+message.action.destroy.instance=Confirmez que vous souhaitez supprimer cette instance.
+message.action.destroy.systemvm=Confirmez que vous souhaitez supprimer cette VM Système.
+message.action.disable.static.NAT=Confirmez que vous souhaitez désactiver le NAT statique.
+message.action.enable.maintenance=Votre hôte a été mis en mode maintenance avec succès. Ce processus peut durer plusieurs minutes ou plus suivant le nombre de VMs actives sur cet hôte.
+message.action.force.reconnect=Votre hôte a été forcé à se reconnecter avec succès. Ce processus peut prendre jusqu'à plusieurs minutes.
+message.action.force.reconnect=Votre hôte a été forcé à se reconnecter avec succès. Ce processus peut prendre jusqu'à plusieurs minutes.
+message.action.host.enable.maintenance.mode=Activer le mode maintenance va causer la migration à chaud de l'ensemble des instances de cet hôte sur les autres hôtes disponibles.
+message.action.instance.reset.password=Confirmez que vous souhaitez changer le mot de passe ROOT de cette machine virtuelle.
+message.action.primarystorage.enable.maintenance.mode=Attention \: placer ce stockage primaire en mode maintenance que l'ensemble des VMs utilisant des volumes sur ce stockage. Souhaitez vous continuer ?
+message.action.reboot.instance=Confirmez que vous souhaitez redémarrer cette instance.
+message.action.reboot.router=Confirmez que vous souhaitez redémarrer ce routeur.
+message.action.reboot.systemvm=Confirmez que vous souhaitez redémarrer cette VM Système
+message.action.release.ip=Confirmez que vous souhaitez libérer cette IP.
+message.action.remove.host=Supprimer le dernier/seul hôte dans le cluster et le réinstaller va supprimer l'environnement/la base de données sur l'hôte et rendre les VMs invitées inutilisables.
+message.action.restore.instance=Confirmez que vous souhaitez restaurer cette instance.
+message.action.start.instance=Confirmez que vous souhaitez démarrer cette instance.
+message.action.start.router=Confirmez que vous souhaitez démarrer ce routeur.
+message.action.start.systemvm=Confirmez que vous souhaitez redémarrer cette VM système.
+message.action.stop.instance=Confirmez que vous souhaitez arrêter cette instance.
+message.action.stop.router=Confirmez que vous souhaitez arrêter ce routeur.
+message.action.stop.systemvm=Confirmez que vous souhaitez arrêter cette VM.
+message.action.take.snapshot=Confirmez que vous voulez prendre un instantané.
+message.add.cluster.zone=Ajouter un cluster d'hyperviseurs géré pour cette zone
+message.add.cluster=Ajouter un cluster d'hyperviseurs géré pour cette zone , pod
+message.add.disk.offering=Renseignez les paramètres suivants pour ajouter un offre de service de disques
+message.add.firewall=Ajouter un parefeu à cette zone
+message.add.host=Renseignez les paramètres suivant pour ajouter un hôte
+message.add.ip.range.direct.network=Ajouter une plage IP au réseau direct dans la zone
+message.add.ip.range.to.pod=Ajouter une plage IP pour le pod\:
+message.add.ip.range=Ajouter une plage IP pour le réseau publique dans la zone
+message.add.load.balancer=Ajouter un partageur de charge à la zone
+message.add.network=Ajouter un nouveau réseau à la zone\:
+message.add.pod=Ajouter un nouveau pod à la zone
+message.add.primary.storage=Ajouter un nouveau stockage primaire à la zone , pod
+message.add.primary=Renseignez les paramètres suivants pour ajouter un sotckage primaire
+message.add.secondary.storage=Ajouter un nouveau stockage pour la zone
+message.add.service.offering=Renseignez les informations suivantes pour ajouter une nouvelle offre de service.
+message.add.template=Renseignez les informations suivantes pour créer votre nouveau modèle
+message.add.volume=Renseignez les informations suivantes pour ajouter un nouveau volume
+message.additional.networks.desc=Sélectionnez le(s) réseau(x) additionnel(s) au(x)quel(s) sera connectée votre instance.
+message.advanced.mode.desc=Choisissez ce modèle de réseau si vous souhaitez bénéficier du support des VLANs. Ce mode de réseau donne le plus de flexibilité aux administrateurs pour fournir des offres de service réseau personnalisées comme fournir des parefeux, vpn, partageurs de charge ou également activer des réseaux virtuels ou directs.
+message.advanced.security.group=Choisissez ceci si vous souhaitez utiliser les groupes de sécurité pour fournir l'isolation des VMs invitées.
+message.advanced.virtual=Choisissez ceci si vous souhaitez utiliser des VLANs pour fournir l'isolation des VMs invitées.
+message.allow.vpn.access=Entrez un nom d'utilisateur et un mot de passe pour l'utilisateur que vous souhaitez autorisé à utiliser l'accès VPN.
+message.attach.iso.confirm=Confirmez que vous souhaitez attacher l'image ISO à cette instance.
+message.attach.volume=Renseignez les données suivante pour attacher un nouveau volume. Si vous attachez un volume disque à une machine virtuelle sous Windows, vous aurez besoin de redémarrer l'instance pour voir le nouveau disque.
+message.basic.mode.desc=Choisissez ce modèle de réseau si vous *ne voulez pas* activer le support des VLANs. Toutes les instances créées avec ce modèle de réseau se verront assignées une adresse IP et les groupes de sécurité seront utilisés pour fournir l'isolation entre les VMs.
+
+message.change.offering.confirm=Confirmez que vous souhaitez changer l'offre de service de cette instance.
+message.copy.iso.confirm=Confirmez que vous souhaitez copier votre image ISO vers
+message.copy.template=Copier le modèle XXX de la zone vers
+message.create.template.vm=Créer la VM depuis le modèle
+message.create.template.volume=Renseignez les informations suivantes avec de créer un modèle à partir de votre volume de disque\:. La création du modèle peut prendre plusieurs minutes suivant la taille du volume.
+message.delete.account=Confirmez que vous souhaitez supprimer ce compte.
+message.detach.iso.confirm=Confirmez que vous souhaitez détacher l'image ISO de cette instance.
+message.disable.account=Confirmez que vous souhaitez désactiver ce compte. En désactivant ce compte, tous les utilisateurs du compte ne pourront plus accéder à leurs ressources. Toutes les VMs actives seront arrêtées immédiatement.
+message.disable.vpn.access=Confirmez que vous souhaitez désactiver l'accès VPN.
+message.download.ISO=Cliquez sur 00000 pour télécharger l'ISO
+message.download.template=Cliquez sur 00000 pour télécharger le modèle
+message.download.volume=Cliquez sur 00000 pour télécharger le volume
+message.edit.confirm=Vérifiez vos changements avant de cliquer sur "Sauvegarder"
+message.edit.limits=Renseignez les limites pour les ressources suivantes. "-1" indique qu'il n'y a pas de limites pour la création de ressources.
+message.enable.account=Confirmez que vous souhaitez activer ce compte.
+message.enable.vpn.access=Le VPN est désactivé pour cette adresse IP. Voulez vous activer l'accès VPN ?
+message.enable.vpn=L'accès VPN n'est pas activé. Please cliquez ici pour activer le VPN.
+message.enabled.vpn.ip.sec=Votre clé partagée IPSec est
+message.enabled.vpn=Votre accès VPN est activé et peut être accédé par l'IP
+message.launch.vm.on.private.network=Souhaitez vous démarrer l'instance sur votre propre réseau privé dédié ?
+message.lock.account=Confirmez que vous souhaitez verrouiller ce compte. En le verrouillant, les utilisateurs de ce compte ne seront plus capable de gérer leurs ressources. Les ressources existantes resteront toutefois accessibles.
+message.migrate.instance.confirm=Confirmez l'hôte vers lequel vous souhaitez migrer cette instance
+message.new.user=Renseignez les informations suivantes pour ajouter un nouvel utilisateur au compte.
+message.no.network.support.configuration.not.true=Vous n'avez pas de zone avec les groupes de sécurité activés. Donc, pas de fonctionnalités supplémentaires pour le réseau. Continuez à l'étape 5.
+message.no.network.support=Sélectionnez l'hyperviseur. vSphere, n'a pas de fonctionnalités supplémentaires pour le réseau. Continuez à l'étape 5.
+message.number.clusters= # of Clusters
+message.number.hosts= # of Hôtes
+message.number.pods= # of Pods
+message.number.storage= # of Volumes de Stockage Primaire
+message.number.zones= # of Zones
+message.remove.vpn.access=Confirmez que vous souhaitez supprimer l'accès VPN à l'utilisateur suivant.
+message.restart.mgmt.server=Redémarrez votre(vos) serveur(s) de management pour appliquer les nouveaux paramètres.
+message.security.group.usage=(Utilisez Ctrl-clic pour séléctionner les groupes de sécurité visés)
+message.snapshot.schedule=Vous pouvez mettre en place les politiques de génération d'instantanés en sélectionnant les options disponibles ci-dessous et en appliquant votre politique.
+message.step.1.continue=Sélectionnez un modèle ou une image ISO pour continuer
+message.step.1.desc=Sélectionnez un template pour votre nouvelle instance virtuelle. Vous pouvez également choisir un modèle vierge sur lequel une image ISO pourra être installé.
+message.step.2.continue=Sélectionnez une offre de service pour continuer
+message.step.2.desc=
+message.step.3.continue=Sélectionnez un offre de service de disque pour continuer
+message.step.3.desc=
+message.step.4.continue=Sélectionnez au moins un réseau pour continuer
+message.step.4.desc=Sélectionnez le réseau principal auquel votre instance va être connecté.
+message.update.os.preference=Choisissez votre OS préféré pour cet hôte. Toutes les instances avec des préférences similaires seront d'abord allouées à cet hôte avant d'en choisir un autre.
+message.update.ssl=Soumettez un nouveau certificat SSL compatible X.509 qui sera mis à jour sur l'ensemble de instance de proxy console.
+message.virtual.network.desc=Un réseau virtuel dédié pour votre compte. Ce domaine de broadcast est contenu dans un VLAN et l'ensemble de accès réseau publique sont routés par un routeur virtuel.
+message.volume.create.template.confirm=Confirmez que vous souhaitez créer un modèle pour ce disque. La création peut prendre plusieurs minutes, voire plus, selon la taille du volume.
+message.zone.step.1.desc=Sélectionnez un modèle de réseau pour votre zone.
+message.zone.step.2.desc=Renseignez les informations suivantes pour ajouter une zone.
+message.zone.step.3.desc=Renseignez les informations suivantes pour ajouter un pod.
+message.apply.snapshot.policy=Vous avez mis à jour votre politique d'instantanés avec succès.
+message.disable.snapshot.policy=Vous avez désactivé votre politique de snapshots avec succès.
+message.action.change.service.warning.for.instance=Votre instance doit être arrêtée avant d'essayer de changer son offre de service.
+message.action.change.service.warning.for.router=Votre routeur doit être arrêté avant d'essayer de changer son offre de service.
+message.action.reset.password.warning=Votre instance doit être arrêtée avant d'essayer de changer son mot de passe.
+message.action.reset.password.off=Votre instance ne supporte pas pour le moment cette fonctionnalité.
+
+#Errors
+error.login=Votre nom d'utilisateur /mot de passe ne correspond pas à nos données.
+error.menu.select=Impossible d'effectuer cette action tant que vous n'avez pas sélectionné d'éléments.
+error.mgmt.server.inaccessible=Le serveur de management est indisponible. Essayez plus tard.
+error.session.expired=Votre session a expiré.
+error.unresolved.internet.name=Votre nom internet ne peut pas être résolu.
diff --git a/client/WEB-INF/classes/resources/messages_pt_BR.properties b/client/WEB-INF/classes/resources/messages_pt_BR.properties
new file mode 100644
index 00000000000..a500b371884
--- /dev/null
+++ b/client/WEB-INF/classes/resources/messages_pt_BR.properties
@@ -0,0 +1,847 @@
+#New - Add all new parameters here.
+
+
+
+
+#Labels
+label.ocfs2=OCFS2
+
+label.action.edit.host=Editar Host
+
+network.rate=Taxa de Transferência
+
+ICMP.type=Tipo ICMP
+ICMP.code=Código ICMP
+
+image.directory=Diretório da Imagem
+
+label.action.create.template.from.vm=Criar Template a partir da VM
+label.action.create.template.from.volume=Criar Template a partir do Disco
+
+message.vm.create.template.confirm=Criar Template reiniciará a VM automaticamente.
+
+label.action.manage.cluster=Vincular Cluster
+message.action.manage.cluster=Confirma a vinculação do cluster.
+label.action.manage.cluster.processing=Vinculando o Cluster....
+
+label.action.unmanage.cluster=Desvincular Cluster
+message.action.unmanage.cluster=Confirma a desvinculação do cluster.
+label.action.unmanage.cluster.processing=Desvinculando Cluster....
+
+allocation.state=Status da Alocação
+managed.state=Status do Gerenciamento
+
+label.default.use=Default Use
+label.host.tags=Tags de Host
+
+label.cidr=CIDR
+label.cidr.list=CIDR de Origem
+
+label.storage.tags=Tags de Storage
+
+label.redundant.router=Roteador Redundantee
+label.is.redundant.router=Redundante
+
+force.delete=Forçar Exclusão
+force.delete.domain.warning=Atenção\: Esta opção removerá todos os domÃnios, contas e recursos associados.
+
+force.remove=Forçar Remoção
+force.remove.host.warning=Atenção\: O CloudStack desligará de maneira forçada todas as VMs antes de remover o host do cluster.
+
+force.stop=Forçar Parada
+force.stop.instance.warning=Atenção\: Forçar o desligamento deste Cloud Server deve ser usado com cautela. Pode levar a perda de dados assim como inconsistência no sistema de arquivos.
+
+label.PreSetup=PreSetup
+label.SR.name = SR Name-Label
+label.SharedMountPoint=SharedMountPoint
+label.VMFS.datastore=VMFS datastore
+
+label.network.device=Dispositivo de Rede
+label.add.network.device=Adicionar Dispositivo de Rede
+label.network.device.type=Tipo de Dispositivo de Rede
+label.DHCP.server.type=Tipo de Servidor DHCP
+label.Pxe.server.type=Tipo de Servidor PXE
+label.PING.storage.IP=Disparar PING para IP do Storage
+label.PING.dir=PING Directory
+label.TFTP.dir=TFTP Directory
+label.PING.CIFS.username=PING CIFS username
+label.PING.CIFS.password=PING CIFS password
+label.CPU.cap=CPU Cap
+
+label.network.domain=DomÃnio de Rede
+
+label.action.enable.zone=Ativar Zona
+label.action.enable.zone.processing=Ativando Zona....
+message.action.enable.zone=Confirma a ativação da zona.
+label.action.disable.zone=Desativar Zona
+label.action.disable.zone.processing=Desativando Zona....
+message.action.disable.zone=Confirma a desativação da zona.
+
+label.action.enable.pod=Ativar POD
+label.action.enable.pod.processing=Ativando POD....
+message.action.enable.pod=Confirma a ativação do POD.
+label.action.disable.pod=Desativar POD
+label.action.disable.pod.processing=Desativando POD....
+message.action.disable.pod=Confirma a desativação do POD.
+
+label.action.enable.cluster=Ativar Cluster
+label.action.enable.cluster.processing=Ativando Cluster....
+message.action.enable.cluster=Confirma a ativação do cluster.
+label.action.disable.cluster=Desativar Cluster
+label.action.disable.cluster.processing=Desativando Cluster....
+message.action.disable.cluster=Confirma a desativação do cluster.
+
+label.account.id=ID da Conta
+label.account.name=Nome da Conta
+label.account.specific=Conta-Specific
+label.account=Conta
+label.accounts=Contas
+label.acquire.new.ip=Adquirir novo IP
+label.show.ingress.rule=Mostrar Regra de Entrada
+label.hide.ingress.rule=Ocultar Regra de Entrada
+label.action.attach.disk.processing=Anexando Disco....
+label.action.attach.disk=Anexar Disco
+label.action.attach.iso.processing=Anexando ISO....
+label.action.attach.iso=Anexar ISO
+label.action.cancel.maintenance.mode.processing=Cancelando Modo de Manutenção....
+label.action.cancel.maintenance.mode=Cancelar Modo de Manutenção
+label.action.change.password=Troca de Senha
+label.action.change.service.processing=Trocando de Plano....
+label.action.change.service=Trocar Plano
+label.action.copy.ISO.processing=Copiando ISO....
+label.action.copy.ISO=Copiar ISO
+label.action.copy.template.processing=Copiando Template....
+label.action.copy.template=Copiar Template
+label.action.create.template.processing=Criando Template....
+label.action.create.template=Criar Template
+label.action.create.vm.processing=Criando VM....
+label.action.create.vm=Criar VM
+label.action.create.volume.processing=Criando Disco....
+label.action.create.volume=Criar Disco
+label.action.delete.IP.range.processing=Removendo Range de IP....
+label.action.delete.IP.range=Remover Range IP
+label.action.delete.ISO.processing=Removendo ISO....
+label.action.delete.ISO=Removendo ISO
+label.action.delete.account.processing=Removendo conta....
+label.action.delete.account=Remover conta
+label.action.delete.cluster.processing=Removendo Cluster....
+label.action.delete.cluster=Remover Cluster
+label.action.delete.disk.offering.processing=Removendo Oferta de Disco....
+label.action.delete.disk.offering=Remover Oferta de Disco
+
+label.action.update.resource.count=Atualiza Contador de Recursos
+label.action.update.resource.count.processing=Atualizando Contador de Recursos....
+
+label.action.delete.domain=Remover DomÃnio
+label.action.delete.domain.processing=Removendo DomÃnio....
+
+label.action.delete.firewall.processing=Removendo Firewall....
+label.action.delete.firewall=Remover Firewall
+label.action.delete.ingress.rule.processing=Removendo Regra de Entrada....
+label.action.delete.ingress.rule=Remover Regra de Entrada
+label.action.delete.load.balancer.processing=Removendo Load Balancer....
+label.action.delete.load.balancer=Remover Load Balancer
+label.action.edit.network.processing=Editarando Rede....
+label.action.edit.network=Editar Rede
+label.action.delete.network.processing=Removendo Rede....
+label.action.delete.network=Remover Rede
+label.action.delete.pod.processing=Removendo POD....
+label.action.delete.pod=Remover POD
+label.action.delete.primary.storage.processing=Removendo Storage Primário....
+label.action.delete.primary.storage=Remover Storage Primário
+label.action.delete.secondary.storage.processing=Removendo Storage Secundário....
+label.action.delete.secondary.storage=Remover Storage Secundário
+label.action.delete.security.group.processing=Removendo Security Group....
+label.action.delete.security.group=Remover Security Group
+label.action.delete.service.offering.processing=Removendo Plano....
+label.action.delete.service.offering=Remover Plano
+label.action.delete.snapshot.processing=Removendo Snapshot....
+label.action.delete.snapshot=Remover Snapshot
+label.action.delete.template.processing=Removendo Template....
+label.action.delete.template=Remover Template
+label.action.delete.user.processing=Removendo Usuário....
+label.action.delete.user=Remover Usuário
+label.action.delete.volume.processing=Removendo Disco....
+label.action.delete.volume=Remover Disco
+label.action.delete.zone.processing=Removendo Zona....
+label.action.delete.zone=Remover Zona
+label.action.destroy.instance.processing=Apagando Cloud Server....
+label.action.destroy.instance=Apagar Cloud Server
+label.action.destroy.systemvm.processing=Apagando VM de Sistema....
+label.action.destroy.systemvm=Apagar VM de Sistema
+label.action.detach.disk.processing=Desplugando Disco....
+label.action.detach.disk=Desplugar Disco
+label.action.detach.iso.processing=Desplugando ISO....
+label.action.detach.iso=Desplugar ISO
+label.action.disable.account.processing=Desativando conta....
+label.action.disable.account=Desativar conta
+label.action.disable.static.NAT.processing=Desativando NAT Estático....
+label.action.disable.static.NAT=Desativar NAT Estático
+label.action.disable.user.processing=Desativando Usuário....
+label.action.disable.user=Desativar Usuário
+label.action.download.ISO=Baixar ISO
+label.action.download.template=Baixar Template
+label.action.download.volume.processing=Baixando Disco....
+label.action.download.volume=Baixar Disco
+label.action.edit.ISO=Editar ISO
+label.action.edit.account=Editar conta
+label.action.edit.disk.offering=Editar Oferta de Disco
+label.action.edit.domain=Editar DomÃnio
+label.action.edit.global.setting=Editar Configurações Globais
+label.action.edit.instance=Editar Cloud Server
+label.action.edit.network.offering=Editar Oferta de Rede
+label.action.edit.pod=Editar Pod
+label.action.edit.primary.storage=Editar Storage Primário
+label.action.edit.resource.limits=Editar Limite de Recursos
+label.action.edit.service.offering=Editar Plano
+label.action.edit.template=Editar Template
+label.action.edit.user=Editar Usuário
+label.action.edit.zone=Editar Zona
+label.action.enable.account.processing=Ativando conta....
+label.action.enable.account=Ativar conta
+label.action.enable.maintenance.mode.processing=Ativando Modo de Manutenção....
+label.action.enable.maintenance.mode=Ativar Modo de Manutenção
+label.action.enable.static.NAT.processing=Ativando NAT Estático....
+label.action.enable.static.NAT=Ativar NAT Estático
+label.action.enable.user.processing=Ativando Usuário....
+label.action.enable.user=Ativar Usuário
+label.action.force.reconnect.processing=Reconectando....
+label.action.force.reconnect=Force Reconnect
+label.action.generate.keys.processing=Gerando Chaves....
+label.action.generate.keys=Gerar Chaves
+label.action.lock.account.processing=Bloqueando conta....
+label.action.lock.account=Bloquear conta
+label.action.migrate.instance=Migrar Cloud Server
+label.action.migrate.instance.processing=Migrando Cloud Server...
+label.action.reboot.instance.processing=Reiniciando Cloud Server...
+label.action.reboot.instance=Reiniciar Cloud Server
+label.action.reboot.router.processing=Reiniciando Roteador....
+label.action.reboot.router=Reiniciar Roteador
+label.action.reboot.systemvm.processing=Reiniciando VM de Sistema....
+label.action.reboot.systemvm=Reiniciar VM de Sistema
+label.action.recurring.snapshot=Snapshot Recorrente
+label.action.release.ip.processing=Liberando IP....
+label.action.release.ip=Liberar IP
+label.action.remove.host.processing=Removendo Host....
+label.action.remove.host=Remover Host
+label.action.reset.password.processing=Recuperando a Senha....
+label.action.reset.password=Recuperar Senha
+label.action.resource.limits=Limite de Recursos
+label.action.restore.instance.processing=Restaurando Cloud Server...
+label.action.restore.instance=Restaurar Cloud Server
+label.action.start.instance.processing=Iniciando Cloud Server...
+label.action.start.instance=Iniciar Cloud Server
+label.action.start.router.processing=Iniciando Roteador....
+label.action.start.router=Iniciar Roteador
+label.action.start.systemvm.processing=Iniciando VM de Sistema....
+label.action.start.systemvm=Iniciar VM de Sistema
+label.action.stop.instance.processing=Parando Cloud Server...
+label.action.stop.instance=Parar Cloud Server
+label.action.stop.router.processing=Parando Roteador....
+label.action.stop.router=Parar Roteador
+label.action.stop.systemvm.processing=Parando VM de Sistema....
+label.action.stop.systemvm=Parar VM de Sistema
+label.action.take.snapshot.processing=Tirando Snapshot....
+label.action.take.snapshot=Tirar Snapshot
+label.action.update.OS.preference.processing=Atualizando Preferência de SO....
+label.action.update.OS.preference=Atualizar Preferência de SO
+label.actions=Ações
+label.active.sessions=Sessões Ativas
+label.add.account=Adicionar Conta
+label.add.by.cidr=Adicionar por CIDR
+label.add.by.group=Adicionar por Grupo
+label.add.cluster=Adicionar Cluster
+label.add.direct.iprange=Add Direct Ip Range
+label.add.disk.offering=Adicionar Oferta de Disco
+label.add.domain=Adicionar DomÃnio
+label.add.firewall=Adicionar Firewall
+label.add.host=Adicionar Host
+label.add.ingress.rule=Adicionar Regra de Entrada
+label.add.ip.range=Adicionar Range de IP
+label.add.iso=Adicionar ISO
+label.add.load.balancer=Adicionar Load Balance
+label.add.more=Adicionar Mais
+label.add.network=Adicionar Rede
+label.add.pod=Adicionar POD
+label.add.primary.storage=Adicionar Storage Primário
+label.add.secondary.storage=Adicionar Storage Secundário
+label.add.security.group=Adicionar Security Group
+label.add.service.offering=Adicionar Plano
+label.add.system.service.offering=Adicionar Plano para VM de Sistema
+label.add.template=Adicionar Template
+label.add.user=Adicionar Usuário
+label.add.vlan=Adicionar VLAN
+label.add.volume=Adicionar Disco
+label.add.zone=Adicionar Zona
+label.add=Adicionar
+label.adding.cluster=Adicionando Cluster
+label.adding.failed=Falha ao Adicionar
+label.adding.pod=Adicionando POD
+label.adding.processing=Adicionando....
+label.adding.succeeded=Adicionado com Sucesso
+label.adding.user=Adicionando Usuário
+label.adding.zone=Adicionando Zona
+label.adding=Adicionando
+label.additional.networks=Redes Adicionais
+label.admin.accounts=Contas Administrativas
+label.admin=Administrador
+label.advanced.mode=Modo Avançado
+label.advanced.search=Busca Avançada
+label.advanced=Avançado
+label.alert=Alerta
+label.algorithm=Algoritmo
+label.allocated=Alocado
+label.api.key=API Key
+label.assign.to.load.balancer=Atribuindo o Cloud Server ao Load Balancer
+label.assign=Atribuir
+label.associated.network.id=ID de Rede Associado
+label.attached.iso=Imagem ISO Plugada
+label.availability.zone=Datacenter
+label.availability=Availability
+label.available.public.ips=IP Público DisponÃvel
+label.available=DisponÃvel
+label.back=Voltar
+label.basic.mode=Modo Básico
+label.bootable=Inicializável
+label.broadcast.domain.type=Tipo de DomÃnio Broadcast
+label.by.account=por Conta
+label.by.availability=By Availability
+label.by.domain=por DomÃnio
+label.by.end.date=por Data Final
+label.by.level=por NÃvel
+label.by.pod=por Pod
+label.by.role=por Função
+label.by.start.date=por Data Inicial
+label.by.state=por estado
+label.by.traffic.type=por Tipo de Tráfego
+label.by.type.id=por Tipo de ID
+label.by.type=por Tipo
+label.by.zone=por Zona
+label.bytes.received=Bytes Recebidos
+label.bytes.sent=Bytes Enviados
+label.cancel=Cancelar
+label.certificate=Certificado
+label.privatekey=PKCS#8 Private Key
+label.domain.suffix=Sufixo de DomÃnio DNS (ex. xyz.com)
+label.character=Caracter
+label.cidr.account=CIDR ou Conta/Security Group
+label.close=Fechar
+label.cloud.console=Console de Gerenciamento da Nuvem
+label.cloud.managed=Cloud.com Managed
+label.cluster.type=Tipo de Cluster
+label.cluster=Cluster
+label.code=Código
+label.confirmation=Confirmação
+label.cpu.allocated.for.VMs=CPU Alocada por VMs
+label.cpu.allocated=CPU Alocada
+label.cpu.mhz=CPU (em MHz)
+label.cpu.utilized=CPU Utilizada
+label.cpu=CPU
+label.created=Criado
+label.cross.zones=Inter Zonas
+label.custom.disk.size=Tamanho Customizado
+label.daily=Diário
+label.data.disk.offering=Oferta de Disco Adicional
+label.date=Data
+label.day.of.month=Dia do Mês
+label.day.of.week=Dia da Semana
+label.delete=Remover
+label.deleting.failed=Falha ao remover
+label.deleting.processing=Removendo....
+label.description=Descrição
+label.detaching.disk=Desplugando Disco
+label.details=Detalhes
+label.device.id=ID do Dispositivo
+label.disabled=Desativado
+label.disabling.vpn.access=Desativando Acesso VPN
+label.disk.allocated=Disco Alocado
+label.disk.offering=Oferta de Disco
+label.disk.size.gb=Tamanho (em GB)
+label.disk.size=Tamanho do Disco
+label.disk.total=Disco Total
+label.disk.volume=Disco
+label.display.text=Descrição
+label.dns.1=DNS 1
+label.dns.2=DNS 2
+label.domain.admin=Administrador de DomÃnio
+label.domain.id=ID do DomÃnio
+label.domain.name=Nome do DomÃnio
+label.domain=DomÃnio
+label.double.quotes.are.not.allowed=Aspas duplas não são permitidas
+label.download.progress=Status do Download
+label.edit=Editar
+label.email=Email
+label.enabling.vpn.access=Ativando Acesso VPN
+label.enabling.vpn=Ativando VPN
+label.end.port=Porta Final
+label.endpoint.or.operation=Endpoint or Operation
+label.error.code=Código de Erro
+label.error=Erro
+label.esx.host=ESX/ESXi Host
+label.example=Examplo
+label.failed=Falhou
+label.featured=Featured
+label.firewall=Firewall
+label.first.name=Primeiro Nome
+label.format=Formato
+label.friday=Sexta-feira
+label.full=Full
+label.gateway=Gateway
+label.general.alerts=Alertas Gerais
+label.generating.url=Criando URL
+label.generating.url=Criando URL
+label.go.step.2=Vá para passo 2
+label.go.step.3=Vá para passo 3
+label.go.step.4=Vá para passo 4
+label.go.step.5=Vá para passo 5
+label.group.optional=Grupo (Opcional)
+label.group=Grupo
+label.guest.cidr=CIDR de rede Convidado
+label.guest.gateway=Gateway de rede Convidado
+label.guest.ip.range=Intervalo de rede convidado
+label.guest.ip=Endereço IP Convidado
+label.guest.netmask=Máscara de rede Convidado
+label.ha.enabled=HA Ativado
+label.help=Ajuda
+label.host.alerts=Alertas de Host
+label.host.name=Nome do Host
+label.host=Host
+label.hosts=Hosts
+label.hourly=A cada hora
+label.hypervisor.type=Tipo do Hypervisor
+label.hypervisor=Hypervisor
+label.id=ID
+label.info=Info
+label.ingress.rule=Regra de Entrada
+label.initiated.by=Iniciado por
+label.instance.limits=Limites do Cloud Server
+label.instance.name=Nome do Cloud Server
+label.instance=Cloud Server
+label.instances=Cloud Servers
+label.internal.dns.1=DNS 1 Interno
+label.internal.dns.2=DNS 2 Interno
+label.interval.type=Tipo de Intervalo
+label.invalid.integer=Invalid Integer
+label.invalid.number=Número Inválido
+label.ip.address=Endereço IP
+label.ip.allocations=Alocações de IP
+label.ip.limits=Limites de IP Público
+label.ip.or.fqdn=IP ou FQDN
+label.ip.range=Range de IP
+label.ip=IP
+label.ips=IPs
+label.is.default=Ã\u0089 Padrão
+label.is.shared=Ã\u0089 Compartilhado
+label.is.system=Ã\u0089 Sistema
+label.iscsi=iSCSI
+label.iso.boot=ISO de Boot
+label.iso=ISO
+label.isolation.mode=Modo Isolado
+label.keep=Manter
+label.lang.chinese=Chinese (Simplified)
+label.lang.english=English
+label.lang.japanese=Japanese
+label.lang.spanish=Spanish
+label.last.disconnected=Last Disconnected
+label.last.name=Ã\u009altimo Nome
+label.level=NÃvel
+label.linklocal.ip=Endereço IP Link Local
+label.load.balancer=Load Balancer
+label.loading=Carregando
+label.local=Local
+label.login=Entrar
+label.logout=Sair
+label.lun=LUN
+label.manage=Gerenciar
+label.maximum=Máximo
+label.memory.allocated=Memória Alocada
+label.memory.mb=Memória (em MB)
+label.memory.total=Memória Total
+label.memory.used=Memória Usada
+label.memory=Memória
+label.menu.accounts=Contas
+label.menu.alerts=Alertas
+label.menu.all.accounts=Todas as Contas
+label.menu.all.instances=Todos Cloud Servers
+label.menu.community.isos=ISOs Públicas
+label.menu.community.templates=Templates Públicos
+label.menu.configuration=Configuração
+label.menu.dashboard=Dashboard
+label.menu.destroyed.instances=Cloud Servers Apagados
+label.menu.disk.offerings=Oferta de Discos
+label.menu.domains=DomÃnios
+label.menu.events=Eventos
+label.menu.featured.isos=ISOs Customizada
+label.menu.featured.templates=Templates Customizados
+label.menu.global.settings=Configurações Globais
+label.menu.instances=Cloud Servers
+label.menu.ipaddresses=Endereço IP
+label.menu.isos=ISOs
+label.menu.my.accounts=Minhas Contas
+label.menu.my.instances=Meus Cloud Servers
+label.menu.my.isos=Minhas ISOs
+label.menu.my.templates=Meus Templates
+label.menu.network.offerings=Oferta de Rede
+label.menu.network=Rede
+label.menu.physical.resources=Recursos FÃsicos
+label.menu.running.instances=Cloud Servers Rodando
+label.menu.security.groups=Security Groups
+label.menu.service.offerings=Planos
+label.menu.system.service.offerings=System Service Offering
+label.menu.snapshots=Snapshots
+label.menu.stopped.instances=Cloud Servers Parados
+label.menu.storage=Storage
+label.menu.system.vms=VM de Sistema
+label.menu.system=Sistema
+label.menu.templates=Templates
+label.menu.virtual.appliances=Appliance Virtual
+label.menu.virtual.resources=Recursos Virtuais
+label.menu.volumes=Discos
+label.migrate.instance.to=Migrar Cloud Server para
+label.minimum=MÃnimo
+label.minute.past.hour=Minute(s) Past the Hour
+label.monday=Segunda
+label.monthly=Mensal
+label.more.templates=Mais Templates
+label.my.account=Minha Conta
+label.name.optional=Nome (Opcional)
+label.name=Nome
+label.netmask=Másrca de Rede
+label.network.desc=Descrição de Rede
+label.network.domain=DomÃnio de Rede
+label.network.id=ID de Rede
+label.network.name=Nome de Rede
+label.network.offering.display.text=Network Offering Display Text
+label.network.offering.id=Network Offering ID
+label.network.offering.name=Network Offering Name
+label.network.offering=Network Offering
+label.network.rate=Taxa de Transferência
+label.network.read=Network Read
+label.network.type=Tipo de Rede
+label.network.write=Network Write
+label.network=Rede
+label.new.password=Nova Senha
+label.next=Próximo
+label.nfs.server=Servidor NFS
+label.nfs.storage=Storage NFS
+label.nfs=NFS
+label.nics=REDE
+label.no.actions=Sem Ações DisponÃveis
+label.no.alerts=Sem Alertas Recentes
+label.no.errors=Sem Erros Recentes
+label.no.isos=Sem ISO DisponÃvel
+label.no.items=Sem Ã\u008dtens DisponÃveis
+label.no.security.groups=Sem Security Groups DisponÃveis
+label.no.thanks=Não, Obrigado
+label.no=Não
+label.none=Nenhum
+label.not.found=Não Encontrado
+label.num.cpu.cores=# de Core CPU
+label.numretries = Número de Tentativas
+label.offer.ha=Offer HA
+label.optional=Opcional
+label.os.preference=Preferência de SO
+label.os.type=Tipo de SO
+label.owned.public.ips=IP Público Utilizado
+label.owner.account=Dono da Conta
+label.owner.domain=Dono do DomÃnio
+label.parent.domain=DomÃnio Principal
+label.password.enabled=Senha Ativada
+label.password=Senha
+label.path=Caminho (Path)
+label.please.wait=Por Favor Aguarde
+label.pod=POD
+label.port.forwarding=Encaminhamento de Porta
+label.port.range=Range de Porta
+label.prev=Prev
+label.primary.allocated=Alocação do Storage Primário
+label.primary.network=Rede Primária
+label.primary.storage=Storage Primário
+label.primary.used=Uso do Storage Primário
+label.private.interface=Interface Privada
+label.private.ip.range=Range de IP Privado
+label.private.ip=Endereço IP Privado
+label.private.ips=IPs Privados
+label.private.port=Porta Privada
+label.private.zone=Zona Privada
+label.protocol=Protocolo
+label.protocol=Protocolo
+label.public.interface=Interface Pública
+label.public.ip=Endereço IP Público
+label.public.ips=IPs Públicos
+label.public.port=Porta Pública
+label.public.zone=Zona Pública
+label.public=Público
+label.recent.errors=Erros Recentes
+label.refresh=Atualizar
+label.related=Relacionado
+label.remove.from.load.balancer=Removendo Cloud Server do Load Balancer
+label.removing.user=Removendo Usuário
+label.required=Requerido
+label.reserved.system.ip=IP de Sistema Reservado
+label.resource.limits=Limite de Recursos
+label.resource=Recurso
+label.resources=Recursos
+label.role=Função
+label.root.disk.offering=Oferta de Disco ROOT
+label.running.vms=VMs Rodando
+label.saturday=Sábado
+label.save=Salvar
+label.saving.processing=Salvando....
+label.scope=Escopo
+label.search=Pesquisar
+label.secondary.storage=Storage Secundário
+label.secondary.used=Uso do Storage Secundário
+label.secret.key=Chave Secreta
+label.security.group.name=Nome do Security Group
+label.security.group=Security Group
+label.security.groups.enabled=Security Groups Ativado
+label.security.groups=Security Groups
+label.sent=Enviado
+label.server=Servidor
+label.service.offering=Plano
+label.system.service.offering=System Service Offering
+label.session.expired=Sessão Expirada
+label.shared=Compatilhado
+label.size=Tamanho
+label.snapshot.limits=Limites de Snapshot
+label.snapshot.name=Nome do Snapshot
+label.snapshot.s=Snapshot (s)
+label.snapshot.schedule=Agenda de Snapshot
+label.snapshot=Snapshot
+label.snapshots=Snapshots
+label.source.nat=Source NAT
+label.specify.vlan=Especificar VLAN
+label.start.port=Porta de InÃcio
+label.state=Estado
+label.static.nat.to=NAT Estático para
+label.static.nat=NAT Estático
+label.statistics=EstatÃsticas
+label.status=Estado
+label.step.1.title=Passo 1\: Selecione o Template
+label.step.1=Passo 1
+label.step.2.title=Passo 2\: Plano
+label.step.2=Passo 2
+label.step.3.title=Passo 3\: Selecione o Disco Adicional
+label.step.3=Passo 3
+label.step.4.title=Passo 4\: Rede
+label.step.4=Passo 4
+label.step.5.title=Passo 5\: Revisar
+label.step.5=Passo 5
+label.stopped.vms=VMs Paradas
+label.storage.type=Tipo de Storage
+label.storage=Storage
+label.submit=Enviar
+label.submitted.by=[Enviado por\: ]
+label.succeeded=Sucedido
+label.sunday=Domingo
+label.system.capacity=Capacidade Geral
+label.system.vm.type=Tipo de VM de Sistema
+label.system.vm.type=Tipo de VM de Sistema
+label.system.vm=VM de Sistema
+label.system.vms=VM de Sistemas
+label.tagged=Tagged
+label.tags=Tags
+label.target.iqn=Target IQN
+label.template.limits=Limites do Template
+label.template=Template
+label.theme.default=Tema Padrão
+label.theme.grey=Custom - Grey
+label.theme.lightblue=Custom - Light Blue
+label.thursday=Quinta
+label.time.zone=Fuso Horário
+label.time=Time
+label.timeout.in.second = Timeout(segundos)
+label.timezone=Fuso Horário
+label.total.cpu=CPU TOTAL
+label.total.vms=Total VMs
+label.traffic.type=Tipo de Tráfego
+label.tuesday=Terça
+label.type.id=Tipo do ID
+label.type=Tipo
+label.unavailable=IndisponÃvel
+label.unlimited=Ilimitado
+label.untagged=Não Marcado
+label.update.ssl.cert=Atualizar Certificado SSL
+label.update.ssl=Atualizar Certificado SSL
+label.updating=Atualizando
+label.url=URL
+label.usage.interface=Usage Interface
+label.used=Usado
+label.user=Usuário
+label.username=Nome de Usuário
+label.users=Usuários
+label.value=Valor
+label.vcenter.cluster=vCenter Cluster
+label.vcenter.datacenter=vCenter Datacenter
+label.vcenter.datastore=vCenter Datastore
+label.vcenter.host=vCenter Host
+label.vcenter.password=vCenter Password
+label.vcenter.username=vCenter Username
+label.version=Versão
+label.virtual.appliance=Appliance Virtual
+label.virtual.appliances=Appliances Virtuais
+label.virtual.network=Rede Virtual
+label.vlan.id=VLAN ID
+label.vlan.range=Intervalo de VLAN
+label.vlan=VLAN
+label.vm.add=Adicionar Cloud Server
+label.vm.destroy=Apagar
+label.vm.reboot=Reiniciar
+label.vm.start=Iniciar
+label.vm.stop=Parar
+label.vmfs=VMFS
+label.vms=VMs
+label.volume.limits=Limites de Disco
+label.volume.name=Nome do Disco
+label.volume=Disco
+label.volumes=Discos
+label.vpn=VPN
+label.vsphere.managed=vSphere Managed
+label.waiting=Aguardando
+label.warn=Avisar
+label.wednesday=Quarta-Feira
+label.weekly=Semanal
+label.welcome.cloud.console=Painel de Controle
+label.welcome=Bem-Vindo
+label.yes=Sim
+label.zone.id=ID da Zona
+label.zone.step.1.title=Passo 1\: Selecionar a Rede
+label.zone.step.2.title=Passo 2\: Adicionar a Zona
+label.zone.step.3.title=Passo 3\: Adicionar o POD
+label.zone.step.4.title=Passo 4\: Adicionar um Intervalo de IP
+label.zone.wide=Zone-Wide
+label.zone=Zona
+
+#Messages
+message.acquire.public.ip=Selecione a zona de onde você deseja adquirir o novo IP
+message.action.cancel.maintenance.mode=Confirme que você deseja cancelar esta manutenção
+message.action.cancel.maintenance=A manutenção do seu HOST foi cancelada com sucesso
+message.action.delete.ISO.for.all.zones=Esta ISO é usada por todas as Zonas. Confirme se você deseja excluir a ISO de todas as Zonas
+message.action.delete.ISO=Confirme que você deseja excluir esta ISO
+message.action.delete.cluster=Confirme que você deseja excluir este HOST
+message.action.delete.disk.offering=Confirme que você deseja excluir esta oferta de disco
+message.action.delete.domain=Confirme que você deseja excluir este domÃnio
+message.action.delete.external.firewall=Confirme que você gostaria de remover este Firewall externo. Aviso\: Se você está planejando adicionar novamente este mesmo Firewall, é necessário apagar os contadores do dispositivo.
+message.action.delete.external.load.balancer=Confirme que você gostaria de remover este Load Balancer Externo. Aviso\: Se você está planejando adicionar novamente este mesmo Load Balancer, é necessário apagar os contadores do dispositivo.
+message.action.delete.ingress.rule=Confirme que você deseja excluir esta regra de entrada.
+message.action.delete.network=Confirme que você deseja remover esta rede.
+message.action.delete.pod=Confirme que você deseja remover este POD.
+message.action.delete.primary.storage=Confirme que você deseja remover este Storage Primário.
+message.action.delete.secondary.storage=Confirme que você deseja remover este Storage Secundário.
+message.action.delete.security.group=Confirme que você deseja remover este Security Group.
+message.action.delete.service.offering=Confirme que você deseja remover este Plano.
+message.action.delete.snapshot=Confirme que você deseja remover este Snapshot.
+message.action.delete.template.for.all.zones=Este Template é usado por todas as zonas. Confirme que você deseja remover o Template de todas as zonas.
+message.action.delete.template=Confirme que você deseja remover este Template.
+message.action.delete.volume=Confirme que você deseja remover este Disco.
+message.action.delete.zone=Confirme que você deseja remover esta Zona.
+message.action.destroy.instance=Confirme que você deseja excluir este Cloud Server.
+message.action.destroy.systemvm=Confirme que você deseja excluir esta VM de Sistema.
+message.action.disable.static.NAT=Confirme que você deseja desativar o NAT estático.
+message.action.enable.maintenance=O Host foi preparado com sucesso para manutenção. Este processo poderá levar alguns minutos ou mais dependendo do número de VMs hospedadas neste Host.
+message.action.force.reconnect=O procedimento de reconexão forçada foi preparado com sucesso. Este processo poderá levar alguns minutos.
+message.action.force.reconnect=O procedimento de reconexão forçada foi preparado com sucesso. Este processo poderá levar alguns minutos.
+message.action.host.enable.maintenance.mode=Ativar o modo de manutenção irá causar o live migration de todos Cloud Server hospedados neste Host para o próximo disponÃvel.
+message.action.instance.reset.password=Confirme que você deseja trocar a senha de ROOT para este Cloud Server.
+message.action.primarystorage.enable.maintenance.mode=Aviso\: Colocar o Storage primário em modo de manutenção irá causar a parada de todas as VMs hospedadas nesta unidade. Deseja continuar?
+message.action.reboot.instance=Confirme que você deseja reiniciar este Cloud Server.
+message.action.reboot.router=Confirme que você deseja reiniciar este roteador.
+message.action.reboot.systemvm=Confirme que você deseja reiniciar esta VM de sistema.
+message.action.release.ip=Confirme que você deseja liberar este IP.
+message.action.remove.host=Remover o único/último host do cluster e reinstalar o host irá provocar a perda do ambiente/banco do host tornando os Cloud Servers inutilizáveis.
+message.action.restore.instance=Confirme que você deseja restaurar este Cloud Server.
+message.action.start.instance=Confirme que você deseja iniciar este Cloud Server.
+message.action.start.router=Confirme que você deseja inciar este roteador.
+message.action.start.systemvm=Confirme que você deseja iniciar esta VM de sistema.
+message.action.stop.instance=Confirme que você deseja parar este Cloud Server.
+message.action.stop.router=Confirme que você deseja parar este roteador.
+message.action.stop.systemvm=Confirme que você deseja parar esta VM de Sistema.
+message.action.take.snapshot=Confirme que você deseja gerar um Snapshot.
+message.add.cluster.zone=Add a hypervisor managed cluster for zone
+message.add.cluster=Add a hypervisor managed cluster for zone , pod
+message.add.disk.offering=Especifique o seguintes parâmetros para adicionar uma nova oferta de disco.
+message.add.firewall=Adicionar Firewall à zona.
+message.add.host=Especifique os seguintes parâmetros para adicionar um novo host.
+message.add.ip.range.direct.network=Add an IP range to direct network in zone
+message.add.ip.range.to.pod=Add an IP range to pod\:
+message.add.ip.range=Add an IP range to public network in zone
+message.add.load.balancer=Add a load balancer to zone
+message.add.network=Add a new network for zone\:
+message.add.pod=Add a new pod for zone
+message.add.primary.storage=Adicionar novo Storage primário à zona , pod
+message.add.primary=Especifique os seguintes parâmetros para adicionar um novo Storage primário.
+message.add.secondary.storage=Add a new storage for zone
+message.add.service.offering=Preencha os seguintes dados para adicionar um novo plano.
+message.add.template=Entre com os dados para criar um novo template.
+message.add.volume=Entre com os dados para criar um novo disco.
+message.additional.networks.desc=Selecione a(s) rede(s) adicionais que seu Cloud Server terá acesso.
+message.advanced.mode.desc=Escolhe este modelo de rede se deseja ter habilitar o suporte a VLAN. Este modelo permite maior flexibilidade ao administrador ao permitir ofertas de rede customizada, firewall, vpn ou load balancer bem como acesso via rede virtual ou acesso direto.
+message.advanced.security.group=Escolha esta opção se desejar utilizar Security Groups para isolamento das VMs guest.
+message.advanced.virtual=Escolha esta opção se desejar utilizar VLANs para isolamento das VMs guest.
+message.allow.vpn.access=Entre com nome de usuário e senha do usuário que terá acesso VPN.
+message.attach.iso.confirm=Confirme que você deseja conectar a ISO ao Cloud Server.
+message.attach.volume=Preencha os seguintes dados para conectar o novo disco. Se você está conectando um disco a um Cloud Server Windows, será necessário reiniciar o Cloud Server para visualizar o novo disco.
+message.basic.mode.desc=Escolha este modelo de rede se você *não* quer suporte a VLAN. Todo Cloud Server criado neste modelo de rede estará ligado diretamente a um IP da rede e será usado Security Groups para prover segurança e separação.
+message.change.offering.confirm=Confirme que você deseja mudar o plano deste Cloud Server.
+message.copy.iso.confirm=Confirme se você deseja copiar a ISO para
+message.copy.template=Copiar template XXX da zona para
+message.create.template.vm=Criar VM do template
+message.create.template.volume=Especifique as seguintes informações antes de criar o template a partir do disco\: . A criação de um template a partir de um disco pode levar alguns minutos ou mais dependendo do tamnho do disco.
+message.delete.account=Confirme se você deseja excluir esta conta.
+message.detach.iso.confirm=Confirme se você deseja desconectar a ISO do Cloud Server.
+message.disable.account=Confirme se você deseja desativar a conta. Desativando a conta, todos os usuários desta conta não poderão acessar seus recursos na nuvem. Todos Cloud Server serão automaticamente desligados.
+message.disable.vpn.access=Confirme se você deseja desativar o acesso VPN.
+message.download.ISO=Clique 00000 para baixar a ISO
+message.download.template=Clique 00000 para baixar o template
+message.download.volume=Clique 00000 para baixar o disco
+message.edit.confirm=Confira as alterações antes de clicar em 'Salvar'.
+message.edit.limits=Especifique os limites para os seguintes recursos. "-1" indica sem limite para o total de recursos criados.
+message.enable.account=Confirme se você deseja ativar a conta.
+message.enable.vpn.access=VPN está desativada para este endereço IP. Gostaria de ativar o acesso VPN?
+message.enable.vpn=Acesso VPN não está ativado. Por favor clique aqui para ativar a VPN.
+message.enabled.vpn.ip.sec=Sua chave IPSec (pre-shared) é
+message.enabled.vpn=Seu acesso VPN está ativado e pode ser acessado através do IP
+message.launch.vm.on.private.network=Você deseja carregar seu Cloud Server na sua rede privada dedicada?
+message.lock.account=Confirme se você deseja bloquear esta conta. Bloqueando a conta, todos os usuários desta conta não estarão mais habilitados a gerenciar os recursos na nuvem. Os recursos existentes (Cloud Server) ainda poderão ser acessados.
+message.migrate.instance.confirm=Confirme o host que você deseja migrar o Cloud Server.
+message.new.user=Especifique a seguir para adicionar um novo usuário na conta
+message.no.network.support.configuration.not.true=Você não possui nenhuma zona com Security Group ativado. Assim, sem recursos de rede adicionais. Por favor vá para o passo 5.
+message.no.network.support=O hypervisor escolhido, vSphere, não possui nenhum recurso de rede adicional. Por favor, vá para o passo 5.
+message.number.clusters=Clusters
+message.number.hosts=Hosts
+message.number.pods=PODs
+message.number.storage=Volumes do Storage Primário
+message.number.zones=Zonas
+message.remove.vpn.access=Confirme se você deseja remover acesso VPN do seguinte usuário.
+message.restart.mgmt.server=Reinicie o(s) servidor(es) de gerenciamento para que a nova configuração tenha efeito.
+message.security.group.usage=(Use Ctrl-clique para selecionar todos os Security Groups)
+message.snapshot.schedule=Você pode configurar Snapshots recorrentes agendados selecionando as opções disponÃveis abaixo
+message.step.1.continue=Selecione o template ou ISO para continuar
+message.step.1.desc=Selecione o template para o novo Cloud Server.
+message.step.2.continue=Selecione o plano
+message.step.2.desc=
+message.step.3.continue=Seleciona a oferta de disco
+message.step.3.desc=
+message.step.4.continue=Selecione pelo menos uma rede para continuar
+message.step.4.desc=Selecione a rede principal que seu Cloud Server será conectado.
+message.update.os.preference=Escolha o SO de preferencia para este host. Todos Cloud Server com preferencias similares serão alocados neste host antes de tentar em outro.
+message.update.ssl=Envie o novo certificado SSL X.509 para ser atualizado em cada console proxy\:
+message.virtual.network.desc=Rede virtual dedicado para sua conta. O domÃnio de broadcast está na VLAN e todo acesso a internet é roteado através do virtual router.
+message.volume.create.template.confirm=Confirme se você deseja criar um template a partir deste disco. A criação do template pode levar alguns minutos ou mais dependendo do tamanho do disco.
+message.zone.step.1.desc=Seleciona o modelo de rede para a zona.
+message.zone.step.2.desc=Entre com as informações a seguir para adicionar a nova zona
+message.zone.step.3.desc=Entre com as informações a seguir para adicionar o novo POD
+message.apply.snapshot.policy=Você atualizou com sucesso sua polÃtica de Snapshot.
+message.disable.snapshot.policy=Você desativou com sucesso sua polÃtica de Snapshot.
+message.action.change.service.warning.for.instance=Para troca de plano é necessário parar o Cloud Server.
+message.action.change.service.warning.for.router=O roteador precisa ser desligado antes de trocar o plano/tamanho.
+message.action.reset.password.warning=Para recuperar a senha é necessário parar o Cloud Server.
+message.action.reset.password.off=Seu Cloud Server não suporta esta funcionalidade.
+
+#Errors
+error.login=Usuário ou senha inválido.
+error.menu.select=ImpossÃvel executar ação. Selecionar um ou mais itens.
+error.mgmt.server.inaccessible=O servidor de gerenciamento está inacessÃvel. Tente novamente mais tarde.
+error.session.expired=Sua sessão expirou.
+error.unresolved.internet.name=ImpossÃvel resolver DNS
diff --git a/console-proxy/js/ajaxviewer.js b/console-proxy/js/ajaxviewer.js
index f6db321c0b8..14c80fde5c1 100644
--- a/console-proxy/js/ajaxviewer.js
+++ b/console-proxy/js/ajaxviewer.js
@@ -232,6 +232,103 @@ JsX11KeyboardMapper.prototype.inputFeed = function(eventType, code, modifiers) {
}
}
+/////////////////////////////////////////////////////////////////////////////
+//JsCookedKeyboardMapper
+// For Xen/KVM hypervisors, it accepts "cooked" keyborad events
+//
+function JsCookedKeyboardMapper() {
+ KeyboardMapper.apply(this, arguments);
+
+ this.jsX11KeysymMap = [];
+ this.jsX11KeysymMap[AjaxViewer.JS_KEY_CAPSLOCK] = AjaxViewer.X11_KEY_CAPSLOCK;
+ this.jsX11KeysymMap[AjaxViewer.JS_KEY_BACKSPACE] = AjaxViewer.X11_KEY_BACKSPACE;
+ this.jsX11KeysymMap[AjaxViewer.JS_KEY_TAB] = AjaxViewer.X11_KEY_TAB;
+ this.jsX11KeysymMap[AjaxViewer.JS_KEY_ENTER] = AjaxViewer.X11_KEY_ENTER;
+ this.jsX11KeysymMap[AjaxViewer.JS_KEY_ESCAPE] = AjaxViewer.X11_KEY_ESCAPE;
+ this.jsX11KeysymMap[AjaxViewer.JS_KEY_INSERT] = AjaxViewer.X11_KEY_INSERT;
+ this.jsX11KeysymMap[AjaxViewer.JS_KEY_DELETE] = AjaxViewer.X11_KEY_DELETE;
+ this.jsX11KeysymMap[AjaxViewer.JS_KEY_HOME] = AjaxViewer.X11_KEY_HOME;
+ this.jsX11KeysymMap[AjaxViewer.JS_KEY_END] = AjaxViewer.X11_KEY_END;
+ this.jsX11KeysymMap[AjaxViewer.JS_KEY_PAGEUP] = AjaxViewer.X11_KEY_PAGEUP;
+ this.jsX11KeysymMap[AjaxViewer.JS_KEY_PAGEDOWN] = AjaxViewer.X11_KEY_PAGEDOWN;
+ this.jsX11KeysymMap[AjaxViewer.JS_KEY_LEFT] = AjaxViewer.X11_KEY_LEFT;
+ this.jsX11KeysymMap[AjaxViewer.JS_KEY_UP] = AjaxViewer.X11_KEY_UP;
+ this.jsX11KeysymMap[AjaxViewer.JS_KEY_RIGHT] = AjaxViewer.X11_KEY_RIGHT;
+ this.jsX11KeysymMap[AjaxViewer.JS_KEY_DOWN] = AjaxViewer.X11_KEY_DOWN;
+ this.jsX11KeysymMap[AjaxViewer.JS_KEY_F1] = AjaxViewer.X11_KEY_F1;
+ this.jsX11KeysymMap[AjaxViewer.JS_KEY_F2] = AjaxViewer.X11_KEY_F2;
+ this.jsX11KeysymMap[AjaxViewer.JS_KEY_F3] = AjaxViewer.X11_KEY_F3;
+ this.jsX11KeysymMap[AjaxViewer.JS_KEY_F4] = AjaxViewer.X11_KEY_F4;
+ this.jsX11KeysymMap[AjaxViewer.JS_KEY_F5] = AjaxViewer.X11_KEY_F5;
+ this.jsX11KeysymMap[AjaxViewer.JS_KEY_F6] = AjaxViewer.X11_KEY_F6;
+ this.jsX11KeysymMap[AjaxViewer.JS_KEY_F7] = AjaxViewer.X11_KEY_F7;
+ this.jsX11KeysymMap[AjaxViewer.JS_KEY_F8] = AjaxViewer.X11_KEY_F8;
+ this.jsX11KeysymMap[AjaxViewer.JS_KEY_F9] = AjaxViewer.X11_KEY_F9;
+ this.jsX11KeysymMap[AjaxViewer.JS_KEY_F10] = AjaxViewer.X11_KEY_F10;
+ this.jsX11KeysymMap[AjaxViewer.JS_KEY_F11] = AjaxViewer.X11_KEY_F11;
+ this.jsX11KeysymMap[AjaxViewer.JS_KEY_F12] = AjaxViewer.X11_KEY_F12;
+ this.jsX11KeysymMap[AjaxViewer.JS_KEY_SHIFT] = AjaxViewer.X11_KEY_SHIFT;
+ this.jsX11KeysymMap[AjaxViewer.JS_KEY_CTRL] = AjaxViewer.X11_KEY_CTRL;
+ this.jsX11KeysymMap[AjaxViewer.JS_KEY_ALT] = AjaxViewer.X11_KEY_ALT;
+}
+
+JsCookedKeyboardMapper.prototype = new KeyboardMapper();
+JsCookedKeyboardMapper.prototype.inputFeed = function(eventType, code, modifiers) {
+ if(eventType == AjaxViewer.KEY_DOWN || eventType == AjaxViewer.KEY_UP) {
+
+ // special handling for Alt + Ctrl + Ins, convert it into Alt-Ctrl-Del
+ if(code == AjaxViewer.JS_KEY_INSERT) {
+ if((modifiers & AjaxViewer.ALT_KEY_MASK) != 0 && (modifiers & AjaxViewer.CTRL_KEY_MASK) != 0) {
+ this.mappedInput.push({type : eventType, code: 0xffff, modifiers: modifiers});
+ return;
+ }
+ }
+
+ var X11Keysym = code;
+ if(this.jsX11KeysymMap[code] != undefined) {
+ X11Keysym = this.jsX11KeysymMap[code];
+ if(typeof this.jsX11KeysymMap[code] == "boolean") {
+ return;
+ } else if($.isArray(X11Keysym)) {
+ for(var i = 0; i < X11Keysym.length; i++) {
+ if(X11Keysym[i].type == eventType) {
+ this.mappedInput.push(X11Keysym[i]);
+ }
+ }
+ } else {
+ this.mappedInput.push({type : eventType, code: X11Keysym, modifiers: modifiers});
+ }
+ }
+
+ // special handling for ALT/CTRL key
+ if(eventType == AjaxViewer.KEY_UP && (code == AjaxViewer.JS_KEY_ALT || code == code == AjaxViewer.JS_KEY_CTRL))
+ this.mappedInput.push({type : eventType, code: this.jsX11KeysymMap[code], modifiers: modifiers});
+
+ } else if(eventType == AjaxViewer.KEY_PRESS) {
+ var X11Keysym = code;
+
+ // special handling for * and + key on number pad
+ if(code == AjaxViewer.JS_NUMPAD_MULTIPLY) {
+ this.mappedInput.push({type : AjaxViewer.KEY_DOWN, code: AjaxViewer.X11_KEY_SHIFT, modifiers: modifiers});
+ this.mappedInput.push({type : AjaxViewer.KEY_DOWN, code: 42, modifiers: modifiers});
+ this.mappedInput.push({type : AjaxViewer.KEY_UP, code: 42, modifiers: modifiers});
+ this.mappedInput.push({type : AjaxViewer.KEY_UP, code: AjaxViewer.X11_KEY_SHIFT, modifiers: modifiers});
+ return;
+ }
+
+ if(code == AjaxViewer.JS_NUMPAD_PLUS) {
+ this.mappedInput.push({type : AjaxViewer.KEY_DOWN, code: AjaxViewer.X11_KEY_SHIFT, modifiers: modifiers});
+ this.mappedInput.push({type : AjaxViewer.KEY_DOWN, code: 43, modifiers: modifiers});
+ this.mappedInput.push({type : AjaxViewer.KEY_UP, code: 43, modifiers: modifiers});
+ this.mappedInput.push({type : AjaxViewer.KEY_UP, code: AjaxViewer.X11_KEY_SHIFT, modifiers: modifiers});
+ return;
+ }
+
+ this.mappedInput.push({type : AjaxViewer.KEY_DOWN, code: X11Keysym, modifiers: modifiers});
+ this.mappedInput.push({type : AjaxViewer.KEY_UP, code: X11Keysym, modifiers: modifiers});
+ }
+}
+
/////////////////////////////////////////////////////////////////////////////
// class AjaxViewer
//
@@ -373,6 +470,7 @@ AjaxViewer.JS_KEY_BACK_SLASH = 220; // \
AjaxViewer.JS_KEY_CLOSE_BRACKET = 221; // ]
AjaxViewer.JS_KEY_SINGLE_QUOTE = 222; // '
AjaxViewer.JS_NUMPAD_PLUS = 43;
+AjaxViewer.JS_NUMPAD_MULTIPLY = 42;
AjaxViewer.JS_KEY_NUM8 = 56;
// keycode from Japanese keyboard
@@ -561,7 +659,8 @@ AjaxViewer.prototype = {
setupKeyboardTranslationTable : function() {
this.keyboardMappers = [];
- this.keyboardMappers[AjaxViewer.KEYBOARD_TYPE_ENGLISH] = new JsX11KeyboardMapper();
+ // this.keyboardMappers[AjaxViewer.KEYBOARD_TYPE_ENGLISH] = new JsX11KeyboardMapper();
+ this.keyboardMappers[AjaxViewer.KEYBOARD_TYPE_ENGLISH] = new JsCookedKeyboardMapper();
// setup Japanese keyboard translation table
var mapper = new JsX11KeyboardMapper();
diff --git a/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java b/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java
index cf11a75a8b2..ff467db2190 100755
--- a/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java
+++ b/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java
@@ -594,6 +594,9 @@ public class VirtualRoutingResource implements Manager {
String publicNic = "eth" + nicNum;
command.add("-c", publicNic);
+
+ command.add("-g", vlanGateway);
+
return command.execute();
}
diff --git a/core/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/core/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
index f8be5a7691d..2c6380160f5 100755
--- a/core/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
+++ b/core/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
@@ -740,7 +740,10 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
}
args += " -c ";
- args += "eth" + publicNicInfo.first();
+ args += "eth" + publicNicInfo.first();
+
+ args += " -g ";
+ args += vlanGateway;
if (s_logger.isDebugEnabled()) {
s_logger.debug("Run command on domain router " + privateIpAddress + ", /root/ipassoc.sh " + args);
diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
index 5491d152882..70b3beb90ee 100755
--- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
+++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
@@ -1075,7 +1075,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
}
- synchronized (s_vms) {
+ synchronized (_cluster.intern()) {
s_logger.debug("1. The VM " + vmName + " is in Starting state.");
s_vms.put(_cluster, _name, vmName, State.Starting);
}
@@ -1158,7 +1158,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
String msg = handleVmStartFailure(conn, vmName, vm, "", e);
return new StartAnswer(cmd, msg);
} finally {
- synchronized (s_vms) {
+ synchronized (_cluster.intern()) {
if (state != State.Stopped) {
s_logger.debug("2. The VM " + vmName + " is in " + state + " state.");
s_vms.put(_cluster, _name, vmName, state);
@@ -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> deltaClusterSync(Connection conn) {
final HashMap> changes = new HashMap>();
- synchronized (s_vms) {
+ synchronized (_cluster.intern()) {
HashMap> newStates = getAllVms(conn);
if (newStates == null) {
s_logger.warn("Unable to get the vm states so no state sync at this point.");
diff --git a/core/src/com/cloud/network/resource/JuniperSrxResource.java b/core/src/com/cloud/network/resource/JuniperSrxResource.java
index 5624789751d..956d221fb30 100644
--- a/core/src/com/cloud/network/resource/JuniperSrxResource.java
+++ b/core/src/com/cloud/network/resource/JuniperSrxResource.java
@@ -580,6 +580,7 @@ public class JuniperSrxResource implements ServerResource {
*/
private synchronized Answer execute(IpAssocCommand cmd) {
+ refreshSrxConnection();
return execute(cmd, _numRetries);
}
@@ -707,6 +708,7 @@ public class JuniperSrxResource implements ServerResource {
*/
private synchronized Answer execute(SetStaticNatRulesCommand cmd) {
+ refreshSrxConnection();
return execute(cmd, _numRetries);
}
@@ -800,6 +802,7 @@ public class JuniperSrxResource implements ServerResource {
*/
private synchronized Answer execute(RemoteAccessVpnCfgCommand cmd) {
+ refreshSrxConnection();
return execute(cmd, _numRetries);
}
@@ -912,6 +915,7 @@ public class JuniperSrxResource implements ServerResource {
}
private synchronized Answer execute(VpnUsersCfgCommand cmd) {
+ refreshSrxConnection();
return execute(cmd, _numRetries);
}
@@ -971,6 +975,7 @@ public class JuniperSrxResource implements ServerResource {
*/
private synchronized Answer execute (SetPortForwardingRulesCommand cmd) {
+ refreshSrxConnection();
return execute(cmd, _numRetries);
}
diff --git a/core/src/com/cloud/storage/resource/NfsSecondaryStorageResource.java b/core/src/com/cloud/storage/resource/NfsSecondaryStorageResource.java
index 143f5f96137..336dddb362c 100755
--- a/core/src/com/cloud/storage/resource/NfsSecondaryStorageResource.java
+++ b/core/src/com/cloud/storage/resource/NfsSecondaryStorageResource.java
@@ -40,6 +40,7 @@ import org.apache.log4j.Logger;
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.CheckHealthAnswer;
import com.cloud.agent.api.CheckHealthCommand;
+import com.cloud.agent.api.CleanupSnapshotBackupCommand;
import com.cloud.agent.api.Command;
import com.cloud.agent.api.ComputeChecksumCommand;
import com.cloud.agent.api.GetStorageStatsAnswer;
@@ -140,7 +141,9 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
} else if (cmd instanceof ComputeChecksumCommand){
return execute((ComputeChecksumCommand)cmd);
} else if (cmd instanceof ListTemplateCommand){
- return execute((ListTemplateCommand)cmd);
+ return execute((ListTemplateCommand)cmd);
+ } else if (cmd instanceof CleanupSnapshotBackupCommand){
+ return execute((CleanupSnapshotBackupCommand)cmd);
} else {
return Answer.createUnsupportedCommandAnswer(cmd);
}
@@ -364,6 +367,35 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
return new Answer(cmd, true, null);
}
+ Answer execute(CleanupSnapshotBackupCommand cmd) {
+ String parent = getRootDir(cmd.getSecondaryStoragePoolURL());
+ if (!parent.endsWith(File.separator)) {
+ parent += File.separator;
+ }
+ String absoluteSnapsthotDir = parent + File.separator + "snapshots" + File.separator + cmd.getAccountId() + File.separator + cmd.getVolumeId();
+ File ssParent = new File(absoluteSnapsthotDir);
+ if (ssParent.exists() && ssParent.isDirectory()) {
+ File[] files = ssParent.listFiles();
+ for (File file : files) {
+ boolean found = false;
+ String filename = file.getName();
+ for (String uuid : cmd.getValidBackupUUIDs()) {
+ if (filename.startsWith(uuid)) {
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ file.delete();
+ String msg = "snapshot " + filename + " is not recorded in DB, remove it";
+ s_logger.warn(msg);
+ }
+ }
+ }
+ return new Answer(cmd, true, null);
+ }
+
+
synchronized public String getRootDir(String secUrl) {
try {
URI uri = new URI(secUrl);
diff --git a/core/src/com/cloud/storage/resource/VmwareSecondaryStorageResourceHandler.java b/core/src/com/cloud/storage/resource/VmwareSecondaryStorageResourceHandler.java
index 53db3a1da29..f8d8a02e44c 100644
--- a/core/src/com/cloud/storage/resource/VmwareSecondaryStorageResourceHandler.java
+++ b/core/src/com/cloud/storage/resource/VmwareSecondaryStorageResourceHandler.java
@@ -4,6 +4,8 @@
package com.cloud.storage.resource;
+import java.util.List;
+
import org.apache.log4j.Logger;
import com.cloud.agent.api.Answer;
@@ -28,6 +30,7 @@ import com.cloud.hypervisor.vmware.mo.VmwareHypervisorHostNetworkSummary;
import com.cloud.hypervisor.vmware.util.VmwareContext;
import com.cloud.hypervisor.vmware.util.VmwareHelper;
import com.cloud.serializer.GsonHelper;
+import com.cloud.utils.Pair;
import com.google.gson.Gson;
import com.vmware.vim25.ManagedObjectReference;
@@ -232,9 +235,19 @@ public class VmwareSecondaryStorageResourceHandler implements SecondaryStorageRe
HostMO hostMo = new HostMO(context, morHyperHost);
try {
- VmwareHypervisorHostNetworkSummary netSummary = hostMo.getHyperHostNetworkSummary(
- hostMo.getHostType() == VmwareHostType.ESXi ? cmd.getContextParam("manageportgroup") : cmd.getContextParam("serviceconsole"));
- _resource.ensureOutgoingRuleForAddress(netSummary.getHostIp());
+
+ ManagedObjectReference mor = hostMo.getHyperHostCluster();
+ ClusterMO clusterMo = new ClusterMO(hostMo.getContext(), mor);
+ List> hostsInCluster = clusterMo.getClusterHosts();
+ for(Pair hostPair : hostsInCluster) {
+ HostMO hostIteratorMo = new HostMO(hostMo.getContext(), hostPair.first());
+
+ VmwareHypervisorHostNetworkSummary netSummary = hostIteratorMo.getHyperHostNetworkSummary(
+ hostIteratorMo.getHostType() == VmwareHostType.ESXi ? cmd.getContextParam("manageportgroup") : cmd.getContextParam("serviceconsole"));
+ _resource.ensureOutgoingRuleForAddress(netSummary.getHostIp());
+
+ s_logger.info("Setup firewall rule for host: " + netSummary.getHostIp());
+ }
} catch(Throwable e) {
s_logger.warn("Unable to retrive host network information due to exception " + e.toString() + ", host: " + hostTokens[0] + "-" + hostTokens[1]);
}
diff --git a/patches/systemvm/debian/config/etc/iptables/iptables-router b/patches/systemvm/debian/config/etc/iptables/iptables-router
index 9b56209159e..f50eebe584f 100644
--- a/patches/systemvm/debian/config/etc/iptables/iptables-router
+++ b/patches/systemvm/debian/config/etc/iptables/iptables-router
@@ -23,4 +23,8 @@ COMMIT
-A FORWARD -i eth0 -o eth2 -j ACCEPT
-A FORWARD -i eth2 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
COMMIT
+*mangle
+-A PREROUTING -m state --state ESTABLISHED,RELATED -j CONNMARK --restore-mark
+COMMIT
+
diff --git a/patches/systemvm/debian/config/root/firewall.sh b/patches/systemvm/debian/config/root/firewall.sh
index d16e539a862..9bc72869eb3 100755
--- a/patches/systemvm/debian/config/root/firewall.sh
+++ b/patches/systemvm/debian/config/root/firewall.sh
@@ -62,6 +62,7 @@ tcp_or_udp_entry() {
local op=$5
local proto=$6
local cidrs=$7
+
logger -t cloud "$(basename $0): creating port fwd entry for PAT: public ip=$publicIp \
instance ip=$instIp proto=$proto port=$port dport=$dport op=$op"
@@ -70,11 +71,16 @@ tcp_or_udp_entry() {
# the delete operation may have errored out but the only possible reason is
# that the rules didn't exist in the first place
local dev=$(ip_to_dev $publicIp)
+ local tableNo=$(echo $dev | awk -F'eth' '{print $2}')
# shortcircuit the process if error and it is an append operation
# continue if it is delete
(sudo iptables -t nat $op PREROUTING --proto $proto -i $dev -d $publicIp \
--destination-port $port -j DNAT \
--to-destination $instIp:$dport &>> $OUTFILE || [ "$op" == "-D" ]) &&
+ (sudo iptables -t mangle $op PREROUTING --proto $proto -i $dev -d $publicIp \
+ --destination-port $port -j MARK --set-mark $tableNo) &&
+ (sudo iptables -t mangle $op PREROUTING --proto $proto -i $dev -d $publicIp \
+ --destination-port $port -m state --state NEW -j CONNMARK --save-mark) &&
(sudo iptables -t nat $op OUTPUT --proto $proto -d $publicIp \
--destination-port $port -j DNAT \
--to-destination $instIp:$dport &>> $OUTFILE || [ "$op" == "-D" ]) &&
diff --git a/patches/systemvm/debian/config/root/ipassoc.sh b/patches/systemvm/debian/config/root/ipassoc.sh
index 17278a3fd9b..65007268c4b 100644
--- a/patches/systemvm/debian/config/root/ipassoc.sh
+++ b/patches/systemvm/debian/config/root/ipassoc.sh
@@ -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
;;
diff --git a/scripts/vm/hypervisor/xenserver/vmops b/scripts/vm/hypervisor/xenserver/vmops
index 860a3396fe5..4e650b7709f 100755
--- a/scripts/vm/hypervisor/xenserver/vmops
+++ b/scripts/vm/hypervisor/xenserver/vmops
@@ -1032,34 +1032,44 @@ def cleanup_rules(session, args):
instance = args.get('instance')
if not instance:
instance = 'VM'
-
+ resident_vms = []
try:
+ hostname = util.pread2(['/bin/bash', '-c', 'hostname']).split('\n')
+ if len(hostname) < 1:
+ raise Exception('Could not find hostname of this host')
+ thishost = session.xenapi.host.get_by_name_label(hostname[0])
+ if len(thishost) < 1:
+ raise Exception("Could not find host record from hostname %s of this host"%hostname[0])
+ hostrec = session.xenapi.host.get_record(thishost[0])
+ vms = hostrec.get('resident_VMs')
+ resident_vms = [session.xenapi.VM.get_name_label(x) for x in vms]
+ util.SMlog('cleanup_rules: found %s resident vms on this host %s' % (len(resident_vms)-1, hostname[0]))
+
chainscmd = "iptables-save | grep '^:' | awk '{print $1}' | cut -d':' -f2 | sed 's/-def/-%s/'|sort|uniq" % instance
chains = util.pread2(['/bin/bash', '-c', chainscmd]).split('\n')
+ vmchains = [ch for ch in chains if 1 in [ ch.startswith(c) for c in ['r-', 'i-', 's-', 'v-', 'l-']]]
+ util.SMlog('cleanup_rules: found %s iptables chains for vms on this host %s' % (len(vmchains), hostname[0]))
cleaned = 0
cleanup = []
- for chain in chains:
- if 1 in [ chain.startswith(c) for c in ['r-', 'i-', 's-', 'v-', 'l-'] ]:
- vm = session.xenapi.VM.get_by_name_label(chain)
+ for chain in vmchains:
+ vm = session.xenapi.VM.get_by_name_label(chain)
+ if len(vm) != 1:
+ vm = session.xenapi.VM.get_by_name_label(chain + "-untagged")
if len(vm) != 1:
- vm = session.xenapi.VM.get_by_name_label(chain + "-untagged")
- if len(vm) != 1:
- util.SMlog("chain " + chain + " does not correspond to a vm, cleaning up")
- cleanup.append(chain)
- continue
- vm_rec = session.xenapi.VM.get_record(vm[0])
- state = vm_rec.get('power_state')
- if state != 'Running' and state != 'Paused':
- util.SMlog("vm " + vm_name + " is not running, cleaning up")
- cleanup.append(vm_name)
+ util.SMlog("chain " + chain + " does not correspond to a vm, cleaning up")
+ cleanup.append(chain)
+ continue
+ if chain not in resident_vms:
+ util.SMlog("vm " + chain + " is not running, cleaning up")
+ cleanup.append(chain)
for vm_name in cleanup:
destroy_network_rules_for_vm(session, {'vmName':vm_name})
util.SMlog("Cleaned up rules for " + str(len(cleanup)) + " chains")
return str(len(cleanup))
- except:
- util.SMlog("Failed to cleanup rules !")
+ except Exception, ex:
+ util.SMlog("Failed to cleanup rules, reason= " + str(ex))
return '-1';
@echo
diff --git a/server/src/com/cloud/agent/manager/AgentManagerImpl.java b/server/src/com/cloud/agent/manager/AgentManagerImpl.java
index 411a5ecf240..537cdc7d77b 100755
--- a/server/src/com/cloud/agent/manager/AgentManagerImpl.java
+++ b/server/src/com/cloud/agent/manager/AgentManagerImpl.java
@@ -1570,6 +1570,12 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, Manager {
return false;
}
}
+
+ if (host.getHypervisorType() == HypervisorType.KVM) {
+ MaintainCommand cmd = new MaintainCommand();
+ cmd.setMaintain(false);
+ easySend(hostId, cmd);
+ }
disconnect(hostId, Event.ResetRequested, false);
return true;
}
diff --git a/server/src/com/cloud/alert/dao/AlertDaoImpl.java b/server/src/com/cloud/alert/dao/AlertDaoImpl.java
index bee71b47a73..269e273c819 100644
--- a/server/src/com/cloud/alert/dao/AlertDaoImpl.java
+++ b/server/src/com/cloud/alert/dao/AlertDaoImpl.java
@@ -31,7 +31,7 @@ import com.cloud.utils.db.SearchCriteria;
public class AlertDaoImpl extends GenericDaoBase implements AlertDao {
@Override
public AlertVO getLastAlert(short type, long dataCenterId, Long podId) {
- Filter searchFilter = new Filter(AlertVO.class, "createdDate", Boolean.FALSE, Long.valueOf(1), Long.valueOf(1));
+ Filter searchFilter = new Filter(AlertVO.class, "createdDate", Boolean.FALSE, Long.valueOf(0), Long.valueOf(1));
SearchCriteria sc = createSearchCriteria();
sc.addAnd("type", SearchCriteria.Op.EQ, Short.valueOf(type));
diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
index cb8cdbfdcfe..0f8ec158120 100755
--- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
+++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
@@ -397,7 +397,8 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura
Long userId = UserContext.current().getCallerUserId();
String name = cmd.getCfgName();
String value = cmd.getValue();
- UserContext.current().setEventDetails(" Name: "+name +" New Value: "+((value == null) ? "" : value));
+ UserContext.current().setEventDetails(" Name: "+name +" New Value: "+ (((name.toLowerCase()).contains("password")) ? "*****" :
+ (((value == null) ? "" : value))));
// check if config value exists
if (_configDao.findByName(name) == null) {
throw new InvalidParameterValueException("Config parameter with name " + name + " doesn't exist");
@@ -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);
diff --git a/server/src/com/cloud/network/NetworkManager.java b/server/src/com/cloud/network/NetworkManager.java
index 59be681a169..b6e1a4d2415 100644
--- a/server/src/com/cloud/network/NetworkManager.java
+++ b/server/src/com/cloud/network/NetworkManager.java
@@ -41,6 +41,7 @@ import com.cloud.network.vpn.RemoteAccessVpnElement;
import com.cloud.offerings.NetworkOfferingVO;
import com.cloud.user.Account;
import com.cloud.user.AccountVO;
+import com.cloud.uservm.UserVm;
import com.cloud.utils.Pair;
import com.cloud.vm.Nic;
import com.cloud.vm.NicProfile;
@@ -217,4 +218,6 @@ public interface NetworkManager extends NetworkService {
String getIpInNetwork(long vmId, long networkId);
String getIpInNetworkIncludingRemoved(long vmId, long networkId);
+
+ boolean updateVmData(UserVm vm);
}
diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java
index c3bf61bcc8f..a471ccc909a 100755
--- a/server/src/com/cloud/network/NetworkManagerImpl.java
+++ b/server/src/com/cloud/network/NetworkManagerImpl.java
@@ -100,6 +100,7 @@ import com.cloud.network.dao.NetworkDomainDao;
import com.cloud.network.element.NetworkElement;
import com.cloud.network.guru.NetworkGuru;
import com.cloud.network.lb.LoadBalancingRulesManager;
+import com.cloud.network.router.UpdateUserDataElement;
import com.cloud.network.rules.FirewallManager;
import com.cloud.network.rules.FirewallRule;
import com.cloud.network.rules.FirewallRule.Purpose;
@@ -121,6 +122,7 @@ import com.cloud.user.User;
import com.cloud.user.UserContext;
import com.cloud.user.dao.AccountDao;
import com.cloud.user.dao.UserStatisticsDao;
+import com.cloud.uservm.UserVm;
import com.cloud.utils.NumbersUtil;
import com.cloud.utils.Pair;
import com.cloud.utils.component.Adapters;
@@ -147,6 +149,7 @@ import com.cloud.vm.ReservationContextImpl;
import com.cloud.vm.UserVmVO;
import com.cloud.vm.VMInstanceVO;
import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.VirtualMachineProfileImpl;
import com.cloud.vm.VirtualMachine.Type;
import com.cloud.vm.VirtualMachineProfile;
import com.cloud.vm.dao.DomainRouterDao;
@@ -2801,6 +2804,44 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
}
return elements;
}
+
+ private List extends UpdateUserDataElement> getUpdateUserDataElements() {
+ List elements = new ArrayList();
+ for (NetworkElement element : _networkElements) {
+ if (element instanceof UpdateUserDataElement) {
+ elements.add((UpdateUserDataElement) element);
+ }
+ }
+ return elements;
+ }
+
+ @Override
+ public boolean updateVmData(UserVm vm) {
+ Nic defaultNic = getDefaultNic(vm.getId());
+ if (defaultNic == null) {
+ s_logger.error("Unable to update vm data for vm " + vm.getDisplayName() + " as the instance doesn't have default nic");
+ return false;
+ }
+
+ Network defaultNetwork = getNetwork(defaultNic.getNetworkId());
+ NicProfile defaultNicProfile = new NicProfile(defaultNic, defaultNetwork, null, null, null);
+ VirtualMachineProfile vmProfile = new VirtualMachineProfileImpl((VMInstanceVO)vm);
+
+ List 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) {
diff --git a/server/src/com/cloud/network/element/DhcpElement.java b/server/src/com/cloud/network/element/DhcpElement.java
index aaad390a607..1d8dfb30add 100644
--- a/server/src/com/cloud/network/element/DhcpElement.java
+++ b/server/src/com/cloud/network/element/DhcpElement.java
@@ -42,6 +42,7 @@ import com.cloud.network.NetworkManager;
import com.cloud.network.Networks.TrafficType;
import com.cloud.network.PublicIpAddress;
import com.cloud.network.dao.NetworkDao;
+import com.cloud.network.router.UpdateUserDataElement;
import com.cloud.network.router.VirtualNetworkApplianceManager;
import com.cloud.network.router.VirtualRouter;
import com.cloud.network.router.VirtualRouter.Role;
@@ -65,7 +66,7 @@ import com.cloud.vm.dao.UserVmDao;
@Local(value=NetworkElement.class)
-public class DhcpElement extends AdapterBase implements NetworkElement, PasswordResetElement{
+public class DhcpElement extends AdapterBase implements NetworkElement, PasswordResetElement, UpdateUserDataElement {
private static final Logger s_logger = Logger.getLogger(DhcpElement.class);
private static final Map> capabilities = setCapabilities();
@@ -258,4 +259,20 @@ public class DhcpElement extends AdapterBase implements NetworkElement, Password
public boolean applyStaticNats(Network config, List extends StaticNat> rules) throws ResourceUnavailableException {
return false;
}
+
+ @Override
+ public boolean updateUserData(Network network, NicProfile nic,
+ VirtualMachineProfile extends VirtualMachine> vm)
+ throws ResourceUnavailableException {
+ List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.DHCP_USERDATA);
+ if (routers == null || routers.isEmpty()) {
+ s_logger.trace("Can't find dhcp element in network " + network.getId());
+ return true;
+ }
+
+ @SuppressWarnings("unchecked")
+ VirtualMachineProfile uservm = (VirtualMachineProfile)vm;
+
+ return _routerMgr.updateVmData(network, nic, uservm, routers);
+ }
}
diff --git a/server/src/com/cloud/network/element/VirtualRouterElement.java b/server/src/com/cloud/network/element/VirtualRouterElement.java
index 230b9f17b27..4512e69c5bd 100644
--- a/server/src/com/cloud/network/element/VirtualRouterElement.java
+++ b/server/src/com/cloud/network/element/VirtualRouterElement.java
@@ -45,6 +45,7 @@ import com.cloud.network.VpnUser;
import com.cloud.network.dao.LoadBalancerDao;
import com.cloud.network.dao.NetworkDao;
import com.cloud.network.lb.LoadBalancingRulesManager;
+import com.cloud.network.router.UpdateUserDataElement;
import com.cloud.network.router.VirtualNetworkApplianceManager;
import com.cloud.network.router.VirtualRouter;
import com.cloud.network.router.VirtualRouter.Role;
@@ -372,4 +373,20 @@ public class VirtualRouterElement extends DhcpElement implements NetworkElement,
return _routerMgr.savePasswordToRouter(network, nic, uservm, routers);
}
+
+ @Override
+ public boolean updateUserData(Network network, NicProfile nic,
+ VirtualMachineProfile extends VirtualMachine> vm)
+ throws ResourceUnavailableException {
+ List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.DHCP_FIREWALL_LB_PASSWD_USERDATA);
+ if (routers == null || routers.isEmpty()) {
+ s_logger.trace("Can't find virtual router element in network " + network.getId());
+ return true;
+ }
+
+ @SuppressWarnings("unchecked")
+ VirtualMachineProfile uservm = (VirtualMachineProfile)vm;
+
+ return _routerMgr.updateVmData(network, nic, uservm, routers);
+ }
}
diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java
index 4d68faece9a..923aec1234f 100644
--- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java
+++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java
@@ -38,6 +38,7 @@ import com.cloud.utils.component.Manager;
import com.cloud.vm.DomainRouterVO;
import com.cloud.vm.NicProfile;
import com.cloud.vm.ReservationContext;
+import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachineProfile;
/**
@@ -92,4 +93,9 @@ public interface VirtualNetworkApplianceManager extends Manager, VirtualNetworkA
boolean applyStaticNats(Network network, List extends StaticNat> rules, List extends VirtualRouter> routers) throws ResourceUnavailableException;
+ boolean updateVmData(Network network, NicProfile nic,
+ VirtualMachineProfile profile,
+ List extends VirtualRouter> routers)
+ throws ResourceUnavailableException;
+
}
diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
index 1177339d9a0..713fcfdfe91 100755
--- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
+++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
@@ -2324,27 +2324,32 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian
cmds.addCommand("users", addUsersCmd);
cmds.addCommand("startVpn", startVpnCmd);
}
+
+ private void createvmDataCommand(DomainRouterVO router, UserVmVO userVM, DataCenterVO dc, Commands cmds) {
+ boolean createVmData = true;
+ long networkId = router.getNetworkId();
+ if (dc.getNetworkType() == NetworkType.Basic && router.getPodIdToDeployIn().longValue() != userVM.getPodIdToDeployIn().longValue()) {
+ createVmData = false;
+ }
+
+ if (createVmData) {
+ NicVO nic = _nicDao.findByInstanceIdAndNetworkId(networkId, userVM.getId());
+ if (nic != null) {
+ s_logger.debug("Creating user data entry for vm " + userVM + " on domR " + router);
+ String serviceOffering = _serviceOfferingDao.findByIdIncludingRemoved(userVM.getServiceOfferingId()).getDisplayText();
+ String zoneName = _dcDao.findById(router.getDataCenterIdToDeployIn()).getName();
+ cmds.addCommand("vmdata",
+ generateVmDataCommand(router, nic.getIp4Address(), userVM.getUserData(), serviceOffering, zoneName, nic.getIp4Address(), userVM.getHostName(), userVM.getInstanceName(), userVM.getId(), null));
+ }
+ }
+ }
private void createVmDataCommands(DomainRouterVO router, Commands cmds) {
long networkId = router.getNetworkId();
List vms = _userVmDao.listByNetworkIdAndStates(networkId, State.Running, State.Migrating, State.Stopping);
DataCenterVO dc = _dcDao.findById(router.getDataCenterIdToDeployIn());
for (UserVmVO vm : vms) {
- boolean createVmData = true;
- if (dc.getNetworkType() == NetworkType.Basic && router.getPodIdToDeployIn().longValue() != vm.getPodIdToDeployIn().longValue()) {
- createVmData = false;
- }
-
- if (createVmData) {
- NicVO nic = _nicDao.findByInstanceIdAndNetworkId(networkId, vm.getId());
- if (nic != null) {
- s_logger.debug("Creating user data entry for vm " + vm + " on domR " + router);
- String serviceOffering = _serviceOfferingDao.findByIdIncludingRemoved(vm.getServiceOfferingId()).getDisplayText();
- String zoneName = _dcDao.findById(router.getDataCenterIdToDeployIn()).getName();
- cmds.addCommand("vmdata",
- generateVmDataCommand(router, nic.getIp4Address(), vm.getUserData(), serviceOffering, zoneName, nic.getIp4Address(), vm.getHostName(), vm.getInstanceName(), vm.getId(), null));
- }
- }
+ createvmDataCommand(router, vm, dc, cmds);
}
}
@@ -2509,6 +2514,24 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian
}
return result;
}
+
+ @Override
+ public boolean updateVmData(Network network, NicProfile nic, VirtualMachineProfile profile, List 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 {
diff --git a/server/src/com/cloud/resource/ResourceManagerImpl.java b/server/src/com/cloud/resource/ResourceManagerImpl.java
index fe69b376b4a..d95f13cfd5d 100755
--- a/server/src/com/cloud/resource/ResourceManagerImpl.java
+++ b/server/src/com/cloud/resource/ResourceManagerImpl.java
@@ -43,6 +43,7 @@ import com.cloud.api.commands.PrepareForMaintenanceCmd;
import com.cloud.api.commands.ReconnectHostCmd;
import com.cloud.api.commands.UpdateHostCmd;
import com.cloud.api.commands.UpdateHostPasswordCmd;
+import com.cloud.capacity.dao.CapacityDao;
import com.cloud.cluster.ManagementServerNode;
import com.cloud.dc.ClusterDetailsDao;
import com.cloud.dc.ClusterVO;
@@ -119,13 +120,15 @@ public class ResourceManagerImpl implements ResourceManager, ResourceService, Ma
protected GuestOSCategoryDao _guestOSCategoryDao;
@Inject
protected StoragePoolDao _storagePoolDao;
+ @Inject
+ CapacityDao _capacityDao;
@Inject(adapter = Discoverer.class)
protected Adapters extends Discoverer> _discoverers;
protected long _nodeId = ManagementServerNode.getManagementServerId();
- protected HashMap> _lifeCycleListeners = new HashMap>();
+ protected HashMap> _lifeCycleListeners = new HashMap>();
private void insertListener(Integer event, ResourceListener listener) {
List lst = _lifeCycleListeners.get(event);
@@ -667,7 +670,9 @@ public class ResourceManagerImpl implements ResourceManager, ResourceService, Ma
return false;
}
- _clusterDao.remove(cmd.getId());
+ if (_clusterDao.remove(cmd.getId())){
+ _capacityDao.removeBy(null, null, null, cmd.getId());
+ }
txn.commit();
return true;
diff --git a/server/src/com/cloud/server/ConfigurationServerImpl.java b/server/src/com/cloud/server/ConfigurationServerImpl.java
index 3ea22a99ba2..5b303a2a175 100644
--- a/server/src/com/cloud/server/ConfigurationServerImpl.java
+++ b/server/src/com/cloud/server/ConfigurationServerImpl.java
@@ -533,12 +533,15 @@ public class ConfigurationServerImpl implements ConfigurationServer {
protected void updateKeyPairs() {
// Grab the SSH key pair and insert it into the database, if it is not present
- if (s_logger.isInfoEnabled()) {
- s_logger.info("Processing updateKeyPairs");
+ String userid = System.getProperty("user.name");
+ if (!userid.startsWith("cloud")){
+ return;
}
String already = _configDao.getValue("ssh.privatekey");
String homeDir = Script.runSimpleBashScript("echo ~");
- String userid = System.getProperty("user.name");
+ if (s_logger.isInfoEnabled()) {
+ s_logger.info("Processing updateKeyPairs");
+ }
if (homeDir != null && homeDir.equalsIgnoreCase("~")) {
s_logger.error("No home directory was detected. Set the HOME environment variable to point to your user profile or home directory.");
throw new CloudRuntimeException("No home directory was detected. Set the HOME environment variable to point to your user profile or home directory.");
@@ -610,14 +613,8 @@ public class ConfigurationServerImpl implements ConfigurationServer {
s_logger.info("Keypairs already in database, skip updating local copy (not running as cloud user)");
}
}
-
-
- if (userid.startsWith("cloud")){
- s_logger.info("Going to update systemvm iso with generated keypairs if needed");
- injectSshKeysIntoSystemVmIsoPatch(pubkeyfile.getAbsolutePath(), privkeyfile.getAbsolutePath());
- } else {
- s_logger.info("Skip updating keypairs on systemvm iso (not running as cloud user)");
- }
+ s_logger.info("Going to update systemvm iso with generated keypairs if needed");
+ injectSshKeysIntoSystemVmIsoPatch(pubkeyfile.getAbsolutePath(), privkeyfile.getAbsolutePath());
}
private void writeKeyToDisk(String key, String keyPath) {
diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java
index 24b173310fe..db227f54316 100755
--- a/server/src/com/cloud/server/ManagementServerImpl.java
+++ b/server/src/com/cloud/server/ManagementServerImpl.java
@@ -4757,22 +4757,30 @@ public class ManagementServerImpl implements ManagementServer {
@Override
@DB
public boolean updateHostPassword(UpdateHostPasswordCmd cmd) {
- if (cmd.getClusterId() == null && cmd.getHostId() == null) {
+ if ( !((cmd.getClusterId() == null) ^ (cmd.getHostId() == null)) ) {//Using Xor operator here.
throw new InvalidParameterValueException("You should provide one of cluster id or a host id.");
} else if (cmd.getClusterId() == null) {
- HostVO h = _hostDao.findById(cmd.getHostId());
- if (h.getHypervisorType() == HypervisorType.XenServer) {
- throw new InvalidParameterValueException("You should provide cluster id for Xenserver cluster.");
+ HostVO host = _hostDao.findById(cmd.getHostId());
+ if (host == null){
+ throw new InvalidParameterValueException("The hostId " +cmd.getHostId()+ " doesnt exist");
+ }if (host.getHypervisorType() != HypervisorType.KVM) {
+ throw new InvalidParameterValueException("This operation is not permitted for " + host.getHypervisorType() + " with the parameter hostId");
}
- DetailVO nv = _detailsDao.findDetail(h.getId(), ApiConstants.USERNAME);
+ DetailVO nv = _detailsDao.findDetail(host.getId(), ApiConstants.USERNAME);
if (nv.getValue().equals(cmd.getUsername())) {
- DetailVO nvp = new DetailVO(h.getId(), ApiConstants.PASSWORD, cmd.getPassword());
+ DetailVO nvp = new DetailVO(host.getId(), ApiConstants.PASSWORD, cmd.getPassword());
nvp.setValue(cmd.getPassword());
_detailsDao.persist(nvp);
} else {
throw new InvalidParameterValueException("The username is not under use by management server.");
}
} else {
+ ClusterVO cluster = _clusterDao.findById(cmd.getClusterId());
+ if (cluster == null){
+ throw new InvalidParameterValueException("The clusterId " +cmd.getClusterId()+ " doesnt exist");
+ }if (cluster.getHypervisorType() != HypervisorType.XenServer){
+ throw new InvalidParameterValueException("This operation is not permitted for " + cluster.getHypervisorType() + " with the parameter clusterId");
+ }
// get all the hosts in this cluster
List hosts = _hostDao.listByCluster(cmd.getClusterId());
Transaction txn = Transaction.currentTxn();
diff --git a/server/src/com/cloud/storage/StorageManager.java b/server/src/com/cloud/storage/StorageManager.java
index 9b2bfda2c47..11ee7afe3ce 100755
--- a/server/src/com/cloud/storage/StorageManager.java
+++ b/server/src/com/cloud/storage/StorageManager.java
@@ -206,4 +206,6 @@ public interface StorageManager extends Manager {
StoragePoolVO findLocalStorageOnHost(long hostId);
VMTemplateHostVO getTemplateHostRef(long zoneId, long tmpltId, boolean readyOnly);
+
+ void cleanupSecondaryStorage(boolean recurring);
}
diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java
index 8ef1ca52ba7..6330111b858 100755
--- a/server/src/com/cloud/storage/StorageManagerImpl.java
+++ b/server/src/com/cloud/storage/StorageManagerImpl.java
@@ -20,6 +20,8 @@ package com.cloud.storage;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.UnknownHostException;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -46,6 +48,7 @@ import org.apache.log4j.Logger;
import com.cloud.agent.AgentManager;
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.BackupSnapshotCommand;
+import com.cloud.agent.api.CleanupSnapshotBackupCommand;
import com.cloud.agent.api.Command;
import com.cloud.agent.api.CreateStoragePoolCommand;
import com.cloud.agent.api.CreateVolumeFromSnapshotAnswer;
@@ -1049,7 +1052,9 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
@Override
public boolean start() {
if (_storageCleanupEnabled) {
- _executor.scheduleWithFixedDelay(new StorageGarbageCollector(), _storageCleanupInterval, _storageCleanupInterval, TimeUnit.SECONDS);
+ Random generator = new Random();
+ int initialDelay = generator.nextInt(_storageCleanupInterval);
+ _executor.scheduleWithFixedDelay(new StorageGarbageCollector(), initialDelay, _storageCleanupInterval, TimeUnit.SECONDS);
} else {
s_logger.debug("Storage cleanup is not enabled, so the storage cleanup thread is not being scheduled.");
}
@@ -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 secondaryStorageHosts = _hostDao.listSecondaryStorageHosts();
- for (HostVO secondaryStorageHost : secondaryStorageHosts) {
- try {
- long hostId = secondaryStorageHost.getId();
- List destroyedTemplateHostVOs = _vmTemplateHostDao.listDestroyed(hostId);
- s_logger.debug("Secondary storage garbage collector found " + destroyedTemplateHostVOs.size() + " templates to cleanup on secondary storage host: "
- + secondaryStorageHost.getName());
- for (VMTemplateHostVO destroyedTemplateHostVO : destroyedTemplateHostVOs) {
- if (!_tmpltMgr.templateIsDeleteable(destroyedTemplateHostVO)) {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Not deleting template at: " + destroyedTemplateHostVO);
- }
- continue;
- }
-
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Deleting template host: " + destroyedTemplateHostVO);
- }
-
- String installPath = destroyedTemplateHostVO.getInstallPath();
-
- if (installPath != null) {
- Answer answer = _agentMgr.sendToSecStorage(secondaryStorageHost, new DeleteTemplateCommand(secondaryStorageHost.getStorageUrl(),destroyedTemplateHostVO.getInstallPath()));
-
- if (answer == null || !answer.getResult()) {
- s_logger.debug("Failed to delete " + destroyedTemplateHostVO + " due to " + ((answer == null) ? "answer is null" : answer.getDetails()));
- } else {
- _vmTemplateHostDao.remove(destroyedTemplateHostVO.getId());
- s_logger.debug("Deleted template at: " + destroyedTemplateHostVO.getInstallPath());
- }
- } else {
- _vmTemplateHostDao.remove(destroyedTemplateHostVO.getId());
- }
- }
- } catch (Exception e) {
- s_logger.warn("problem cleaning up secondary storage " + secondaryStorageHost, e);
- }
- }
+
+ cleanupSecondaryStorage(recurring);
List vols = _volsDao.listVolumesToBeDestroyed();
for (VolumeVO vol : vols) {
@@ -2037,6 +2006,142 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
scanLock.releaseRef();
}
}
+
+ @DB
+ List findAllVolumeIdInSnapshotTable(Long hostId) {
+ String sql = "SELECT volume_id from snapshots WHERE sechost_id=? GROUP BY volume_id";
+ List list = new ArrayList();
+ try {
+ Transaction txn = Transaction.currentTxn();
+ ResultSet rs = null;
+ PreparedStatement pstmt = null;
+ pstmt = txn.prepareAutoCloseStatement(sql);
+ pstmt.setLong(1, hostId);
+ rs = pstmt.executeQuery();
+ while (rs.next()) {
+ list.add(rs.getLong(1));
+ }
+ return list;
+ } catch (Exception e) {
+ s_logger.debug("failed to get all volumes who has snapshots in secondary storage " + hostId + " due to " + e.getMessage());
+ return null;
+ }
+
+ }
+
+
+ List findAllSnapshotForVolume(Long volumeId) {
+ String sql = "SELECT backup_snap_id FROM snapshots WHERE volume_id=? and backup_snap_id is not NULL";
+ try {
+ Transaction txn = Transaction.currentTxn();
+ ResultSet rs = null;
+ PreparedStatement pstmt = null;
+ pstmt = txn.prepareAutoCloseStatement(sql);
+ pstmt.setLong(1, volumeId);
+ rs = pstmt.executeQuery();
+ List list = new ArrayList();
+ while (rs.next()) {
+ list.add(rs.getString(1));
+ }
+ return list;
+ } catch (Exception e) {
+ s_logger.debug("failed to get all snapshots for a volume " + volumeId + " due to " + e.getMessage());
+ return null;
+ }
+ }
+
+ @Override
+ @DB
+ public void cleanupSecondaryStorage(boolean recurring) {
+ try {
+ // Cleanup templates in secondary storage hosts
+ List secondaryStorageHosts = _hostDao.listSecondaryStorageHosts();
+ for (HostVO secondaryStorageHost : secondaryStorageHosts) {
+ try {
+ long hostId = secondaryStorageHost.getId();
+ List destroyedTemplateHostVOs = _vmTemplateHostDao.listDestroyed(hostId);
+ s_logger.debug("Secondary storage garbage collector found " + destroyedTemplateHostVOs.size() + " templates to cleanup on secondary storage host: "
+ + secondaryStorageHost.getName());
+ for (VMTemplateHostVO destroyedTemplateHostVO : destroyedTemplateHostVOs) {
+ if (!_tmpltMgr.templateIsDeleteable(destroyedTemplateHostVO)) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Not deleting template at: " + destroyedTemplateHostVO);
+ }
+ continue;
+ }
+
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Deleting template host: " + destroyedTemplateHostVO);
+ }
+
+ String installPath = destroyedTemplateHostVO.getInstallPath();
+
+ if (installPath != null) {
+ Answer answer = _agentMgr.sendToSecStorage(secondaryStorageHost, new DeleteTemplateCommand(secondaryStorageHost.getStorageUrl(), destroyedTemplateHostVO.getInstallPath()));
+
+ if (answer == null || !answer.getResult()) {
+ s_logger.debug("Failed to delete " + destroyedTemplateHostVO + " due to " + ((answer == null) ? "answer is null" : answer.getDetails()));
+ } else {
+ _vmTemplateHostDao.remove(destroyedTemplateHostVO.getId());
+ s_logger.debug("Deleted template at: " + destroyedTemplateHostVO.getInstallPath());
+ }
+ } else {
+ _vmTemplateHostDao.remove(destroyedTemplateHostVO.getId());
+ }
+ }
+ } catch (Exception e) {
+ s_logger.warn("problem cleaning up templates in secondary storage " + secondaryStorageHost, e);
+ }
+ }
+
+ // Cleanup snapshot in secondary storage hosts
+ for (HostVO secondaryStorageHost : secondaryStorageHosts) {
+ try {
+ long hostId = secondaryStorageHost.getId();
+ List vIDs = findAllVolumeIdInSnapshotTable(hostId);
+ if (vIDs == null) {
+ continue;
+ }
+ for (Long volumeId : vIDs) {
+ boolean lock = false;
+ try {
+ VolumeVO volume = _volsDao.findByIdIncludingRemoved(volumeId);
+ if (volume.getRemoved() == null) {
+ volume = _volsDao.acquireInLockTable(volumeId, 10);
+ if (volume == null) {
+ continue;
+ }
+ lock = true;
+ }
+ List snapshots = findAllSnapshotForVolume(volumeId);
+ if (snapshots == null) {
+ continue;
+ }
+ CleanupSnapshotBackupCommand cmd = new CleanupSnapshotBackupCommand(secondaryStorageHost.getStorageUrl(), secondaryStorageHost.getDataCenterId(), volume.getAccountId(),
+ volumeId, snapshots);
+
+ Answer answer = _agentMgr.sendToSecStorage(secondaryStorageHost, cmd);
+ if ((answer == null) || !answer.getResult()) {
+ String details = "Failed to cleanup snapshots for volume " + volumeId + " due to " + (answer == null ? "null" : answer.getDetails());
+ s_logger.warn(details);
+ }
+ } catch (Exception e1) {
+ s_logger.warn("problem cleaning up snapshots in secondary storage " + secondaryStorageHost, e1);
+ } finally {
+ if (lock) {
+ _volsDao.releaseFromLockTable(volumeId);
+ }
+ }
+ }
+ } catch (Exception e2) {
+ s_logger.warn("problem cleaning up snapshots in secondary storage " + secondaryStorageHost, e2);
+ }
+ }
+
+ } catch (Exception e3) {
+ s_logger.warn("problem cleaning up secondary storage ", e3);
+ }
+ }
@Override
public String getPrimaryStorageNameLabel(VolumeVO volume) {
@@ -2925,6 +3030,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
}
}
}
+
@Override
public void onManagementNodeJoined(List nodeList, long selfNodeId) {
diff --git a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java
index d24d5df9e20..8773ae8ba1d 100755
--- a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java
+++ b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java
@@ -349,16 +349,7 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma
// does the caller have the authority to act on this volume
_accountMgr.checkAccess(UserContext.current().getCaller(), null, v);
try {
- if (v != null && _volsDao.getHypervisorType(v.getId()).equals(HypervisorType.KVM)) {
- /* KVM needs to lock on the vm of volume, because it takes snapshot on behalf of vm, not volume */
- UserVmVO uservm = _vmDao.findById(v.getInstanceId());
- if (uservm != null) {
- UserVmVO vm = _vmDao.acquireInLockTable(uservm.getId(), 10);
- if (vm == null) {
- throw new CloudRuntimeException("Creating snapshot failed due to volume:" + volumeId + " is being used, try it later ");
- }
- }
- }
+
Long poolId = v.getPoolId();
if (poolId == null) {
throw new CloudRuntimeException("You cannot take a snapshot of a volume until it has been attached to an instance");
@@ -387,7 +378,7 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma
+ userVm.getState().toString() + " state");
}
- if(userVm.getHypervisorType() == HypervisorType.VMware) {
+ if(userVm.getHypervisorType() == HypervisorType.VMware || userVm.getHypervisorType() == HypervisorType.KVM) {
List activeSnapshots = _snapshotDao.listByInstanceId(v.getInstanceId(), Snapshot.Status.Creating, Snapshot.Status.CreatedOnPrimary, Snapshot.Status.BackingUp);
if(activeSnapshots.size() > 1)
throw new CloudRuntimeException("There is other active snapshot tasks on the instance to which the volume is attached, please try again later");
diff --git a/server/src/com/cloud/upgrade/dao/Upgrade2213to2214.java b/server/src/com/cloud/upgrade/dao/Upgrade2213to2214.java
index 42318961f1f..a91b6c26beb 100644
--- a/server/src/com/cloud/upgrade/dao/Upgrade2213to2214.java
+++ b/server/src/com/cloud/upgrade/dao/Upgrade2213to2214.java
@@ -80,5 +80,15 @@ public class Upgrade2213to2214 implements DbUpgrade {
} catch (SQLException e) {
throw new CloudRuntimeException("Unable to execute usage_event table update", e);
}
+
+ //Drop netapp_volume primary key and add it again
+ DbUpgradeUtils.dropPrimaryKeyIfExists(conn, "cloud.netapp_volume");
+ try {
+ PreparedStatement pstmt = conn.prepareStatement("ALTER TABLE `cloud`.`netapp_volume` add PRIMARY KEY (`id`)");
+ pstmt.executeUpdate();
+ pstmt.close();
+ } catch (SQLException e) {
+ throw new CloudRuntimeException("Unable to update primary key for netapp_volume", e);
+ }
}
}
diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java
index fa98d1dccb1..8b175d0191a 100755
--- a/server/src/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/com/cloud/vm/UserVmManagerImpl.java
@@ -1405,12 +1405,13 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager
if (snapshot.getStatus() != Snapshot.Status.BackedUp) {
throw new InvalidParameterValueException("Snapshot id=" + snapshotId + " is not in " + Snapshot.Status.BackedUp + " state yet and can't be used for template creation");
}
-
+
+/*
// bug #11428. Operation not supported if vmware and snapshots parent volume = ROOT
if(snapshot.getHypervisorType() == HypervisorType.VMware && snapshotVolume.getVolumeType() == Type.DATADISK){
throw new UnsupportedServiceException("operation not supported, snapshot with id " + snapshotId + " is created from Data Disk");
}
-
+*/
domainId = snapshot.getDomainId();
accountId = snapshot.getAccountId();
hyperType = snapshot.getHypervisorType();
@@ -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);
}
diff --git a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
index 7762822af62..9a20c576a71 100755
--- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -1832,7 +1832,14 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Listene
if(serverState == State.Starting) {
if(vm.getHostId() != null && vm.getHostId() != hostId) {
s_logger.info("CloudStack is starting VM on host " + vm.getHostId() + ", but status report comes from a different host " + hostId + ", skip status sync for vm: " + vm.getInstanceName());
- return null;
+ if (vm.getHypervisorType() == HypervisorType.XenServer){ // for xenserver (bug 12875) a starting VM can be discovered as running if a disconnected host connects back
+ try {
+ stateTransitTo(vm, VirtualMachine.Event.AgentReportMigrated, hostId);
+ } catch (NoTransitionException e) {
+ s_logger.warn(e.getMessage());
+ }
+ }
+ return null;
}
}
diff --git a/setup/db/db/schema-2213to2214.sql b/setup/db/db/schema-2213to2214.sql
index 721d2f2ac84..c1fd41c5d3b 100644
--- a/setup/db/db/schema-2213to2214.sql
+++ b/setup/db/db/schema-2213to2214.sql
@@ -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');
diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java b/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
index 20f8149551c..4890ee5ea0c 100755
--- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
+++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
@@ -247,7 +247,29 @@ public class VirtualMachineMO extends BaseMO {
}
public VirtualMachinePowerState getPowerState() throws Exception {
- return (VirtualMachinePowerState)getContext().getServiceUtil().getDynamicProperty(_mor, "runtime.powerState");
+
+ VirtualMachinePowerState powerState = VirtualMachinePowerState.poweredOff;
+
+ // This is really ugly, there is a case that when windows guest VM is doing sysprep, the temporary
+ // rebooting process may let us pick up a "poweredOff" state during VMsync process, this can trigger
+ // a series actions. Unfortunately, from VMware API we can not distinguish power state into such details.
+ // We hope by giving it 3 second to re-read the state can cover this as a short-term solution.
+ //
+ // In the future, VMsync should not kick off CloudStack action (this is not a HA case) based on VM
+ // state report, until then we can remove this hacking fix
+ for(int i = 0; i < 3; i++) {
+ powerState = (VirtualMachinePowerState)getContext().getServiceUtil().getDynamicProperty(_mor, "runtime.powerState");
+ if(powerState == VirtualMachinePowerState.poweredOff) {
+ try {
+ Thread.sleep(1000);
+ } catch(InterruptedException e) {
+ }
+ } else {
+ break;
+ }
+ }
+
+ return powerState;
}
public boolean reset() throws Exception {
diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareContext.java b/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareContext.java
index 7491a90fee0..2a30db48468 100755
--- a/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareContext.java
+++ b/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareContext.java
@@ -14,6 +14,7 @@ import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
+import java.net.ConnectException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
@@ -47,12 +48,16 @@ import com.vmware.vim25.VimPortType;
public class VmwareContext {
private static final Logger s_logger = Logger.getLogger(VmwareContext.class);
-
+
+ private static int MAX_CONNECT_RETRY = 5;
+ private static int CONNECT_RETRY_INTERVAL = 1000;
+
private ExtendedAppUtil _appUtil;
private String _serverAddress;
private Map _stockMap = new HashMap();
- private int _CHUNKSIZE = 1*1024*1024; // 1M
+ private int _CHUNKSIZE = 1*1024*1024; // 1M
+
static {
try {
@@ -328,7 +333,7 @@ public class VmwareContext {
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("Content-Type", "application/x-vnd.vmware-streamVmdk");
conn.setRequestProperty("Content-Length", Long.toString(new File(localFileName).length()));
- conn.connect();
+ connectWithRetry(conn);
BufferedOutputStream bos = null;
BufferedInputStream is = null;
@@ -367,8 +372,8 @@ public class VmwareContext {
conn.setRequestProperty(org.apache.axis.transport.http.HTTPConstants.HEADER_COOKIE, cookieString);
conn.setDoInput(true);
conn.setDoOutput(true);
- conn.setAllowUserInteraction(true);
- conn.connect();
+ conn.setAllowUserInteraction(true);
+ connectWithRetry(conn);
long bytesWritten = 0;
InputStream in = null;
@@ -387,8 +392,6 @@ public class VmwareContext {
if(progressUpdater != null)
progressUpdater.action(new Long(totalBytesDownloaded));
}
- } catch(Throwable e) {
- s_logger.error("Unexpected exception ", e);
} finally {
if(in != null)
in.close();
@@ -533,7 +536,7 @@ public class VmwareContext {
conn.setAllowUserInteraction(true);
conn.setRequestProperty(org.apache.axis.transport.http.HTTPConstants.HEADER_COOKIE, cookieString);
conn.setRequestMethod(httpMethod);
- conn.connect();
+ connectWithRetry(conn);
return conn;
}
@@ -556,6 +559,27 @@ public class VmwareContext {
org.apache.axis.MessageContext msgContext = callObj.getMessageContext();
String cookieString = (String)msgContext.getProperty(org.apache.axis.transport.http.HTTPConstants.HEADER_COOKIE);
return cookieString;
+ }
+
+ private static void connectWithRetry(HttpURLConnection conn) throws Exception {
+ boolean connected = false;
+ for(int i = 0; i < MAX_CONNECT_RETRY && !connected; i++) {
+ try {
+ conn.connect();
+ connected = true;
+ s_logger.info("Connected, conn: " + conn.toString() + ", retry: " + i);
+ } catch (Exception e) {
+ s_logger.warn("Unable to connect, conn: " + conn.toString() + ", message: " + e.toString() + ", retry: " + i);
+
+ try {
+ Thread.sleep(CONNECT_RETRY_INTERVAL);
+ } catch(InterruptedException ex) {
+ }
+ }
+ }
+
+ if(!connected)
+ throw new Exception("Unable to connect to " + conn.toString());
}
public void close() {