mirror of https://github.com/apache/cloudstack.git
Merge branch '2.2.y' of ssh://git.cloud.com/var/lib/git/cloudstack-oss into 2.2.y
This commit is contained in:
commit
0102e3f61d
|
|
@ -43,6 +43,8 @@ import com.cloud.agent.api.AgentControlCommand;
|
|||
import com.cloud.agent.api.Answer;
|
||||
import com.cloud.agent.api.Command;
|
||||
import com.cloud.agent.api.CronCommand;
|
||||
import com.cloud.agent.api.MaintainAnswer;
|
||||
import com.cloud.agent.api.MaintainCommand;
|
||||
import com.cloud.agent.api.ModifySshKeysCommand;
|
||||
import com.cloud.agent.api.PingCommand;
|
||||
import com.cloud.agent.api.ReadyCommand;
|
||||
|
|
@ -479,6 +481,16 @@ public class Agent implements HandlerFactory, IAgentControl {
|
|||
cancelTasks();
|
||||
_reconnectAllowed = false;
|
||||
answer = new Answer(cmd, true, null);
|
||||
} else if (cmd instanceof MaintainCommand) {
|
||||
s_logger.debug("Received maintainCommand" );
|
||||
MaintainCommand maintainCmd = (MaintainCommand)cmd;
|
||||
if (maintainCmd.getMaintain()) {
|
||||
cancelTasks();
|
||||
_reconnectAllowed = false;
|
||||
} else {
|
||||
_reconnectAllowed = true;
|
||||
}
|
||||
answer = new MaintainAnswer((MaintainCommand)cmd);
|
||||
} else if (cmd instanceof ReadyCommand) {
|
||||
ReadyCommand ready = (ReadyCommand)cmd;
|
||||
s_logger.debug("Received shutdownCommand, due to: " + ready.getDetails());
|
||||
|
|
|
|||
|
|
@ -68,6 +68,7 @@ import org.libvirt.StoragePoolInfo;
|
|||
import org.libvirt.StorageVol;
|
||||
import org.libvirt.StorageVolInfo;
|
||||
|
||||
|
||||
import com.cloud.agent.api.Answer;
|
||||
import com.cloud.agent.api.AttachIsoCommand;
|
||||
import com.cloud.agent.api.AttachVolumeAnswer;
|
||||
|
|
@ -170,6 +171,7 @@ import com.cloud.agent.resource.computing.LibvirtVMDef.InterfaceDef;
|
|||
import com.cloud.agent.resource.computing.LibvirtVMDef.InterfaceDef.hostNicType;
|
||||
import com.cloud.agent.resource.computing.LibvirtVMDef.SerialDef;
|
||||
import com.cloud.agent.resource.computing.LibvirtVMDef.TermPolicy;
|
||||
import com.cloud.agent.resource.computing.LibvirtVMDef.ClockDef;
|
||||
import com.cloud.agent.resource.virtualnetwork.VirtualRoutingResource;
|
||||
import com.cloud.dc.Vlan;
|
||||
import com.cloud.exception.InternalErrorException;
|
||||
|
|
@ -2232,6 +2234,14 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
|
|||
term.setPowerOffPolicy("destroy");
|
||||
term.setRebootPolicy("restart");
|
||||
vm.addComp(term);
|
||||
|
||||
ClockDef clock = new ClockDef();
|
||||
if (vmTO.getOs().startsWith("Windows")) {
|
||||
clock.setClockOffset(ClockDef.ClockOffset.LOCALTIME);
|
||||
clock.setTimer("rtc", "catchup", null);
|
||||
}
|
||||
|
||||
vm.addComp(clock);
|
||||
|
||||
DevicesDef devices = new DevicesDef();
|
||||
devices.setEmulatorPath(_hypervisorPath);
|
||||
|
|
|
|||
|
|
@ -183,6 +183,72 @@ public class LibvirtVMDef {
|
|||
}
|
||||
}
|
||||
|
||||
public static class ClockDef {
|
||||
public enum ClockOffset {
|
||||
UTC("utc"),
|
||||
LOCALTIME("localtime"),
|
||||
TIMEZONE("timezone"),
|
||||
VARIABLE("variable");
|
||||
|
||||
private String _offset;
|
||||
private ClockOffset(String offset) {
|
||||
_offset = offset;
|
||||
}
|
||||
@Override
|
||||
public String toString() {
|
||||
return _offset;
|
||||
}
|
||||
}
|
||||
private ClockOffset _offset;
|
||||
private String _timerName;
|
||||
private String _tickPolicy;
|
||||
private String _track;
|
||||
|
||||
public ClockDef() {
|
||||
_offset = ClockOffset.UTC;
|
||||
}
|
||||
|
||||
public void setClockOffset(ClockOffset offset) {
|
||||
_offset = offset;
|
||||
}
|
||||
|
||||
public void setTimer(String timerName, String tickPolicy, String track) {
|
||||
_timerName = timerName;
|
||||
_tickPolicy = tickPolicy;
|
||||
_track = track;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuilder clockBuilder = new StringBuilder();
|
||||
clockBuilder.append("<clock offset='");
|
||||
clockBuilder.append(_offset.toString());
|
||||
clockBuilder.append("'>\n");
|
||||
if (_timerName != null) {
|
||||
clockBuilder.append("<timer name='");
|
||||
clockBuilder.append(_timerName);
|
||||
clockBuilder.append("' ");
|
||||
|
||||
if (_tickPolicy != null) {
|
||||
clockBuilder.append("tickpolicy='");
|
||||
clockBuilder.append(_tickPolicy);
|
||||
clockBuilder.append("' ");
|
||||
}
|
||||
|
||||
if (_track != null) {
|
||||
clockBuilder.append("track='");
|
||||
clockBuilder.append(_track);
|
||||
clockBuilder.append("' ");
|
||||
}
|
||||
|
||||
clockBuilder.append(">\n");
|
||||
clockBuilder.append("</timer>\n");
|
||||
}
|
||||
clockBuilder.append("</clock>\n");
|
||||
return clockBuilder.toString();
|
||||
}
|
||||
}
|
||||
|
||||
public static class DevicesDef {
|
||||
private String _emulator;
|
||||
private final Map<String, List<?>> devices = new HashMap<String, List<?>>();
|
||||
|
|
|
|||
|
|
@ -0,0 +1,76 @@
|
|||
/**
|
||||
* Copyright (C) 2012 Citrix.com, Inc. All rights reserved.
|
||||
*
|
||||
* This software is licensed under the GNU General Public License v3 or later.
|
||||
*
|
||||
* It is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or any later version.
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
package com.cloud.agent.api;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class CleanupSnapshotBackupCommand extends Command {
|
||||
private String secondaryStoragePoolURL;
|
||||
private Long dcId;
|
||||
private Long accountId;
|
||||
private Long volumeId;
|
||||
private List<String> validBackupUUIDs;
|
||||
|
||||
protected CleanupSnapshotBackupCommand() {
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* @param secondaryStoragePoolURL This is what shows up in the UI when you click on Secondary storage.
|
||||
* In the code, it is present as: In the vmops.host_details table, there is a field mount.parent. This is the value of that field
|
||||
* If you have better ideas on how to get it, you are welcome.
|
||||
* @param validBackupUUID The VHD which are valid
|
||||
*/
|
||||
public CleanupSnapshotBackupCommand(String secondaryStoragePoolURL,
|
||||
Long dcId,
|
||||
Long accountId,
|
||||
Long volumeId,
|
||||
List<String> validBackupUUIDs)
|
||||
{
|
||||
this.secondaryStoragePoolURL = secondaryStoragePoolURL;
|
||||
this.dcId = dcId;
|
||||
this.accountId = accountId;
|
||||
this.volumeId = volumeId;
|
||||
this.validBackupUUIDs = validBackupUUIDs;
|
||||
}
|
||||
|
||||
public String getSecondaryStoragePoolURL() {
|
||||
return secondaryStoragePoolURL;
|
||||
}
|
||||
|
||||
public Long getDcId() {
|
||||
return dcId;
|
||||
}
|
||||
|
||||
public Long getAccountId() {
|
||||
return accountId;
|
||||
}
|
||||
|
||||
public Long getVolumeId() {
|
||||
return volumeId;
|
||||
}
|
||||
|
||||
public List<String> getValidBackupUUIDs() {
|
||||
return validBackupUUIDs;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean executeInSequence() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -0,0 +1,848 @@
|
|||
#New - Add all new parameters here.
|
||||
|
||||
|
||||
|
||||
|
||||
#Labels
|
||||
label.ocfs2=OCFS2
|
||||
|
||||
label.action.edit.host=Modifier l'hôte
|
||||
|
||||
network.rate=Débit réseau
|
||||
|
||||
ICMP.type=Type ICMP
|
||||
ICMP.code=Code ICMP
|
||||
|
||||
image.directory=Répertoire d'images
|
||||
|
||||
label.action.create.template.from.vm=Créer un modèle depuis la VM
|
||||
label.action.create.template.from.volume=Créer un modèle depuis le volume
|
||||
|
||||
message.vm.create.template.confirm=Créer un modèle va redémarrer la VM automatiquement
|
||||
|
||||
label.action.manage.cluster=Gérer le Cluster
|
||||
message.action.manage.cluster=Confirmez que vous voulez gérer le cluster
|
||||
label.action.manage.cluster.processing=Gestion du cluster...
|
||||
|
||||
label.action.unmanage.cluster=Ne plus gérer le Cluster
|
||||
message.action.unmanage.cluster=Confirmez que vous ne voulez plus gérer le cluster
|
||||
label.action.unmanage.cluster.processing=Arrêt de la gestion du Cluster
|
||||
|
||||
allocation.state=Etat de l'allocation
|
||||
managed.state=Etat de la gestion
|
||||
|
||||
label.default.use=Usage par défaut
|
||||
label.host.tags=Etiquettes d'hôtes
|
||||
|
||||
label.cidr=CIDR
|
||||
label.cidr.list=CIDR Source
|
||||
|
||||
label.storage.tags=Etiquettes de stockage
|
||||
|
||||
label.redundant.router=Routeur redondant
|
||||
label.is.redundant.router=Redondant
|
||||
|
||||
force.delete=Forcer la suppression
|
||||
force.delete.domain.warning=Attention\: Choisir cette opion entrainera la suppression de tous les domaines issus et l'ensemble des comptes associées, ainsi que de leur ressources
|
||||
|
||||
force.remove=Forcer la suppression
|
||||
force.remove.host.warning=Attention\: Choisir cette option entrainera CloudStack à arrêter l'ensemble des machines virtuelles avant d'enlever l'hôte du cluster
|
||||
|
||||
force.stop=Forcer l'arrêt
|
||||
force.stop.instance.warning=Attention\: Forcer l'arrêt sur cette instance devrait être votre dernière option. Cela peut entrainer la perte de données aussi bien que de rendre l'état de la machine inconsistent. Consultez le Guide d'Administration ou le Support de Cloud.com avant d'exécuter cette commande.
|
||||
|
||||
label.PreSetup=PreSetup
|
||||
label.SR.name = Nom du point de montage
|
||||
label.SharedMountPoint=Point de montage partagé
|
||||
label.VMFS.datastore=datastore VMFS
|
||||
|
||||
label.network.device=Equipement Réseau
|
||||
label.add.network.device=Ajouter un équipement réseau
|
||||
label.network.device.type=Type d'équipement réseau
|
||||
label.DHCP.server.type=Serveur DHCP
|
||||
label.Pxe.server.type=Serveur PXE
|
||||
label.PING.storage.IP=adresse PING (stockage)
|
||||
label.PING.dir=répertoire PING
|
||||
label.TFTP.dir=répertoire TFTP
|
||||
label.PING.CIFS.username=utilisateur CIFS PING
|
||||
label.PING.CIFS.password=mot de passe CIFS PING
|
||||
label.CPU.cap=Utilisation maximum du CPU
|
||||
|
||||
label.network.domain=Nom de domaine
|
||||
|
||||
label.action.enable.zone=Activer la zone
|
||||
label.action.enable.zone.processing=Activation de la zone...
|
||||
message.action.enable.zone=Confirmez que vous voulez activer cette zone
|
||||
label.action.disable.zone=Désactivation de la zone
|
||||
label.action.disable.zone.processing=Désactivation de la zone...
|
||||
message.action.disable.zone=Confirmez que vous voulez désactiver cette zone
|
||||
|
||||
label.action.enable.pod=Activer le Pod
|
||||
label.action.enable.pod.processing=Activation du Pod...
|
||||
message.action.enable.pod=Confirmez que vous souhaitez activer ce Pod
|
||||
label.action.disable.pod=Désactiver le Pod
|
||||
label.action.disable.pod.processing=Désactivation du Pod...
|
||||
message.action.disable.pod=Confirmez que vous voulez désactiver ce Pod
|
||||
|
||||
label.action.enable.cluster=Activer le cluster
|
||||
label.action.enable.cluster.processing=Activation du cluster...
|
||||
message.action.enable.cluster=Confirmez que vous souhaitez activer ce cluster
|
||||
label.action.disable.cluster=Désactiver le cluster
|
||||
label.action.disable.cluster.processing=Désactivation du cluster...
|
||||
message.action.disable.cluster=Confirmez que vous souhaitez désactiver ce cluster
|
||||
|
||||
label.account.id=ID du Compte
|
||||
label.account.name=Nom du compte
|
||||
label.account.specific=Spécifique au compte
|
||||
label.account=Compte
|
||||
label.accounts=Comptes
|
||||
label.acquire.new.ip=Acquérir une nouvelle adresse IP
|
||||
label.show.ingress.rule=Montrer la règle Ingress
|
||||
label.hide.ingress.rule=Cacher la règle Ingress
|
||||
label.action.attach.disk.processing=Attachement du Disque...
|
||||
label.action.attach.disk=Attacher un disque
|
||||
label.action.attach.iso.processing=Attachement de l'image ISO
|
||||
label.action.attach.iso=Attacher une image ISO
|
||||
label.action.cancel.maintenance.mode.processing=Annulation du mode maintenance...
|
||||
label.action.cancel.maintenance.mode=Annuler le mode maintenance
|
||||
label.action.change.password=Changer le mot de passe
|
||||
label.action.change.service.processing=Changement de d'offre de service...
|
||||
label.action.change.service=Changer d'offre de service
|
||||
label.action.copy.ISO.processing=Copie de l'image ISO...
|
||||
label.action.copy.ISO=Copier une image ISO
|
||||
label.action.copy.template.processing=Copie du Modèle...
|
||||
label.action.copy.template=Copier un modèle
|
||||
label.action.create.template.processing=Création du Modèle...
|
||||
label.action.create.template=Créer un modèle
|
||||
label.action.create.vm.processing=Création de la VM..
|
||||
label.action.create.vm=Créer une VM
|
||||
label.action.create.volume.processing=Création du Volume...
|
||||
label.action.create.volume=Créer un Volume
|
||||
label.action.delete.IP.range.processing=Suppression de la plage IP...
|
||||
label.action.delete.IP.range=Supprimer la plage IP
|
||||
label.action.delete.ISO.processing=Suppression de l'image ISO...
|
||||
label.action.delete.ISO=Supprimer l'image ISO
|
||||
label.action.delete.account.processing=Suppression du compte...
|
||||
label.action.delete.account=Supprimer un compte
|
||||
label.action.delete.cluster.processing=Suppression du Cluster...
|
||||
label.action.delete.cluster=Supprimer le Cluster
|
||||
label.action.delete.disk.offering.processing=Suppression de l'offre Disque...
|
||||
label.action.delete.disk.offering=Supprimer l'offre Disque
|
||||
|
||||
label.action.update.resource.count=Mettre à jour le compte d'utilisation des ressources
|
||||
label.action.update.resource.count.processing=Mise à jour du compteur...
|
||||
|
||||
label.action.delete.domain=Supprimer le domaine
|
||||
label.action.delete.domain.processing=Suppression du domaine...
|
||||
|
||||
label.action.delete.firewall.processing=Suppression du Parefeu...
|
||||
label.action.delete.firewall=Supprimer le Parefeu
|
||||
label.action.delete.ingress.rule.processing=Suppression de la règle Ingress..
|
||||
label.action.delete.ingress.rule=Supprimer la règle Ingress
|
||||
label.action.delete.load.balancer.processing=Suppression de l'équilibreur de charge...
|
||||
label.action.delete.load.balancer=Supprimer l'équilibreur de charge
|
||||
label.action.edit.network.processing=Modification du Réseau...
|
||||
label.action.edit.network=Modifier le réseau
|
||||
label.action.delete.network.processing=Suppression du réseau...
|
||||
label.action.delete.network=Supprimer le réseau
|
||||
label.action.delete.pod.processing=Suppression du pod...
|
||||
label.action.delete.pod=Supprimer le Pod
|
||||
label.action.delete.primary.storage.processing=Suppression du stockage primaire...
|
||||
label.action.delete.primary.storage=Supprimer le stockage primaire
|
||||
label.action.delete.secondary.storage.processing=Suppression du stockage secondaire...
|
||||
label.action.delete.secondary.storage=Supprimer le stockage secondaire
|
||||
label.action.delete.security.group.processing=Suppression du groupe de sécurité
|
||||
label.action.delete.security.group=Supprimer le groupe de sécurité
|
||||
label.action.delete.service.offering.processing=Suppression de l'offre de service...
|
||||
label.action.delete.service.offering=Supprimer l'offre de service
|
||||
label.action.delete.snapshot.processing=Suppresison de l'instantané...
|
||||
label.action.delete.snapshot=Supprimer l'instantané
|
||||
label.action.delete.template.processing=Suppression du modèle...
|
||||
label.action.delete.template=Supprimer le modèle
|
||||
label.action.delete.user.processing=Suppression de l'utilisateur...
|
||||
label.action.delete.user=Supprimer l'utilisateur
|
||||
label.action.delete.volume.processing=Suppression du volume...
|
||||
label.action.delete.volume=Supprimer le volume
|
||||
label.action.delete.zone.processing=Suppression de la zone...
|
||||
label.action.delete.zone=Supprimer la zone
|
||||
label.action.destroy.instance.processing=Suppression de l'instance...
|
||||
label.action.destroy.instance=Supprimer l'instance
|
||||
label.action.destroy.systemvm.processing=Suppression de la VM Système...
|
||||
label.action.destroy.systemvm=Supprimer la VM Système
|
||||
label.action.detach.disk.processing=Détachement du disque...
|
||||
label.action.detach.disk=Détacher le disque
|
||||
label.action.detach.iso.processing=Détachement de l'image ISO...
|
||||
label.action.detach.iso=Détacher l'image ISO
|
||||
label.action.disable.account.processing=Désactivation du compte...
|
||||
label.action.disable.account=Désactiver le compte
|
||||
label.action.disable.static.NAT.processing=Désactivation du NAT Statique...
|
||||
label.action.disable.static.NAT=Désactiver le NAT Statique
|
||||
label.action.disable.user.processing=Désactivation du l'utilisateur...
|
||||
label.action.disable.user=Désactiver l'utilisateur
|
||||
label.action.download.ISO=Télécharger une image ISO
|
||||
label.action.download.template=Télécharger un modèle
|
||||
label.action.download.volume.processing=Téléchargement du volume...
|
||||
label.action.download.volume=Télécharger un volume
|
||||
label.action.edit.ISO=Modifier l'image ISO
|
||||
label.action.edit.account=Modifier le Compte
|
||||
label.action.edit.disk.offering=Modifier l'offre de disque
|
||||
label.action.edit.domain=Modifier le domaine
|
||||
label.action.edit.global.setting=Modifier la configuration globale
|
||||
label.action.edit.instance=Modifier l'instancer
|
||||
label.action.edit.network.offering=Modifier l'offre de service réseau
|
||||
label.action.edit.pod=Modifier le pod
|
||||
label.action.edit.primary.storage=Modifier le stockage primaire
|
||||
label.action.edit.resource.limits=Modifier les limites de ressources
|
||||
label.action.edit.service.offering=Modifier l'offre de service
|
||||
label.action.edit.template=Modifier le modèle
|
||||
label.action.edit.user=Modifier l'utilisateur
|
||||
label.action.edit.zone=Modifier la zone
|
||||
label.action.enable.account.processing=Activation du compte...
|
||||
label.action.enable.account=Activer le compte
|
||||
label.action.enable.maintenance.mode.processing=Activation du mode maintenance...
|
||||
label.action.enable.maintenance.mode=Activer le mode maintenance
|
||||
label.action.enable.static.NAT.processing=Activation du NAT Statique...
|
||||
label.action.enable.static.NAT=Activer le NAT Statique
|
||||
label.action.enable.user.processing=Activation de l'utilisateur..
|
||||
label.action.enable.user=Activer l'utilisateur
|
||||
label.action.force.reconnect.processing=Reconnexion en cours...
|
||||
label.action.force.reconnect=Forcer la reconnexion
|
||||
label.action.generate.keys.processing=Génération des clés...
|
||||
label.action.generate.keys=Générer les clés
|
||||
label.action.lock.account.processing=Blocage du compte...
|
||||
label.action.lock.account=Bloquer le compte
|
||||
label.action.migrate.instance=Migrer l'instance
|
||||
label.action.migrate.instance.processing=Migration de l'instance...
|
||||
label.action.reboot.instance.processing=Redémarrage de l'instance...
|
||||
label.action.reboot.instance=Redémarrer l'instance
|
||||
label.action.reboot.router.processing=Redémarrage du routeur...
|
||||
label.action.reboot.router=Redémarrer le routeur
|
||||
label.action.reboot.systemvm.processing=Redémarrage de la VM Système...
|
||||
label.action.reboot.systemvm=Redémarre la VM Système
|
||||
label.action.recurring.snapshot=Instantané récurrent
|
||||
label.action.release.ip.processing=Libération de l'adresse IP...
|
||||
label.action.release.ip=Libérer l'adresse IP
|
||||
label.action.remove.host.processing=Suppression de l'hôte...
|
||||
label.action.remove.host=Supprimer l'hôte
|
||||
label.action.reset.password.processing=Réinitialisation le mot de passe...
|
||||
label.action.reset.password=Réinitialiser le mot de passe
|
||||
label.action.resource.limits=Limites de ressources
|
||||
label.action.restore.instance.processing=Restauration de l'instance...
|
||||
label.action.restore.instance=Restaurer l'instance
|
||||
label.action.start.instance.processing=Démarrage de l'instance
|
||||
label.action.start.instance=Démarrer l'instance
|
||||
label.action.start.router.processing=Démarrage du routeur...
|
||||
label.action.start.router=Démarrer le routeur
|
||||
label.action.start.systemvm.processing=Démarrage de la VM système
|
||||
label.action.start.systemvm=Démarrer la VM système
|
||||
label.action.stop.instance.processing=Arrêt de l'Instance...
|
||||
label.action.stop.instance=Arrêter l'Instance
|
||||
label.action.stop.router.processing=Arrêt du routeur...
|
||||
label.action.stop.router=Arrêter le routeur
|
||||
label.action.stop.systemvm.processing=Arrêt de la VM système...
|
||||
label.action.stop.systemvm=Arrêter la VM système
|
||||
label.action.take.snapshot.processing=Prise de l'instantané
|
||||
label.action.take.snapshot=Prendre un instantané
|
||||
label.action.update.OS.preference.processing=Mise à jour des préférences d'OS...
|
||||
label.action.update.OS.preference=Mettre à jour les préférences d'OS
|
||||
label.actions=Actions
|
||||
label.active.sessions=Sessions actives
|
||||
label.add.account=Ajouter un compte
|
||||
label.add.by.cidr=Ajouter par CIDR
|
||||
label.add.by.group=Ajouter par groupe
|
||||
label.add.cluster=Ajouter un cluster
|
||||
label.add.direct.iprange=Ajouter une plage d'adresse IP directe
|
||||
label.add.disk.offering=Ajouter une offre disque
|
||||
label.add.domain=Ajouter un domaine
|
||||
label.add.firewall=Ajouter un parefeu
|
||||
label.add.host=Ajouter un hôte
|
||||
label.add.ingress.rule=Ajouter une règle Ingress
|
||||
label.add.ip.range=Ajouter une plage IP
|
||||
label.add.iso=Ajouter une ISO
|
||||
label.add.load.balancer=Ajouter un partageur de charge
|
||||
label.add.more=Ajouter plus
|
||||
label.add.network=Ajouter un réseau
|
||||
label.add.pod=Ajouter un pod
|
||||
label.add.primary.storage=Ajouter un stockage primaire
|
||||
label.add.secondary.storage=Ajouter un stockage secondaire
|
||||
label.add.security.group=Ajouter un groupe de sécurité
|
||||
label.add.service.offering=Ajouter un offre de service
|
||||
label.add.system.service.offering=Ajouter une offre de service système
|
||||
label.add.template=Ajouter un modèle
|
||||
label.add.user=Ajouter un utilisateur
|
||||
label.add.vlan=Ajouter un vlan
|
||||
label.add.volume=Ajouter un volume
|
||||
label.add.zone=Ajouter une zone
|
||||
label.add=Ajouter
|
||||
label.adding.cluster=Ajout du Cluster
|
||||
label.adding.failed=Echec de l'ajout
|
||||
label.adding.pod=Ajout du Pod
|
||||
label.adding.processing=Ajout...
|
||||
label.adding.succeeded=Ajout réussi
|
||||
label.adding.user=Ajout de l'utilisateur
|
||||
label.adding.zone=Ajout de la zone
|
||||
label.adding=Ajout
|
||||
label.additional.networks=Réseaux additionnels
|
||||
label.admin.accounts=Comptes Administrateur
|
||||
label.admin=Administrateur
|
||||
label.advanced.mode=Mode avancé
|
||||
label.advanced.search=Recherche avancée
|
||||
label.advanced=Avancé
|
||||
label.alert=Alerte
|
||||
label.algorithm=Algorithme
|
||||
label.allocated=Alloué
|
||||
label.api.key=Clé d'API
|
||||
label.assign.to.load.balancer=Assigner l'instance au partageur de charge
|
||||
label.assign=Assigner
|
||||
label.associated.network.id=ID du réseau associé
|
||||
label.attached.iso=Image ISO attachée
|
||||
label.availability.zone=Zone de disponibilité
|
||||
label.availability=Disponibilité
|
||||
label.available.public.ips=Adresses IP publiques disponibles
|
||||
label.available=Disponible
|
||||
label.back=Retour
|
||||
label.basic.mode=Mode basique
|
||||
label.bootable=Bootable
|
||||
label.broadcast.domain.type=Type de domaine de broadcast
|
||||
label.by.account=Par compte
|
||||
label.by.availability=Par disponibilité
|
||||
label.by.domain=Par domaine
|
||||
label.by.end.date=Par date de fin
|
||||
label.by.level=Par niveau
|
||||
label.by.pod=Par Pod
|
||||
label.by.role=Par role
|
||||
label.by.start.date=Par date de début
|
||||
label.by.state=Par état
|
||||
label.by.traffic.type=Par type de traffic
|
||||
label.by.type.id=Par type d'ID
|
||||
label.by.type=Par type
|
||||
label.by.zone=Par zone
|
||||
label.bytes.received=Octets reçus
|
||||
label.bytes.sent=Octets envoyés
|
||||
label.cancel=Annuler
|
||||
label.certificate=Certificat
|
||||
label.privatekey=Clé privée PKCS#8
|
||||
label.domain.suffix=Suffixe de domaine DNS (i.e., xyz.com)
|
||||
label.character=Caractère
|
||||
label.cidr.account=CIDR ou Compte/Groupe de sécurité
|
||||
label.close=Fermer
|
||||
label.cloud.console=Console de gestion du cloud
|
||||
label.cloud.managed=Géré par Cloud.com
|
||||
label.cluster.type=Type de Cluster
|
||||
label.cluster=Cluster
|
||||
label.code=Code
|
||||
label.confirmation=Confirmation
|
||||
label.cpu.allocated.for.VMs=CPU alloué aux VMs
|
||||
label.cpu.allocated=CPU alloué
|
||||
label.cpu.mhz=CPU (en MHz)
|
||||
label.cpu.utilized=CPU utilisé
|
||||
label.cpu=CPU
|
||||
label.created=Créé
|
||||
label.cross.zones=Multi Zones
|
||||
label.custom.disk.size=Taille de disque personnalisée
|
||||
label.daily=Quotidien
|
||||
label.data.disk.offering=Offre de disque de données
|
||||
label.date=Date
|
||||
label.day.of.month=Jour du mois
|
||||
label.day.of.week=Jour de la semaine
|
||||
label.delete=Supprimer
|
||||
label.deleting.failed=Suppression échouée
|
||||
label.deleting.processing=Suppression...
|
||||
label.description=Description
|
||||
label.detaching.disk=Détacher le disque
|
||||
label.details=Details
|
||||
label.device.id=ID du périphérique
|
||||
label.disabled=Désactivé
|
||||
label.disabling.vpn.access=Désactiver l'accès VPN
|
||||
label.disk.allocated=Disque Alloué
|
||||
label.disk.offering=Offre de Disque
|
||||
label.disk.size.gb=Taille du disque (en Go)
|
||||
label.disk.size=Taille du disque
|
||||
label.disk.total=Espace disque total
|
||||
label.disk.volume=Volume disque
|
||||
label.display.text=Texte affiché
|
||||
label.dns.1=DNS1
|
||||
label.dns.2=DNS2
|
||||
label.domain.admin=Administrateur du domaine
|
||||
label.domain.id=ID du domaine
|
||||
label.domain.name=Nom de domaine
|
||||
label.domain=Domaine
|
||||
label.double.quotes.are.not.allowed=Les guillemets ne sont pas autorisés
|
||||
label.download.progress=Progression du téléchargement
|
||||
label.edit=Modifier
|
||||
label.email=Email
|
||||
label.enabling.vpn.access=Activation de l'accès VPN
|
||||
label.enabling.vpn=Activation du VPN
|
||||
label.end.port=Port de fin
|
||||
label.endpoint.or.operation=Terminaison ou Opération
|
||||
label.error.code=Code d'erreur
|
||||
label.error=Erreur
|
||||
label.esx.host=Hôte ESX/ESXi
|
||||
label.example=Exemple
|
||||
label.failed=Echoué
|
||||
label.featured=Sponsorisé
|
||||
label.firewall=Parefeu
|
||||
label.first.name=Prénom
|
||||
label.format=Format
|
||||
label.friday=Vendredi
|
||||
label.full=Complet
|
||||
label.gateway=Passerelle
|
||||
label.general.alerts=Alertes générales
|
||||
label.generating.url=Génération de l'URL
|
||||
label.generating.url=Génération de l'URL
|
||||
label.go.step.2=Aller à l'étape 2
|
||||
label.go.step.3=Aller à l'étape 3
|
||||
label.go.step.4=Aller à l'étape 4
|
||||
label.go.step.5=Aller à l'étape 5
|
||||
label.group.optional=Groupe (optionnel)
|
||||
label.group=Groupe
|
||||
label.guest.cidr=CIDR invités
|
||||
label.guest.gateway=Passerelle pour les invités
|
||||
label.guest.ip.range=Plage d'adresses IP des invités
|
||||
label.guest.ip=Adresse IP des invités
|
||||
label.guest.netmask=Masque de réseau des invités
|
||||
label.ha.enabled=Haute disponibilité active
|
||||
label.help=Aide
|
||||
label.host.alerts=Alertes des hôtes
|
||||
label.host.name=Nom de l'hôte
|
||||
label.host=Hôte
|
||||
label.hosts=Hôtes
|
||||
label.hourly=A l'heure
|
||||
label.hypervisor.type=Type d'hyperviseur
|
||||
label.hypervisor=Hyperviseur
|
||||
label.id=ID
|
||||
label.info=Information
|
||||
label.ingress.rule=Règle Ingress
|
||||
label.initiated.by=Initié par
|
||||
label.instance.limits=Limites des instances
|
||||
label.instance.name=Nom de lìnstance
|
||||
label.instance=Instance
|
||||
label.instances=Instances
|
||||
label.internal.dns.1=DNS interne 1
|
||||
label.internal.dns.2=DNS interne 2
|
||||
label.interval.type=Type d'ìntervalle
|
||||
label.invalid.integer=Nombre entier invalide
|
||||
label.invalid.number=Nombre invalide
|
||||
label.ip.address=Adresse IP
|
||||
label.ip.allocations=Allocations de IPs
|
||||
label.ip.limits=Limite de IPs publiques
|
||||
label.ip.or.fqdn=IP ou FQDN
|
||||
label.ip.range=Plage IP
|
||||
label.ip=IP
|
||||
label.ips=IPs
|
||||
label.is.default=Est par défaut
|
||||
label.is.shared=Est partagé
|
||||
label.is.system=Est système
|
||||
label.iscsi=iSCSI
|
||||
label.iso.boot=Démarrage par ISO
|
||||
label.iso=ISO
|
||||
label.isolation.mode=Mode d'isolation
|
||||
label.keep=Conserver
|
||||
label.lang.chinese=Chinois (simplifié)
|
||||
label.lang.english=Anglais
|
||||
label.lang.japanese=Japonais
|
||||
label.lang.spanish=Espagnol
|
||||
label.last.disconnected=Dernière Déconnexion
|
||||
label.last.name=Nom de famille
|
||||
label.level=Niveau
|
||||
label.linklocal.ip=Adresse IP de lien local
|
||||
label.load.balancer=Partageur de charge
|
||||
label.loading=Chargement en cours
|
||||
label.local=Local
|
||||
label.login=Connexion
|
||||
label.logout=Déconnexion
|
||||
label.lun=LUN
|
||||
label.manage=Gérer
|
||||
label.maximum=Maximum
|
||||
label.memory.allocated=Mémoire allouée
|
||||
label.memory.mb=Mémoire (en MB)
|
||||
label.memory.total=Mémoire totale
|
||||
label.memory.used=Mémoire utilisée
|
||||
label.memory=Mémoire
|
||||
label.menu.accounts=Comptes
|
||||
label.menu.alerts=Alertes
|
||||
label.menu.all.accounts=Tout les comptes
|
||||
label.menu.all.instances=Toutes les instances
|
||||
label.menu.community.isos=ISO de la communauté
|
||||
label.menu.community.templates=Modèles de la communauté
|
||||
label.menu.configuration=Configuration
|
||||
label.menu.dashboard=Tableau de bord
|
||||
label.menu.destroyed.instances=Instances détruites
|
||||
label.menu.disk.offerings=Offres de disque
|
||||
label.menu.domains=Domaines
|
||||
label.menu.events=Evénements
|
||||
label.menu.featured.isos=ISOs Sponsorisées
|
||||
label.menu.featured.templates=Modèles sponsorisés
|
||||
label.menu.global.settings=Paramètres globaux
|
||||
label.menu.instances=Instances
|
||||
label.menu.ipaddresses=Adresses IP
|
||||
label.menu.isos=ISOs
|
||||
label.menu.my.accounts=Mes comptes
|
||||
label.menu.my.instances=Mes instances
|
||||
label.menu.my.isos=Mes ISOs
|
||||
label.menu.my.templates=Mes modèles
|
||||
label.menu.network.offerings=Offres de Service Réseau
|
||||
label.menu.network=Réseau
|
||||
label.menu.physical.resources=Ressources physiques
|
||||
label.menu.running.instances=Instances actives
|
||||
label.menu.security.groups=Groupes de sécurité
|
||||
label.menu.service.offerings=Offres de Service
|
||||
label.menu.system.service.offerings=Offres de Service Système
|
||||
label.menu.snapshots=Instantanés
|
||||
label.menu.stopped.instances=Instances Arrêtées
|
||||
label.menu.storage=Stockage
|
||||
label.menu.system.vms= VMs systèmes
|
||||
label.menu.system=Système
|
||||
label.menu.templates=Modèles
|
||||
label.menu.virtual.appliances=Appliances Virtuelles
|
||||
label.menu.virtual.resources=Ressources Virtuelles
|
||||
label.menu.volumes=Volumes
|
||||
label.migrate.instance.to=Migrer l'instance vers
|
||||
label.minimum=Minimum
|
||||
label.minute.past.hour=Minute(s) après l'heure
|
||||
label.monday=Lundi
|
||||
label.monthly=Mensuel
|
||||
label.more.templates=Plus de modèles
|
||||
label.my.account=Mon compte
|
||||
label.name.optional=Nom (facultatif)
|
||||
label.name=Nom
|
||||
label.netmask=Masque de réseau
|
||||
label.network.desc=Description réseau
|
||||
label.network.domain=Nom de domaine
|
||||
label.network.id=ID réseau
|
||||
label.network.name=Nom du réseau
|
||||
label.network.offering.display.text=Texte affiché d'Offre de Réseau
|
||||
label.network.offering.id=ID de l'Offre de Service Réseau
|
||||
label.network.offering.name=Nom de l'Offre de Service Réseau
|
||||
label.network.offering=Offre de Service Réseau
|
||||
label.network.rate=Débit Réseau
|
||||
label.network.read=Lecture réseau
|
||||
label.network.type=Type de réseau
|
||||
label.network.write=Écriture réseau
|
||||
label.network=Réseau
|
||||
label.new.password=Nouveau mot de passe
|
||||
label.next=Suivant
|
||||
label.nfs.server=Serveur NFS
|
||||
label.nfs.storage=Stockage NFS
|
||||
label.nfs=NFS
|
||||
label.nics=Cartes NIC
|
||||
label.no.actions=Aucune action disponibles
|
||||
label.no.alerts=Aucune alerte récentes
|
||||
label.no.errors=Aucune erreur récentes
|
||||
label.no.isos=Aucun ISOs disponibles
|
||||
label.no.items=Aucun élément disponibles
|
||||
label.no.security.groups=Aucun groupe de sécurité disponibles
|
||||
label.no.thanks=Non merci
|
||||
label.no=Non
|
||||
label.none=Aucun
|
||||
label.not.found=Introuvable
|
||||
label.num.cpu.cores=Nombre de c\u0153urs de processeur
|
||||
label.numretries = Nombre de tentatives
|
||||
label.offer.ha=Offrir la haute disponibilité
|
||||
label.optional=Facultatif
|
||||
label.os.preference=Préférence du OS
|
||||
label.os.type=Type du OS
|
||||
label.owned.public.ips=Addresses IP Publique détenues
|
||||
label.owner.account=Compte propriétaire
|
||||
label.owner.domain=Domaine propriétaire
|
||||
label.parent.domain=Domaine Parent
|
||||
label.password.enabled=Mot de passe activé
|
||||
label.password=Mot de passe
|
||||
label.path=Chemin
|
||||
label.please.wait=Patientez s'il vous plait
|
||||
label.pod=Pod
|
||||
label.port.forwarding=Redirection de port
|
||||
label.port.range=Plage de ports
|
||||
label.prev=Précédent
|
||||
label.primary.allocated=Stockage primaire alloué
|
||||
label.primary.network=Réseau primaire
|
||||
label.primary.storage=Stockage primaire
|
||||
label.primary.used=Stockage primaire utilisé
|
||||
label.private.interface=Interface privée
|
||||
label.private.ip.range=Plage d'adresses IP Privées
|
||||
label.private.ip=Adresse IP Privée
|
||||
label.private.ips=Adresses IP Privées
|
||||
label.private.port=Port privé
|
||||
label.private.zone=Zone Privée
|
||||
label.protocol=Protocole
|
||||
label.protocol=Protocole
|
||||
label.public.interface=Interface publique
|
||||
label.public.ip=Adresse IP publique
|
||||
label.public.ips=Adresses IP publiques
|
||||
label.public.port=Port public
|
||||
label.public.zone=Zone publique
|
||||
label.public=Publique
|
||||
label.recent.errors=Erreurs récentes
|
||||
label.refresh=Actualiser
|
||||
label.related=Connexes
|
||||
label.remove.from.load.balancer=Supprimer l'instance du partageur de charge
|
||||
label.removing.user=Retrait de l'utilisateur
|
||||
label.required=Requis
|
||||
label.reserved.system.ip=Adresse IP Système réservé
|
||||
label.resource.limits=Limite des ressources
|
||||
label.resource=Ressource
|
||||
label.resources=Ressources
|
||||
label.role=Rôle
|
||||
label.root.disk.offering=Offre de disque racine
|
||||
label.running.vms=VMs actives
|
||||
label.saturday=Samedi
|
||||
label.save=Sauvegarder
|
||||
label.saving.processing=Sauvegarde en cours....
|
||||
label.scope=Portée
|
||||
label.search=Rechercher
|
||||
label.secondary.storage=Stockage secondaire
|
||||
label.secondary.used=Stockage secondaire utilisé
|
||||
label.secret.key=clé privée
|
||||
label.security.group.name=Nom du groupe de sécurité
|
||||
label.security.group=Groupe de sécurité
|
||||
label.security.groups.enabled=Groupes de sécurité Activés
|
||||
label.security.groups=Groupes de sécurité
|
||||
label.sent=Envoyer
|
||||
label.server=Serveur
|
||||
label.service.offering=Offre de Service
|
||||
label.system.service.offering=Offre de Service Système
|
||||
label.session.expired=Session expiré
|
||||
label.shared=En partage
|
||||
label.size=Taille
|
||||
label.snapshot.limits=Limite d'instantanés
|
||||
label.snapshot.name=Nom de l'instantané
|
||||
label.snapshot.s=Instantané(s)
|
||||
label.snapshot.schedule=Programmation de l'Instantané
|
||||
label.snapshot=Instantané
|
||||
label.snapshots=Instantanés
|
||||
label.source.nat=NAT Source
|
||||
label.specify.vlan=Précisez le VLAN
|
||||
label.start.port=Port de
|
||||
label.state=État
|
||||
label.static.nat.to=NAT Static vers
|
||||
label.static.nat=NAT Static
|
||||
label.statistics=Statistiques
|
||||
label.status=Statut
|
||||
label.step.1.title=Etape 1 \: <strong>Sélectionnez un modèle</strong>
|
||||
label.step.1=Étape 1
|
||||
label.step.2.title=Etape 2\: <strong>Offre de Service</strong>
|
||||
label.step.2=Étape 2
|
||||
label.step.3.title=Etape 3\: <strong id\="step3_label">Sélectionnez une offre de service</strong>
|
||||
label.step.3=Étape 3
|
||||
label.step.4.title=Etape 4\: <strong>Réseau</strong>
|
||||
label.step.4=Étape 4
|
||||
label.step.5.title=Etape 5\: <strong>Vérification</strong>
|
||||
label.step.5=Étape 5
|
||||
label.stopped.vms=VMs arrêtés
|
||||
label.storage.type=Type de stockage
|
||||
label.storage=Stockage
|
||||
label.submit=Envoyer
|
||||
label.submitted.by=[Soumis par\: <span id\="submitted_by"></span>]
|
||||
label.succeeded=Réussi
|
||||
label.sunday=Dimanche
|
||||
label.system.capacity=Ressources disponibles pour l'ensemble du Système
|
||||
label.system.vm.type=Type de VM système
|
||||
label.system.vm.type=Type de VM système
|
||||
label.system.vm=VM Système
|
||||
label.system.vms= VMs Systèmes
|
||||
label.tagged=Taggé
|
||||
label.tags=Tags
|
||||
label.target.iqn=IQN de la Cible
|
||||
label.template.limits=Limites des modèles
|
||||
label.template=Modèle
|
||||
label.theme.default=Thème par défaut
|
||||
label.theme.grey=Personnalisé - Gris
|
||||
label.theme.lightblue=Personnalisé - Blue clair
|
||||
label.thursday=Jeudi
|
||||
label.time.zone=Fuseau horaire
|
||||
label.time=Temps
|
||||
label.timeout.in.second = Timeout(en secondes)
|
||||
label.timezone=Fuseau horaire
|
||||
label.total.cpu=Capacité Totale en CPU
|
||||
label.total.vms=Nombre total de VMs
|
||||
label.traffic.type=Type de Traffic
|
||||
label.tuesday=Mardi
|
||||
label.type.id=ID du Type
|
||||
label.type=Type
|
||||
label.unavailable=Indisponible
|
||||
label.unlimited=Illimité
|
||||
label.untagged=Non Taggé
|
||||
label.update.ssl.cert=Mettre à jour le certificate SSL
|
||||
label.update.ssl=Mettre à jour le certificate SSL
|
||||
label.updating=Mise à jour
|
||||
label.url=URL
|
||||
label.usage.interface=Interface d'Usage
|
||||
label.used=Utilisé
|
||||
label.user=Utilisateur
|
||||
label.username=Nom d'Utilisateur
|
||||
label.users=Utilisateurs
|
||||
label.value=Valeur
|
||||
label.vcenter.cluster=Cluster vCenter
|
||||
label.vcenter.datacenter=Datacenter vCenter
|
||||
label.vcenter.datastore=Datastore vCenter
|
||||
label.vcenter.host=Hôte Vcenter
|
||||
label.vcenter.password=Mot de passe vCenter
|
||||
label.vcenter.username=Nom d'utilisateur vCenter
|
||||
label.version=Version
|
||||
label.virtual.appliance=Appliance Virtuelle
|
||||
label.virtual.appliances=Appliances Virtuelles
|
||||
label.virtual.network=Réseau virtuel
|
||||
label.vlan.id=ID du VLAN
|
||||
label.vlan.range=Plage du VLAN
|
||||
label.vlan=VLAN
|
||||
label.vm.add=Ajouter une instance
|
||||
label.vm.destroy=Détruire
|
||||
label.vm.reboot=Redémarrer
|
||||
label.vm.start=Démarrer
|
||||
label.vm.stop=Arrêtez
|
||||
label.vmfs=VMFS
|
||||
label.vms=VMs
|
||||
label.volume.limits=Limites des volumes
|
||||
label.volume.name=Nom du volume
|
||||
label.volume=Volume
|
||||
label.volumes=Volumes
|
||||
label.vpn=VPN
|
||||
label.vsphere.managed=Gérée par vSphere
|
||||
label.waiting=En attente
|
||||
label.warn=Avertir
|
||||
label.wednesday=Mercredi
|
||||
label.weekly=Hebdomadaire
|
||||
label.welcome.cloud.console=Bienvenue dans la console de gestion
|
||||
label.welcome=Bienvenue
|
||||
label.yes=Oui
|
||||
label.zone.id=ID de la zone
|
||||
label.zone.step.1.title=Etape 1\: <strong>Sélectionnez un réseau</strong>
|
||||
label.zone.step.2.title=Etape 2\: <strong>Ajoutez une zone</strong>
|
||||
label.zone.step.3.title=Etape 3\: <strong>Ajoutez un Pod</strong>
|
||||
label.zone.step.4.title=Etape 4\: <strong>Ajoutez une plage d'adresses IP</strong>
|
||||
label.zone.wide=Etendu à la zone
|
||||
label.zone=Zone
|
||||
|
||||
#Messages
|
||||
message.acquire.public.ip=Sélectionnez la zone dans laquelle vous voulez acquérir votre nouvelle adresse IP.
|
||||
message.action.cancel.maintenance.mode=Confirmer que vous souhaitez annuler cette maintenance.
|
||||
message.action.cancel.maintenance=Votre hôte a été annulée de la maintenance. Ce processus peut prendre jusqu'à plusieurs minutes.
|
||||
message.action.delete.ISO.for.all.zones=L'ISO est utilisé par toutes les zones. S'il vous plaît confirmer que vous voulez le supprimer de toutes les zones.
|
||||
message.action.delete.ISO=Confirmer que vous souhaitez supprimer cette ISO.
|
||||
message.action.delete.cluster=Confirmer que vous voulez supprimer ce cluster.
|
||||
message.action.delete.disk.offering=Confirmer que vous souhaitez supprimer cette offre de disque.
|
||||
message.action.delete.domain=Confirmer que vous voulez supprimer ce domaine.
|
||||
message.action.delete.external.firewall=Confirmer que vous souhaitez supprimer ce pare-feu externe. Attention\: Si vous prévoyez de rajouter le même pare-feu externe de nouveau, vous devez réinitialiser les données d'utilisation sur l'appareil.
|
||||
message.action.delete.external.load.balancer=Confirmez que vous souhaitez supprimer ce partageur de charge externe. Attention \: Si vous pensez ajouter le même partageur de charge plus tard, vous devez remettre à zéro les statistiques d'usage de cet équipement.
|
||||
message.action.delete.ingress.rule=Confirmez que vous souhaitez supprimer cette règle Ingress
|
||||
message.action.delete.network=Confirmer que vous voulez supprimer ce réseau.
|
||||
message.action.delete.pod=Confirmez que vous souhaitez supprimer ce pod.
|
||||
message.action.delete.primary.storage=Confirmer que vous voulez supprimer ce stockage primaire.
|
||||
message.action.delete.secondary.storage=Confirmez que vous souhaitez supprimer ce stockage secondaire.
|
||||
message.action.delete.security.group=Confirmez que vous souhaitez supprimer ce groupe de sécurité.
|
||||
message.action.delete.service.offering=Confirmez que vous souhaitez supprimer cette offre de service.
|
||||
message.action.delete.snapshot=Confirmez que vous souhaitez supprimer cet instantané
|
||||
message.action.delete.template.for.all.zones=Ce modèle est utilisé par toutes les zones. Confirmez que vous souhaitez le supprimer de toutes les zones.
|
||||
message.action.delete.template=Confirmez que vous souhaitez supprimer ce modèle.
|
||||
message.action.delete.volume=Confirmez que vous souhaitez supprimer ce volume.
|
||||
message.action.delete.zone=Confirmez que vous souhaitez supprimer cette zone.
|
||||
message.action.destroy.instance=Confirmez que vous souhaitez supprimer cette instance.
|
||||
message.action.destroy.systemvm=Confirmez que vous souhaitez supprimer cette VM Système.
|
||||
message.action.disable.static.NAT=Confirmez que vous souhaitez désactiver le NAT statique.
|
||||
message.action.enable.maintenance=Votre hôte a été mis en mode maintenance avec succès. Ce processus peut durer plusieurs minutes ou plus suivant le nombre de VMs actives sur cet hôte.
|
||||
message.action.force.reconnect=Votre hôte a été forcé à se reconnecter avec succès. Ce processus peut prendre jusqu'à plusieurs minutes.
|
||||
message.action.force.reconnect=Votre hôte a été forcé à se reconnecter avec succès. Ce processus peut prendre jusqu'à plusieurs minutes.
|
||||
message.action.host.enable.maintenance.mode=Activer le mode maintenance va causer la migration à chaud de l'ensemble des instances de cet hôte sur les autres hôtes disponibles.
|
||||
message.action.instance.reset.password=Confirmez que vous souhaitez changer le mot de passe ROOT de cette machine virtuelle.
|
||||
message.action.primarystorage.enable.maintenance.mode=Attention \: placer ce stockage primaire en mode maintenance que l'ensemble des VMs utilisant des volumes sur ce stockage. Souhaitez vous continuer ?
|
||||
message.action.reboot.instance=Confirmez que vous souhaitez redémarrer cette instance.
|
||||
message.action.reboot.router=Confirmez que vous souhaitez redémarrer ce routeur.
|
||||
message.action.reboot.systemvm=Confirmez que vous souhaitez redémarrer cette VM Système
|
||||
message.action.release.ip=Confirmez que vous souhaitez libérer cette IP.
|
||||
message.action.remove.host=Supprimer le dernier/seul hôte dans le cluster et le réinstaller va supprimer l'environnement/la base de données sur l'hôte et rendre les VMs invitées inutilisables.
|
||||
message.action.restore.instance=Confirmez que vous souhaitez restaurer cette instance.
|
||||
message.action.start.instance=Confirmez que vous souhaitez démarrer cette instance.
|
||||
message.action.start.router=Confirmez que vous souhaitez démarrer ce routeur.
|
||||
message.action.start.systemvm=Confirmez que vous souhaitez redémarrer cette VM système.
|
||||
message.action.stop.instance=Confirmez que vous souhaitez arrêter cette instance.
|
||||
message.action.stop.router=Confirmez que vous souhaitez arrêter ce routeur.
|
||||
message.action.stop.systemvm=Confirmez que vous souhaitez arrêter cette VM.
|
||||
message.action.take.snapshot=Confirmez que vous voulez prendre un instantané.
|
||||
message.add.cluster.zone=Ajouter un cluster d'hyperviseurs géré pour cette zone <b><span id\="zone_name"></span></b>
|
||||
message.add.cluster=Ajouter un cluster d'hyperviseurs géré pour cette zone <b><span id\="zone_name"></span></b>, pod <b><span id\="pod_name"></span></b>
|
||||
message.add.disk.offering=Renseignez les paramètres suivants pour ajouter un offre de service de disques
|
||||
message.add.firewall=Ajouter un parefeu à cette zone
|
||||
message.add.host=Renseignez les paramètres suivant pour ajouter un hôte
|
||||
message.add.ip.range.direct.network=Ajouter une plage IP au réseau direct <b><span id\="directnetwork_name"></span></b> dans la zone <b><span id\="zone_name"></span></b>
|
||||
message.add.ip.range.to.pod=<p>Ajouter une plage IP pour le pod\: <b><span id\="pod_name_label"></span></b></p>
|
||||
message.add.ip.range=Ajouter une plage IP pour le réseau publique dans la zone
|
||||
message.add.load.balancer=Ajouter un partageur de charge à la zone
|
||||
message.add.network=Ajouter un nouveau réseau à la zone\: <b><span id\="zone_name"></span></b>
|
||||
message.add.pod=Ajouter un nouveau pod à la zone <b><span id\="add_pod_zone_name"></span></b>
|
||||
message.add.primary.storage=Ajouter un nouveau stockage primaire à la zone <b><span id\="zone_name"></span></b>, pod <b><span id\="pod_name"></span></b>
|
||||
message.add.primary=Renseignez les paramètres suivants pour ajouter un sotckage primaire
|
||||
message.add.secondary.storage=Ajouter un nouveau stockage pour la zone <b><span id\="zone_name"></span></b>
|
||||
message.add.service.offering=Renseignez les informations suivantes pour ajouter une nouvelle offre de service.
|
||||
message.add.template=Renseignez les informations suivantes pour créer votre nouveau modèle
|
||||
message.add.volume=Renseignez les informations suivantes pour ajouter un nouveau volume
|
||||
message.additional.networks.desc=Sélectionnez le(s) réseau(x) additionnel(s) au(x)quel(s) sera connectée votre instance.
|
||||
message.advanced.mode.desc=Choisissez ce modèle de réseau si vous souhaitez bénéficier du support des VLANs. Ce mode de réseau donne le plus de flexibilité aux administrateurs pour fournir des offres de service réseau personnalisées comme fournir des parefeux, vpn, partageurs de charge ou également activer des réseaux virtuels ou directs.
|
||||
message.advanced.security.group=Choisissez ceci si vous souhaitez utiliser les groupes de sécurité pour fournir l'isolation des VMs invitées.
|
||||
message.advanced.virtual=Choisissez ceci si vous souhaitez utiliser des VLANs pour fournir l'isolation des VMs invitées.
|
||||
message.allow.vpn.access=Entrez un nom d'utilisateur et un mot de passe pour l'utilisateur que vous souhaitez autorisé à utiliser l'accès VPN.
|
||||
message.attach.iso.confirm=Confirmez que vous souhaitez attacher l'image ISO à cette instance.
|
||||
message.attach.volume=Renseignez les données suivante pour attacher un nouveau volume. Si vous attachez un volume disque à une machine virtuelle sous Windows, vous aurez besoin de redémarrer l'instance pour voir le nouveau disque.
|
||||
message.basic.mode.desc=Choisissez ce modèle de réseau si vous <b>*<u>ne voulez pas</u>*</b> activer le support des VLANs. Toutes les instances créées avec ce modèle de réseau se verront assignées une adresse IP et les groupes de sécurité seront utilisés pour fournir l'isolation entre les VMs.
|
||||
|
||||
message.change.offering.confirm=Confirmez que vous souhaitez changer l'offre de service de cette instance.
|
||||
message.copy.iso.confirm=Confirmez que vous souhaitez copier votre image ISO vers
|
||||
message.copy.template=Copier le modèle <b id\="copy_template_name_text">XXX</b> de la zone <b id\="copy_template_source_zone_text"></b> vers
|
||||
message.create.template.vm=Créer la VM depuis le modèle <b id\="p_name"></b>
|
||||
message.create.template.volume=Renseignez les informations suivantes avec de créer un modèle à partir de votre volume de disque\:<b><span id\="volume_name"></span></b>. La création du modèle peut prendre plusieurs minutes suivant la taille du volume.
|
||||
message.delete.account=Confirmez que vous souhaitez supprimer ce compte.
|
||||
message.detach.iso.confirm=Confirmez que vous souhaitez détacher l'image ISO de cette instance.
|
||||
message.disable.account=Confirmez que vous souhaitez désactiver ce compte. En désactivant ce compte, tous les utilisateurs du compte ne pourront plus accéder à leurs ressources. Toutes les VMs actives seront arrêtées immédiatement.
|
||||
message.disable.vpn.access=Confirmez que vous souhaitez désactiver l'accès VPN.
|
||||
message.download.ISO=Cliquez sur <a href\="#">00000</a> pour télécharger l'ISO
|
||||
message.download.template=Cliquez sur <a href\="#">00000</a> pour télécharger le modèle
|
||||
message.download.volume=Cliquez sur <a href\="#">00000</a> pour télécharger le volume
|
||||
message.edit.confirm=Vérifiez vos changements avant de cliquer sur "Sauvegarder"
|
||||
message.edit.limits=Renseignez les limites pour les ressources suivantes. "-1" indique qu'il n'y a pas de limites pour la création de ressources.
|
||||
message.enable.account=Confirmez que vous souhaitez activer ce compte.
|
||||
message.enable.vpn.access=Le VPN est désactivé pour cette adresse IP. Voulez vous activer l'accès VPN ?
|
||||
message.enable.vpn=L'accès VPN n'est pas activé. Please <a href\="#" id\="enable_vpn_link">cliquez ici</a> pour activer le VPN.
|
||||
message.enabled.vpn.ip.sec=Votre clé partagée IPSec est
|
||||
message.enabled.vpn=Votre accès VPN est activé et peut être accédé par l'IP
|
||||
message.launch.vm.on.private.network=Souhaitez vous démarrer l'instance sur votre propre réseau privé dédié ?
|
||||
message.lock.account=Confirmez que vous souhaitez verrouiller ce compte. En le verrouillant, les utilisateurs de ce compte ne seront plus capable de gérer leurs ressources. Les ressources existantes resteront toutefois accessibles.
|
||||
message.migrate.instance.confirm=Confirmez l'hôte vers lequel vous souhaitez migrer cette instance
|
||||
message.new.user=Renseignez les informations suivantes pour ajouter un nouvel utilisateur au compte.
|
||||
message.no.network.support.configuration.not.true=Vous n'avez pas de zone avec les groupes de sécurité activés. Donc, pas de fonctionnalités supplémentaires pour le réseau. Continuez à l'étape 5.
|
||||
message.no.network.support=Sélectionnez l'hyperviseur. vSphere, n'a pas de fonctionnalités supplémentaires pour le réseau. Continuez à l'étape 5.
|
||||
message.number.clusters=<h2><span> # of </span> Clusters</h2>
|
||||
message.number.hosts=<h2><span> # of </span> Hôtes</h2>
|
||||
message.number.pods=<h2><span> # of </span> Pods</h2>
|
||||
message.number.storage=<h2><span> # of </span> Volumes de Stockage Primaire</h2>
|
||||
message.number.zones=<h2><span> # of </span> Zones</h2>
|
||||
message.remove.vpn.access=Confirmez que vous souhaitez supprimer l'accès VPN à l'utilisateur suivant.
|
||||
message.restart.mgmt.server=Redémarrez votre(vos) serveur(s) de management pour appliquer les nouveaux paramètres.
|
||||
message.security.group.usage=(Utilisez <strong>Ctrl-clic</strong> pour séléctionner les groupes de sécurité visés)
|
||||
message.snapshot.schedule=Vous pouvez mettre en place les politiques de génération d'instantanés en sélectionnant les options disponibles ci-dessous et en appliquant votre politique.
|
||||
message.step.1.continue=Sélectionnez un modèle ou une image ISO pour continuer
|
||||
message.step.1.desc=Sélectionnez un template pour votre nouvelle instance virtuelle. Vous pouvez également choisir un modèle vierge sur lequel une image ISO pourra être installé.
|
||||
message.step.2.continue=Sélectionnez une offre de service pour continuer
|
||||
message.step.2.desc=
|
||||
message.step.3.continue=Sélectionnez un offre de service de disque pour continuer
|
||||
message.step.3.desc=
|
||||
message.step.4.continue=Sélectionnez au moins un réseau pour continuer
|
||||
message.step.4.desc=Sélectionnez le réseau principal auquel votre instance va être connecté.
|
||||
message.update.os.preference=Choisissez votre OS préféré pour cet hôte. Toutes les instances avec des préférences similaires seront d'abord allouées à cet hôte avant d'en choisir un autre.
|
||||
message.update.ssl=Soumettez un nouveau certificat SSL compatible X.509 qui sera mis à jour sur l'ensemble de instance de proxy console.
|
||||
message.virtual.network.desc=Un réseau virtuel dédié pour votre compte. Ce domaine de broadcast est contenu dans un VLAN et l'ensemble de accès réseau publique sont routés par un routeur virtuel.
|
||||
message.volume.create.template.confirm=Confirmez que vous souhaitez créer un modèle pour ce disque. La création peut prendre plusieurs minutes, voire plus, selon la taille du volume.
|
||||
message.zone.step.1.desc=Sélectionnez un modèle de réseau pour votre zone.
|
||||
message.zone.step.2.desc=Renseignez les informations suivantes pour ajouter une zone.
|
||||
message.zone.step.3.desc=Renseignez les informations suivantes pour ajouter un pod.
|
||||
message.apply.snapshot.policy=Vous avez mis à jour votre politique d'instantanés avec succès.
|
||||
message.disable.snapshot.policy=Vous avez désactivé votre politique de snapshots avec succès.
|
||||
message.action.change.service.warning.for.instance=Votre instance doit être arrêtée avant d'essayer de changer son offre de service.
|
||||
message.action.change.service.warning.for.router=Votre routeur doit être arrêté avant d'essayer de changer son offre de service.
|
||||
message.action.reset.password.warning=Votre instance doit être arrêtée avant d'essayer de changer son mot de passe.
|
||||
message.action.reset.password.off=Votre instance ne supporte pas pour le moment cette fonctionnalité.
|
||||
|
||||
#Errors
|
||||
error.login=Votre nom d'utilisateur /mot de passe ne correspond pas à nos données.
|
||||
error.menu.select=Impossible d'effectuer cette action tant que vous n'avez pas sélectionné d'éléments.
|
||||
error.mgmt.server.inaccessible=Le serveur de management est indisponible. Essayez plus tard.
|
||||
error.session.expired=Votre session a expiré.
|
||||
error.unresolved.internet.name=Votre nom internet ne peut pas être résolu.
|
||||
|
|
@ -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\: <strong>Selecione o Template</strong>
|
||||
label.step.1=Passo 1
|
||||
label.step.2.title=Passo 2\: <strong>Plano</strong>
|
||||
label.step.2=Passo 2
|
||||
label.step.3.title=Passo 3\: <strong id\="step3_label">Selecione o Disco Adicional</strong>
|
||||
label.step.3=Passo 3
|
||||
label.step.4.title=Passo 4\: <strong>Rede</strong>
|
||||
label.step.4=Passo 4
|
||||
label.step.5.title=Passo 5\: <strong>Revisar</strong>
|
||||
label.step.5=Passo 5
|
||||
label.stopped.vms=VMs Paradas
|
||||
label.storage.type=Tipo de Storage
|
||||
label.storage=Storage
|
||||
label.submit=Enviar
|
||||
label.submitted.by=[Enviado por\: <span id\="submitted_by"></span>]
|
||||
label.succeeded=Sucedido
|
||||
label.sunday=Domingo
|
||||
label.system.capacity=Capacidade Geral
|
||||
label.system.vm.type=Tipo de VM de Sistema
|
||||
label.system.vm.type=Tipo de VM de Sistema
|
||||
label.system.vm=VM de Sistema
|
||||
label.system.vms=VM de Sistemas
|
||||
label.tagged=Tagged
|
||||
label.tags=Tags
|
||||
label.target.iqn=Target IQN
|
||||
label.template.limits=Limites do Template
|
||||
label.template=Template
|
||||
label.theme.default=Tema Padrão
|
||||
label.theme.grey=Custom - Grey
|
||||
label.theme.lightblue=Custom - Light Blue
|
||||
label.thursday=Quinta
|
||||
label.time.zone=Fuso Horário
|
||||
label.time=Time
|
||||
label.timeout.in.second = Timeout(segundos)
|
||||
label.timezone=Fuso Horário
|
||||
label.total.cpu=CPU TOTAL
|
||||
label.total.vms=Total VMs
|
||||
label.traffic.type=Tipo de Tráfego
|
||||
label.tuesday=Terça
|
||||
label.type.id=Tipo do ID
|
||||
label.type=Tipo
|
||||
label.unavailable=IndisponÃvel
|
||||
label.unlimited=Ilimitado
|
||||
label.untagged=Não Marcado
|
||||
label.update.ssl.cert=Atualizar Certificado SSL
|
||||
label.update.ssl=Atualizar Certificado SSL
|
||||
label.updating=Atualizando
|
||||
label.url=URL
|
||||
label.usage.interface=Usage Interface
|
||||
label.used=Usado
|
||||
label.user=Usuário
|
||||
label.username=Nome de Usuário
|
||||
label.users=Usuários
|
||||
label.value=Valor
|
||||
label.vcenter.cluster=vCenter Cluster
|
||||
label.vcenter.datacenter=vCenter Datacenter
|
||||
label.vcenter.datastore=vCenter Datastore
|
||||
label.vcenter.host=vCenter Host
|
||||
label.vcenter.password=vCenter Password
|
||||
label.vcenter.username=vCenter Username
|
||||
label.version=Versão
|
||||
label.virtual.appliance=Appliance Virtual
|
||||
label.virtual.appliances=Appliances Virtuais
|
||||
label.virtual.network=Rede Virtual
|
||||
label.vlan.id=VLAN ID
|
||||
label.vlan.range=Intervalo de VLAN
|
||||
label.vlan=VLAN
|
||||
label.vm.add=Adicionar Cloud Server
|
||||
label.vm.destroy=Apagar
|
||||
label.vm.reboot=Reiniciar
|
||||
label.vm.start=Iniciar
|
||||
label.vm.stop=Parar
|
||||
label.vmfs=VMFS
|
||||
label.vms=VMs
|
||||
label.volume.limits=Limites de Disco
|
||||
label.volume.name=Nome do Disco
|
||||
label.volume=Disco
|
||||
label.volumes=Discos
|
||||
label.vpn=VPN
|
||||
label.vsphere.managed=vSphere Managed
|
||||
label.waiting=Aguardando
|
||||
label.warn=Avisar
|
||||
label.wednesday=Quarta-Feira
|
||||
label.weekly=Semanal
|
||||
label.welcome.cloud.console=Painel de Controle
|
||||
label.welcome=Bem-Vindo
|
||||
label.yes=Sim
|
||||
label.zone.id=ID da Zona
|
||||
label.zone.step.1.title=Passo 1\: <strong>Selecionar a Rede</strong>
|
||||
label.zone.step.2.title=Passo 2\: <strong>Adicionar a Zona</strong>
|
||||
label.zone.step.3.title=Passo 3\: <strong>Adicionar o POD</strong>
|
||||
label.zone.step.4.title=Passo 4\: <strong>Adicionar um Intervalo de IP</strong>
|
||||
label.zone.wide=Zone-Wide
|
||||
label.zone=Zona
|
||||
|
||||
#Messages
|
||||
message.acquire.public.ip=Selecione a zona de onde você deseja adquirir o novo IP
|
||||
message.action.cancel.maintenance.mode=Confirme que você deseja cancelar esta manutenção
|
||||
message.action.cancel.maintenance=A manutenção do seu HOST foi cancelada com sucesso
|
||||
message.action.delete.ISO.for.all.zones=Esta ISO é usada por todas as Zonas. Confirme se você deseja excluir a ISO de todas as Zonas
|
||||
message.action.delete.ISO=Confirme que você deseja excluir esta ISO
|
||||
message.action.delete.cluster=Confirme que você deseja excluir este HOST
|
||||
message.action.delete.disk.offering=Confirme que você deseja excluir esta oferta de disco
|
||||
message.action.delete.domain=Confirme que você deseja excluir este domÃnio
|
||||
message.action.delete.external.firewall=Confirme que você gostaria de remover este Firewall externo. Aviso\: Se você está planejando adicionar novamente este mesmo Firewall, é necessário apagar os contadores do dispositivo.
|
||||
message.action.delete.external.load.balancer=Confirme que você gostaria de remover este Load Balancer Externo. Aviso\: Se você está planejando adicionar novamente este mesmo Load Balancer, é necessário apagar os contadores do dispositivo.
|
||||
message.action.delete.ingress.rule=Confirme que você deseja excluir esta regra de entrada.
|
||||
message.action.delete.network=Confirme que você deseja remover esta rede.
|
||||
message.action.delete.pod=Confirme que você deseja remover este POD.
|
||||
message.action.delete.primary.storage=Confirme que você deseja remover este Storage Primário.
|
||||
message.action.delete.secondary.storage=Confirme que você deseja remover este Storage Secundário.
|
||||
message.action.delete.security.group=Confirme que você deseja remover este Security Group.
|
||||
message.action.delete.service.offering=Confirme que você deseja remover este Plano.
|
||||
message.action.delete.snapshot=Confirme que você deseja remover este Snapshot.
|
||||
message.action.delete.template.for.all.zones=Este Template é usado por todas as zonas. Confirme que você deseja remover o Template de todas as zonas.
|
||||
message.action.delete.template=Confirme que você deseja remover este Template.
|
||||
message.action.delete.volume=Confirme que você deseja remover este Disco.
|
||||
message.action.delete.zone=Confirme que você deseja remover esta Zona.
|
||||
message.action.destroy.instance=Confirme que você deseja excluir este Cloud Server.
|
||||
message.action.destroy.systemvm=Confirme que você deseja excluir esta VM de Sistema.
|
||||
message.action.disable.static.NAT=Confirme que você deseja desativar o NAT estático.
|
||||
message.action.enable.maintenance=O Host foi preparado com sucesso para manutenção. Este processo poderá levar alguns minutos ou mais dependendo do número de VMs hospedadas neste Host.
|
||||
message.action.force.reconnect=O procedimento de reconexão forçada foi preparado com sucesso. Este processo poderá levar alguns minutos.
|
||||
message.action.force.reconnect=O procedimento de reconexão forçada foi preparado com sucesso. Este processo poderá levar alguns minutos.
|
||||
message.action.host.enable.maintenance.mode=Ativar o modo de manutenção irá causar o live migration de todos Cloud Server hospedados neste Host para o próximo disponÃvel.
|
||||
message.action.instance.reset.password=Confirme que você deseja trocar a senha de ROOT para este Cloud Server.
|
||||
message.action.primarystorage.enable.maintenance.mode=Aviso\: Colocar o Storage primário em modo de manutenção irá causar a parada de todas as VMs hospedadas nesta unidade. Deseja continuar?
|
||||
message.action.reboot.instance=Confirme que você deseja reiniciar este Cloud Server.
|
||||
message.action.reboot.router=Confirme que você deseja reiniciar este roteador.
|
||||
message.action.reboot.systemvm=Confirme que você deseja reiniciar esta VM de sistema.
|
||||
message.action.release.ip=Confirme que você deseja liberar este IP.
|
||||
message.action.remove.host=Remover o único/último host do cluster e reinstalar o host irá provocar a perda do ambiente/banco do host tornando os Cloud Servers inutilizáveis.
|
||||
message.action.restore.instance=Confirme que você deseja restaurar este Cloud Server.
|
||||
message.action.start.instance=Confirme que você deseja iniciar este Cloud Server.
|
||||
message.action.start.router=Confirme que você deseja inciar este roteador.
|
||||
message.action.start.systemvm=Confirme que você deseja iniciar esta VM de sistema.
|
||||
message.action.stop.instance=Confirme que você deseja parar este Cloud Server.
|
||||
message.action.stop.router=Confirme que você deseja parar este roteador.
|
||||
message.action.stop.systemvm=Confirme que você deseja parar esta VM de Sistema.
|
||||
message.action.take.snapshot=Confirme que você deseja gerar um Snapshot.
|
||||
message.add.cluster.zone=Add a hypervisor managed cluster for zone <b><span id\="zone_name"></span></b>
|
||||
message.add.cluster=Add a hypervisor managed cluster for zone <b><span id\="zone_name"></span></b>, pod <b><span id\="pod_name"></span></b>
|
||||
message.add.disk.offering=Especifique o seguintes parâmetros para adicionar uma nova oferta de disco.
|
||||
message.add.firewall=Adicionar Firewall à zona.
|
||||
message.add.host=Especifique os seguintes parâmetros para adicionar um novo host.
|
||||
message.add.ip.range.direct.network=Add an IP range to direct network <b><span id\="directnetwork_name"></span></b> in zone <b><span id\="zone_name"></span></b>
|
||||
message.add.ip.range.to.pod=<p>Add an IP range to pod\: <b><span id\="pod_name_label"></span></b></p>
|
||||
message.add.ip.range=Add an IP range to public network in zone
|
||||
message.add.load.balancer=Add a load balancer to zone
|
||||
message.add.network=Add a new network for zone\: <b><span id\="zone_name"></span></b>
|
||||
message.add.pod=Add a new pod for zone <b><span id\="add_pod_zone_name"></span></b>
|
||||
message.add.primary.storage=Adicionar novo Storage primário à zona <b><span id\="zone_name"></span></b>, pod <b><span id\="pod_name"></span></b>
|
||||
message.add.primary=Especifique os seguintes parâmetros para adicionar um novo Storage primário.
|
||||
message.add.secondary.storage=Add a new storage for zone <b><span id\="zone_name"></span></b>
|
||||
message.add.service.offering=Preencha os seguintes dados para adicionar um novo plano.
|
||||
message.add.template=Entre com os dados para criar um novo template.
|
||||
message.add.volume=Entre com os dados para criar um novo disco.
|
||||
message.additional.networks.desc=Selecione a(s) rede(s) adicionais que seu Cloud Server terá acesso.
|
||||
message.advanced.mode.desc=Escolhe este modelo de rede se deseja ter habilitar o suporte a VLAN. Este modelo permite maior flexibilidade ao administrador ao permitir ofertas de rede customizada, firewall, vpn ou load balancer bem como acesso via rede virtual ou acesso direto.
|
||||
message.advanced.security.group=Escolha esta opção se desejar utilizar Security Groups para isolamento das VMs guest.
|
||||
message.advanced.virtual=Escolha esta opção se desejar utilizar VLANs para isolamento das VMs guest.
|
||||
message.allow.vpn.access=Entre com nome de usuário e senha do usuário que terá acesso VPN.
|
||||
message.attach.iso.confirm=Confirme que você deseja conectar a ISO ao Cloud Server.
|
||||
message.attach.volume=Preencha os seguintes dados para conectar o novo disco. Se você está conectando um disco a um Cloud Server Windows, será necessário reiniciar o Cloud Server para visualizar o novo disco.
|
||||
message.basic.mode.desc=Escolha este modelo de rede se você <b>*<u>não</u>*</b> quer suporte a VLAN. Todo Cloud Server criado neste modelo de rede estará ligado diretamente a um IP da rede e será usado Security Groups para prover segurança e separação.
|
||||
message.change.offering.confirm=Confirme que você deseja mudar o plano deste Cloud Server.
|
||||
message.copy.iso.confirm=Confirme se você deseja copiar a ISO para
|
||||
message.copy.template=Copiar template <b id\="copy_template_name_text">XXX</b> da zona <b id\="copy_template_source_zone_text"></b> para
|
||||
message.create.template.vm=Criar VM do template <b id\="p_name"></b>
|
||||
message.create.template.volume=Especifique as seguintes informações antes de criar o template a partir do disco\: <b><span id\="volume_name"></span></b>. A criação de um template a partir de um disco pode levar alguns minutos ou mais dependendo do tamnho do disco.
|
||||
message.delete.account=Confirme se você deseja excluir esta conta.
|
||||
message.detach.iso.confirm=Confirme se você deseja desconectar a ISO do Cloud Server.
|
||||
message.disable.account=Confirme se você deseja desativar a conta. Desativando a conta, todos os usuários desta conta não poderão acessar seus recursos na nuvem. Todos Cloud Server serão automaticamente desligados.
|
||||
message.disable.vpn.access=Confirme se você deseja desativar o acesso VPN.
|
||||
message.download.ISO=Clique <a href\="#">00000</a> para baixar a ISO
|
||||
message.download.template=Clique <a href\="#">00000</a> para baixar o template
|
||||
message.download.volume=Clique <a href\="#">00000</a> para baixar o disco
|
||||
message.edit.confirm=Confira as alterações antes de clicar em 'Salvar'.
|
||||
message.edit.limits=Especifique os limites para os seguintes recursos. "-1" indica sem limite para o total de recursos criados.
|
||||
message.enable.account=Confirme se você deseja ativar a conta.
|
||||
message.enable.vpn.access=VPN está desativada para este endereço IP. Gostaria de ativar o acesso VPN?
|
||||
message.enable.vpn=Acesso VPN não está ativado. Por favor <a href\="#" id\="enable_vpn_link">clique aqui</a> para ativar a VPN.
|
||||
message.enabled.vpn.ip.sec=Sua chave IPSec (pre-shared) é
|
||||
message.enabled.vpn=Seu acesso VPN está ativado e pode ser acessado através do IP
|
||||
message.launch.vm.on.private.network=Você deseja carregar seu Cloud Server na sua rede privada dedicada?
|
||||
message.lock.account=Confirme se você deseja bloquear esta conta. Bloqueando a conta, todos os usuários desta conta não estarão mais habilitados a gerenciar os recursos na nuvem. Os recursos existentes (Cloud Server) ainda poderão ser acessados.
|
||||
message.migrate.instance.confirm=Confirme o host que você deseja migrar o Cloud Server.
|
||||
message.new.user=Especifique a seguir para adicionar um novo usuário na conta
|
||||
message.no.network.support.configuration.not.true=Você não possui nenhuma zona com Security Group ativado. Assim, sem recursos de rede adicionais. Por favor vá para o passo 5.
|
||||
message.no.network.support=O hypervisor escolhido, vSphere, não possui nenhum recurso de rede adicional. Por favor, vá para o passo 5.
|
||||
message.number.clusters=<h2>Clusters</h2>
|
||||
message.number.hosts=<h2>Hosts</h2>
|
||||
message.number.pods=<h2>PODs</h2>
|
||||
message.number.storage=<h2>Volumes do Storage Primário</h2>
|
||||
message.number.zones=<h2>Zonas</h2>
|
||||
message.remove.vpn.access=Confirme se você deseja remover acesso VPN do seguinte usuário.
|
||||
message.restart.mgmt.server=Reinicie o(s) servidor(es) de gerenciamento para que a nova configuração tenha efeito.
|
||||
message.security.group.usage=(Use <strong>Ctrl-clique</strong> para selecionar todos os Security Groups)
|
||||
message.snapshot.schedule=Você pode configurar Snapshots recorrentes agendados selecionando as opções disponÃveis abaixo
|
||||
message.step.1.continue=Selecione o template ou ISO para continuar
|
||||
message.step.1.desc=<strong>Selecione o template para o novo Cloud Server.</strong>
|
||||
message.step.2.continue=Selecione o plano
|
||||
message.step.2.desc=
|
||||
message.step.3.continue=Seleciona a oferta de disco
|
||||
message.step.3.desc=
|
||||
message.step.4.continue=Selecione pelo menos uma rede para continuar
|
||||
message.step.4.desc=Selecione a rede principal que seu Cloud Server será conectado.
|
||||
message.update.os.preference=Escolha o SO de preferencia para este host. Todos Cloud Server com preferencias similares serão alocados neste host antes de tentar em outro.
|
||||
message.update.ssl=Envie o novo certificado SSL X.509 para ser atualizado em cada console proxy\:
|
||||
message.virtual.network.desc=Rede virtual dedicado para sua conta. O domÃnio de broadcast está na VLAN e todo acesso a internet é roteado através do virtual router.
|
||||
message.volume.create.template.confirm=Confirme se você deseja criar um template a partir deste disco. A criação do template pode levar alguns minutos ou mais dependendo do tamanho do disco.
|
||||
message.zone.step.1.desc=Seleciona o modelo de rede para a zona.
|
||||
message.zone.step.2.desc=Entre com as informações a seguir para adicionar a nova zona
|
||||
message.zone.step.3.desc=Entre com as informações a seguir para adicionar o novo POD
|
||||
message.apply.snapshot.policy=Você atualizou com sucesso sua polÃtica de Snapshot.
|
||||
message.disable.snapshot.policy=Você desativou com sucesso sua polÃtica de Snapshot.
|
||||
message.action.change.service.warning.for.instance=Para troca de plano é necessário parar o Cloud Server.
|
||||
message.action.change.service.warning.for.router=O roteador precisa ser desligado antes de trocar o plano/tamanho.
|
||||
message.action.reset.password.warning=Para recuperar a senha é necessário parar o Cloud Server.
|
||||
message.action.reset.password.off=Seu Cloud Server não suporta esta funcionalidade.
|
||||
|
||||
#Errors
|
||||
error.login=Usuário ou senha inválido.
|
||||
error.menu.select=ImpossÃvel executar ação. Selecionar um ou mais itens.
|
||||
error.mgmt.server.inaccessible=O servidor de gerenciamento está inacessÃvel. Tente novamente mais tarde.
|
||||
error.session.expired=Sua sessão expirou.
|
||||
error.unresolved.internet.name=ImpossÃvel resolver DNS
|
||||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -594,6 +594,9 @@ public class VirtualRoutingResource implements Manager {
|
|||
|
||||
String publicNic = "eth" + nicNum;
|
||||
command.add("-c", publicNic);
|
||||
|
||||
command.add("-g", vlanGateway);
|
||||
|
||||
|
||||
return command.execute();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -1075,7 +1075,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
|
|||
}
|
||||
}
|
||||
|
||||
synchronized (s_vms) {
|
||||
synchronized (_cluster.intern()) {
|
||||
s_logger.debug("1. The VM " + vmName + " is in Starting state.");
|
||||
s_vms.put(_cluster, _name, vmName, State.Starting);
|
||||
}
|
||||
|
|
@ -1158,7 +1158,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
|
|||
String msg = handleVmStartFailure(conn, vmName, vm, "", e);
|
||||
return new StartAnswer(cmd, msg);
|
||||
} finally {
|
||||
synchronized (s_vms) {
|
||||
synchronized (_cluster.intern()) {
|
||||
if (state != State.Stopped) {
|
||||
s_logger.debug("2. The VM " + vmName + " is in " + state + " state.");
|
||||
s_vms.put(_cluster, _name, vmName, state);
|
||||
|
|
@ -1599,6 +1599,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
|
|||
args += " -c ";
|
||||
args += "eth" + correctVif.getDevice(conn);
|
||||
|
||||
args += " -g ";
|
||||
args += vlanGateway;
|
||||
|
||||
|
||||
String result = callHostPlugin(conn, "vmops", "ipassoc", "args", args);
|
||||
if (result == null || result.isEmpty()) {
|
||||
|
|
@ -2138,7 +2141,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
|
|||
final State state = getVmState(conn, vmName);
|
||||
Integer vncPort = null;
|
||||
if (state == State.Running) {
|
||||
synchronized (s_vms) {
|
||||
synchronized (_cluster.intern()) {
|
||||
s_logger.debug("3. The VM " + vmName + " is in " + State.Running + " state");
|
||||
s_vms.put(_cluster, _name, vmName, State.Running);
|
||||
}
|
||||
|
|
@ -2162,7 +2165,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
|
|||
for (NicTO nic : nics) {
|
||||
getNetwork(conn, nic);
|
||||
}
|
||||
synchronized (s_vms) {
|
||||
synchronized (_cluster.intern()) {
|
||||
s_logger.debug("4. The VM " + vm.getName() + " is in " + State.Migrating + " state");
|
||||
s_vms.put(_cluster, _name, vm.getName(), State.Migrating);
|
||||
}
|
||||
|
|
@ -2442,7 +2445,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
|
|||
|
||||
state = s_vms.getState(_cluster, vmName);
|
||||
|
||||
synchronized (s_vms) {
|
||||
synchronized (_cluster.intern()) {
|
||||
s_logger.debug("5. The VM " + vmName + " is in " + State.Stopping + " state");
|
||||
s_vms.put(_cluster, _name, vmName, State.Stopping);
|
||||
}
|
||||
|
|
@ -2508,7 +2511,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
|
|||
s_logger.warn(msg, e);
|
||||
return new MigrateAnswer(cmd, false, msg, null);
|
||||
} finally {
|
||||
synchronized (s_vms) {
|
||||
synchronized (_cluster.intern()) {
|
||||
s_logger.debug("6. The VM " + vmName + " is in " + State.Stopping + " state");
|
||||
s_vms.put(_cluster, _name, vmName, state);
|
||||
}
|
||||
|
|
@ -2633,7 +2636,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
|
|||
@Override
|
||||
public RebootAnswer execute(RebootCommand cmd) {
|
||||
Connection conn = getConnection();
|
||||
synchronized (s_vms) {
|
||||
synchronized (_cluster.intern()) {
|
||||
s_logger.debug("7. The VM " + cmd.getVmName() + " is in " + State.Starting + " state");
|
||||
s_vms.put(_cluster, _name, cmd.getVmName(), State.Starting);
|
||||
}
|
||||
|
|
@ -2659,7 +2662,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
|
|||
}
|
||||
return new RebootAnswer(cmd, "reboot succeeded", null, null);
|
||||
} finally {
|
||||
synchronized (s_vms) {
|
||||
synchronized (_cluster.intern()) {
|
||||
s_logger.debug("8. The VM " + cmd.getVmName() + " is in " + State.Running + " state");
|
||||
s_vms.put(_cluster, _name, cmd.getVmName(), State.Running);
|
||||
}
|
||||
|
|
@ -3128,7 +3131,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
|
|||
}
|
||||
|
||||
if (vms.size() == 0) {
|
||||
synchronized (s_vms) {
|
||||
synchronized (_cluster.intern()) {
|
||||
s_logger.info("VM does not exist on XenServer" + _host.uuid);
|
||||
s_vms.remove(_cluster, _name, vmName);
|
||||
}
|
||||
|
|
@ -3153,7 +3156,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
|
|||
|
||||
State state = s_vms.getState(_cluster, vmName);
|
||||
|
||||
synchronized (s_vms) {
|
||||
synchronized (_cluster.intern()) {
|
||||
s_logger.debug("9. The VM " + vmName + " is in " + State.Stopping + " state");
|
||||
s_vms.put(_cluster, _name, vmName, State.Stopping);
|
||||
}
|
||||
|
|
@ -3217,7 +3220,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
|
|||
String msg = "VM destroy failed in Stop " + vmName + " Command due to " + e.getMessage();
|
||||
s_logger.warn(msg, e);
|
||||
} finally {
|
||||
synchronized (s_vms) {
|
||||
synchronized (_cluster.intern()) {
|
||||
s_logger.debug("10. The VM " + vmName + " is in " + state + " state");
|
||||
s_vms.put(_cluster, _name, vmName, state);
|
||||
}
|
||||
|
|
@ -6673,7 +6676,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
|
|||
protected HashMap<String, Pair<String, State>> deltaClusterSync(Connection conn) {
|
||||
final HashMap<String, Pair<String, State>> changes = new HashMap<String, Pair<String, State>>();
|
||||
|
||||
synchronized (s_vms) {
|
||||
synchronized (_cluster.intern()) {
|
||||
HashMap<String, Pair<String, State>> newStates = getAllVms(conn);
|
||||
if (newStates == null) {
|
||||
s_logger.warn("Unable to get the vm states so no state sync at this point.");
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -4,6 +4,8 @@
|
|||
|
||||
package com.cloud.storage.resource;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import com.cloud.agent.api.Answer;
|
||||
|
|
@ -28,6 +30,7 @@ import com.cloud.hypervisor.vmware.mo.VmwareHypervisorHostNetworkSummary;
|
|||
import com.cloud.hypervisor.vmware.util.VmwareContext;
|
||||
import com.cloud.hypervisor.vmware.util.VmwareHelper;
|
||||
import com.cloud.serializer.GsonHelper;
|
||||
import com.cloud.utils.Pair;
|
||||
import com.google.gson.Gson;
|
||||
import com.vmware.vim25.ManagedObjectReference;
|
||||
|
||||
|
|
@ -232,9 +235,19 @@ public class VmwareSecondaryStorageResourceHandler implements SecondaryStorageRe
|
|||
HostMO hostMo = new HostMO(context, morHyperHost);
|
||||
|
||||
try {
|
||||
VmwareHypervisorHostNetworkSummary netSummary = hostMo.getHyperHostNetworkSummary(
|
||||
hostMo.getHostType() == VmwareHostType.ESXi ? cmd.getContextParam("manageportgroup") : cmd.getContextParam("serviceconsole"));
|
||||
_resource.ensureOutgoingRuleForAddress(netSummary.getHostIp());
|
||||
|
||||
ManagedObjectReference mor = hostMo.getHyperHostCluster();
|
||||
ClusterMO clusterMo = new ClusterMO(hostMo.getContext(), mor);
|
||||
List<Pair<ManagedObjectReference, String>> hostsInCluster = clusterMo.getClusterHosts();
|
||||
for(Pair<ManagedObjectReference, String> hostPair : hostsInCluster) {
|
||||
HostMO hostIteratorMo = new HostMO(hostMo.getContext(), hostPair.first());
|
||||
|
||||
VmwareHypervisorHostNetworkSummary netSummary = hostIteratorMo.getHyperHostNetworkSummary(
|
||||
hostIteratorMo.getHostType() == VmwareHostType.ESXi ? cmd.getContextParam("manageportgroup") : cmd.getContextParam("serviceconsole"));
|
||||
_resource.ensureOutgoingRuleForAddress(netSummary.getHostIp());
|
||||
|
||||
s_logger.info("Setup firewall rule for host: " + netSummary.getHostIp());
|
||||
}
|
||||
} catch(Throwable e) {
|
||||
s_logger.warn("Unable to retrive host network information due to exception " + e.toString() + ", host: " + hostTokens[0] + "-" + hostTokens[1]);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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" ]) &&
|
||||
|
|
|
|||
|
|
@ -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
|
||||
;;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ import com.cloud.utils.db.SearchCriteria;
|
|||
public class AlertDaoImpl extends GenericDaoBase<AlertVO, Long> implements AlertDao {
|
||||
@Override
|
||||
public AlertVO getLastAlert(short type, long dataCenterId, Long podId) {
|
||||
Filter searchFilter = new Filter(AlertVO.class, "createdDate", Boolean.FALSE, Long.valueOf(1), Long.valueOf(1));
|
||||
Filter searchFilter = new Filter(AlertVO.class, "createdDate", Boolean.FALSE, Long.valueOf(0), Long.valueOf(1));
|
||||
SearchCriteria<AlertVO> sc = createSearchCriteria();
|
||||
|
||||
sc.addAnd("type", SearchCriteria.Op.EQ, Short.valueOf(type));
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -100,6 +100,7 @@ import com.cloud.network.dao.NetworkDomainDao;
|
|||
import com.cloud.network.element.NetworkElement;
|
||||
import com.cloud.network.guru.NetworkGuru;
|
||||
import com.cloud.network.lb.LoadBalancingRulesManager;
|
||||
import com.cloud.network.router.UpdateUserDataElement;
|
||||
import com.cloud.network.rules.FirewallManager;
|
||||
import com.cloud.network.rules.FirewallRule;
|
||||
import com.cloud.network.rules.FirewallRule.Purpose;
|
||||
|
|
@ -121,6 +122,7 @@ import com.cloud.user.User;
|
|||
import com.cloud.user.UserContext;
|
||||
import com.cloud.user.dao.AccountDao;
|
||||
import com.cloud.user.dao.UserStatisticsDao;
|
||||
import com.cloud.uservm.UserVm;
|
||||
import com.cloud.utils.NumbersUtil;
|
||||
import com.cloud.utils.Pair;
|
||||
import com.cloud.utils.component.Adapters;
|
||||
|
|
@ -147,6 +149,7 @@ import com.cloud.vm.ReservationContextImpl;
|
|||
import com.cloud.vm.UserVmVO;
|
||||
import com.cloud.vm.VMInstanceVO;
|
||||
import com.cloud.vm.VirtualMachine;
|
||||
import com.cloud.vm.VirtualMachineProfileImpl;
|
||||
import com.cloud.vm.VirtualMachine.Type;
|
||||
import com.cloud.vm.VirtualMachineProfile;
|
||||
import com.cloud.vm.dao.DomainRouterDao;
|
||||
|
|
@ -2801,6 +2804,44 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
|
|||
}
|
||||
return elements;
|
||||
}
|
||||
|
||||
private List<? extends UpdateUserDataElement> getUpdateUserDataElements() {
|
||||
List<UpdateUserDataElement> elements = new ArrayList<UpdateUserDataElement>();
|
||||
for (NetworkElement element : _networkElements) {
|
||||
if (element instanceof UpdateUserDataElement) {
|
||||
elements.add((UpdateUserDataElement) element);
|
||||
}
|
||||
}
|
||||
return elements;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean updateVmData(UserVm vm) {
|
||||
Nic defaultNic = getDefaultNic(vm.getId());
|
||||
if (defaultNic == null) {
|
||||
s_logger.error("Unable to update vm data for vm " + vm.getDisplayName() + " as the instance doesn't have default nic");
|
||||
return false;
|
||||
}
|
||||
|
||||
Network defaultNetwork = getNetwork(defaultNic.getNetworkId());
|
||||
NicProfile defaultNicProfile = new NicProfile(defaultNic, defaultNetwork, null, null, null);
|
||||
VirtualMachineProfile<VMInstanceVO> vmProfile = new VirtualMachineProfileImpl<VMInstanceVO>((VMInstanceVO)vm);
|
||||
|
||||
List<? extends UpdateUserDataElement> elements = getUpdateUserDataElements();
|
||||
|
||||
boolean result = true;
|
||||
try {
|
||||
for (UpdateUserDataElement element : elements) {
|
||||
if (!element.updateUserData(defaultNetwork, defaultNicProfile, vmProfile)) {
|
||||
result = false;
|
||||
}
|
||||
}
|
||||
} catch (ResourceUnavailableException e) {
|
||||
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean zoneIsConfiguredForExternalNetworking(long zoneId) {
|
||||
|
|
|
|||
|
|
@ -42,6 +42,7 @@ import com.cloud.network.NetworkManager;
|
|||
import com.cloud.network.Networks.TrafficType;
|
||||
import com.cloud.network.PublicIpAddress;
|
||||
import com.cloud.network.dao.NetworkDao;
|
||||
import com.cloud.network.router.UpdateUserDataElement;
|
||||
import com.cloud.network.router.VirtualNetworkApplianceManager;
|
||||
import com.cloud.network.router.VirtualRouter;
|
||||
import com.cloud.network.router.VirtualRouter.Role;
|
||||
|
|
@ -65,7 +66,7 @@ import com.cloud.vm.dao.UserVmDao;
|
|||
|
||||
|
||||
@Local(value=NetworkElement.class)
|
||||
public class DhcpElement extends AdapterBase implements NetworkElement, PasswordResetElement{
|
||||
public class DhcpElement extends AdapterBase implements NetworkElement, PasswordResetElement, UpdateUserDataElement {
|
||||
private static final Logger s_logger = Logger.getLogger(DhcpElement.class);
|
||||
|
||||
private static final Map<Service, Map<Capability, String>> capabilities = setCapabilities();
|
||||
|
|
@ -258,4 +259,20 @@ public class DhcpElement extends AdapterBase implements NetworkElement, Password
|
|||
public boolean applyStaticNats(Network config, List<? extends StaticNat> rules) throws ResourceUnavailableException {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean updateUserData(Network network, NicProfile nic,
|
||||
VirtualMachineProfile<? extends VirtualMachine> vm)
|
||||
throws ResourceUnavailableException {
|
||||
List<DomainRouterVO> routers = _routerDao.listByNetworkAndRole(network.getId(), Role.DHCP_USERDATA);
|
||||
if (routers == null || routers.isEmpty()) {
|
||||
s_logger.trace("Can't find dhcp element in network " + network.getId());
|
||||
return true;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
VirtualMachineProfile<UserVm> uservm = (VirtualMachineProfile<UserVm>)vm;
|
||||
|
||||
return _routerMgr.updateVmData(network, nic, uservm, routers);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -45,6 +45,7 @@ import com.cloud.network.VpnUser;
|
|||
import com.cloud.network.dao.LoadBalancerDao;
|
||||
import com.cloud.network.dao.NetworkDao;
|
||||
import com.cloud.network.lb.LoadBalancingRulesManager;
|
||||
import com.cloud.network.router.UpdateUserDataElement;
|
||||
import com.cloud.network.router.VirtualNetworkApplianceManager;
|
||||
import com.cloud.network.router.VirtualRouter;
|
||||
import com.cloud.network.router.VirtualRouter.Role;
|
||||
|
|
@ -372,4 +373,20 @@ public class VirtualRouterElement extends DhcpElement implements NetworkElement,
|
|||
|
||||
return _routerMgr.savePasswordToRouter(network, nic, uservm, routers);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean updateUserData(Network network, NicProfile nic,
|
||||
VirtualMachineProfile<? extends VirtualMachine> vm)
|
||||
throws ResourceUnavailableException {
|
||||
List<DomainRouterVO> routers = _routerDao.listByNetworkAndRole(network.getId(), Role.DHCP_FIREWALL_LB_PASSWD_USERDATA);
|
||||
if (routers == null || routers.isEmpty()) {
|
||||
s_logger.trace("Can't find virtual router element in network " + network.getId());
|
||||
return true;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
VirtualMachineProfile<UserVm> uservm = (VirtualMachineProfile<UserVm>)vm;
|
||||
|
||||
return _routerMgr.updateVmData(network, nic, uservm, routers);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@ import com.cloud.utils.component.Manager;
|
|||
import com.cloud.vm.DomainRouterVO;
|
||||
import com.cloud.vm.NicProfile;
|
||||
import com.cloud.vm.ReservationContext;
|
||||
import com.cloud.vm.VirtualMachine;
|
||||
import com.cloud.vm.VirtualMachineProfile;
|
||||
|
||||
/**
|
||||
|
|
@ -92,4 +93,9 @@ public interface VirtualNetworkApplianceManager extends Manager, VirtualNetworkA
|
|||
|
||||
boolean applyStaticNats(Network network, List<? extends StaticNat> rules, List<? extends VirtualRouter> routers) throws ResourceUnavailableException;
|
||||
|
||||
boolean updateVmData(Network network, NicProfile nic,
|
||||
VirtualMachineProfile<UserVm> profile,
|
||||
List<? extends VirtualRouter> routers)
|
||||
throws ResourceUnavailableException;
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2324,27 +2324,32 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian
|
|||
cmds.addCommand("users", addUsersCmd);
|
||||
cmds.addCommand("startVpn", startVpnCmd);
|
||||
}
|
||||
|
||||
private void createvmDataCommand(DomainRouterVO router, UserVmVO userVM, DataCenterVO dc, Commands cmds) {
|
||||
boolean createVmData = true;
|
||||
long networkId = router.getNetworkId();
|
||||
if (dc.getNetworkType() == NetworkType.Basic && router.getPodIdToDeployIn().longValue() != userVM.getPodIdToDeployIn().longValue()) {
|
||||
createVmData = false;
|
||||
}
|
||||
|
||||
if (createVmData) {
|
||||
NicVO nic = _nicDao.findByInstanceIdAndNetworkId(networkId, userVM.getId());
|
||||
if (nic != null) {
|
||||
s_logger.debug("Creating user data entry for vm " + userVM + " on domR " + router);
|
||||
String serviceOffering = _serviceOfferingDao.findByIdIncludingRemoved(userVM.getServiceOfferingId()).getDisplayText();
|
||||
String zoneName = _dcDao.findById(router.getDataCenterIdToDeployIn()).getName();
|
||||
cmds.addCommand("vmdata",
|
||||
generateVmDataCommand(router, nic.getIp4Address(), userVM.getUserData(), serviceOffering, zoneName, nic.getIp4Address(), userVM.getHostName(), userVM.getInstanceName(), userVM.getId(), null));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void createVmDataCommands(DomainRouterVO router, Commands cmds) {
|
||||
long networkId = router.getNetworkId();
|
||||
List<UserVmVO> vms = _userVmDao.listByNetworkIdAndStates(networkId, State.Running, State.Migrating, State.Stopping);
|
||||
DataCenterVO dc = _dcDao.findById(router.getDataCenterIdToDeployIn());
|
||||
for (UserVmVO vm : vms) {
|
||||
boolean createVmData = true;
|
||||
if (dc.getNetworkType() == NetworkType.Basic && router.getPodIdToDeployIn().longValue() != vm.getPodIdToDeployIn().longValue()) {
|
||||
createVmData = false;
|
||||
}
|
||||
|
||||
if (createVmData) {
|
||||
NicVO nic = _nicDao.findByInstanceIdAndNetworkId(networkId, vm.getId());
|
||||
if (nic != null) {
|
||||
s_logger.debug("Creating user data entry for vm " + vm + " on domR " + router);
|
||||
String serviceOffering = _serviceOfferingDao.findByIdIncludingRemoved(vm.getServiceOfferingId()).getDisplayText();
|
||||
String zoneName = _dcDao.findById(router.getDataCenterIdToDeployIn()).getName();
|
||||
cmds.addCommand("vmdata",
|
||||
generateVmDataCommand(router, nic.getIp4Address(), vm.getUserData(), serviceOffering, zoneName, nic.getIp4Address(), vm.getHostName(), vm.getInstanceName(), vm.getId(), null));
|
||||
}
|
||||
}
|
||||
createvmDataCommand(router, vm, dc, cmds);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2509,6 +2514,24 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian
|
|||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean updateVmData(Network network, NicProfile nic, VirtualMachineProfile<UserVm> profile, List<? extends VirtualRouter> routers) throws ResourceUnavailableException {
|
||||
if (routers == null || routers.isEmpty()) {
|
||||
s_logger.warn("Unable save password, router doesn't exist in network " + network.getId());
|
||||
throw new CloudRuntimeException("Unable to save password to router");
|
||||
}
|
||||
|
||||
boolean result = true;
|
||||
UserVm userVm = profile.getVirtualMachine();
|
||||
DataCenterVO dc = _dcDao.findById(userVm.getDataCenterIdToDeployIn());
|
||||
for (VirtualRouter router : routers) {
|
||||
Commands cmds = new Commands(OnError.Continue);
|
||||
createvmDataCommand((DomainRouterVO)router, (UserVmVO)userVm, dc, cmds);
|
||||
result = result && sendCommandsToRouter(router, cmds);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean applyFirewallRules(Network network, List<? extends FirewallRule> rules, List<? extends VirtualRouter> routers) throws ResourceUnavailableException {
|
||||
|
|
|
|||
|
|
@ -43,6 +43,7 @@ import com.cloud.api.commands.PrepareForMaintenanceCmd;
|
|||
import com.cloud.api.commands.ReconnectHostCmd;
|
||||
import com.cloud.api.commands.UpdateHostCmd;
|
||||
import com.cloud.api.commands.UpdateHostPasswordCmd;
|
||||
import com.cloud.capacity.dao.CapacityDao;
|
||||
import com.cloud.cluster.ManagementServerNode;
|
||||
import com.cloud.dc.ClusterDetailsDao;
|
||||
import com.cloud.dc.ClusterVO;
|
||||
|
|
@ -119,13 +120,15 @@ public class ResourceManagerImpl implements ResourceManager, ResourceService, Ma
|
|||
protected GuestOSCategoryDao _guestOSCategoryDao;
|
||||
@Inject
|
||||
protected StoragePoolDao _storagePoolDao;
|
||||
@Inject
|
||||
CapacityDao _capacityDao;
|
||||
|
||||
@Inject(adapter = Discoverer.class)
|
||||
protected Adapters<? extends Discoverer> _discoverers;
|
||||
|
||||
protected long _nodeId = ManagementServerNode.getManagementServerId();
|
||||
|
||||
protected HashMap<Integer, List<ResourceListener>> _lifeCycleListeners = new HashMap<Integer, List<ResourceListener>>();
|
||||
protected HashMap<Integer, List<ResourceListener>> _lifeCycleListeners = new HashMap<Integer, List<ResourceListener>>();
|
||||
|
||||
private void insertListener(Integer event, ResourceListener listener) {
|
||||
List<ResourceListener> lst = _lifeCycleListeners.get(event);
|
||||
|
|
@ -667,7 +670,9 @@ public class ResourceManagerImpl implements ResourceManager, ResourceService, Ma
|
|||
return false;
|
||||
}
|
||||
|
||||
_clusterDao.remove(cmd.getId());
|
||||
if (_clusterDao.remove(cmd.getId())){
|
||||
_capacityDao.removeBy(null, null, null, cmd.getId());
|
||||
}
|
||||
|
||||
txn.commit();
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -4757,22 +4757,30 @@ public class ManagementServerImpl implements ManagementServer {
|
|||
@Override
|
||||
@DB
|
||||
public boolean updateHostPassword(UpdateHostPasswordCmd cmd) {
|
||||
if (cmd.getClusterId() == null && cmd.getHostId() == null) {
|
||||
if ( !((cmd.getClusterId() == null) ^ (cmd.getHostId() == null)) ) {//Using Xor operator here.
|
||||
throw new InvalidParameterValueException("You should provide one of cluster id or a host id.");
|
||||
} else if (cmd.getClusterId() == null) {
|
||||
HostVO h = _hostDao.findById(cmd.getHostId());
|
||||
if (h.getHypervisorType() == HypervisorType.XenServer) {
|
||||
throw new InvalidParameterValueException("You should provide cluster id for Xenserver cluster.");
|
||||
HostVO host = _hostDao.findById(cmd.getHostId());
|
||||
if (host == null){
|
||||
throw new InvalidParameterValueException("The hostId " +cmd.getHostId()+ " doesnt exist");
|
||||
}if (host.getHypervisorType() != HypervisorType.KVM) {
|
||||
throw new InvalidParameterValueException("This operation is not permitted for " + host.getHypervisorType() + " with the parameter hostId");
|
||||
}
|
||||
DetailVO nv = _detailsDao.findDetail(h.getId(), ApiConstants.USERNAME);
|
||||
DetailVO nv = _detailsDao.findDetail(host.getId(), ApiConstants.USERNAME);
|
||||
if (nv.getValue().equals(cmd.getUsername())) {
|
||||
DetailVO nvp = new DetailVO(h.getId(), ApiConstants.PASSWORD, cmd.getPassword());
|
||||
DetailVO nvp = new DetailVO(host.getId(), ApiConstants.PASSWORD, cmd.getPassword());
|
||||
nvp.setValue(cmd.getPassword());
|
||||
_detailsDao.persist(nvp);
|
||||
} else {
|
||||
throw new InvalidParameterValueException("The username is not under use by management server.");
|
||||
}
|
||||
} else {
|
||||
ClusterVO cluster = _clusterDao.findById(cmd.getClusterId());
|
||||
if (cluster == null){
|
||||
throw new InvalidParameterValueException("The clusterId " +cmd.getClusterId()+ " doesnt exist");
|
||||
}if (cluster.getHypervisorType() != HypervisorType.XenServer){
|
||||
throw new InvalidParameterValueException("This operation is not permitted for " + cluster.getHypervisorType() + " with the parameter clusterId");
|
||||
}
|
||||
// get all the hosts in this cluster
|
||||
List<HostVO> hosts = _hostDao.listByCluster(cmd.getClusterId());
|
||||
Transaction txn = Transaction.currentTxn();
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,6 +20,8 @@ package com.cloud.storage;
|
|||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.net.UnknownHostException;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
|
|
@ -46,6 +48,7 @@ import org.apache.log4j.Logger;
|
|||
import com.cloud.agent.AgentManager;
|
||||
import com.cloud.agent.api.Answer;
|
||||
import com.cloud.agent.api.BackupSnapshotCommand;
|
||||
import com.cloud.agent.api.CleanupSnapshotBackupCommand;
|
||||
import com.cloud.agent.api.Command;
|
||||
import com.cloud.agent.api.CreateStoragePoolCommand;
|
||||
import com.cloud.agent.api.CreateVolumeFromSnapshotAnswer;
|
||||
|
|
@ -1049,7 +1052,9 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
|
|||
@Override
|
||||
public boolean start() {
|
||||
if (_storageCleanupEnabled) {
|
||||
_executor.scheduleWithFixedDelay(new StorageGarbageCollector(), _storageCleanupInterval, _storageCleanupInterval, TimeUnit.SECONDS);
|
||||
Random generator = new Random();
|
||||
int initialDelay = generator.nextInt(_storageCleanupInterval);
|
||||
_executor.scheduleWithFixedDelay(new StorageGarbageCollector(), initialDelay, _storageCleanupInterval, TimeUnit.SECONDS);
|
||||
} else {
|
||||
s_logger.debug("Storage cleanup is not enabled, so the storage cleanup thread is not being scheduled.");
|
||||
}
|
||||
|
|
@ -1718,11 +1723,13 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
// bug #11428. Operation not supported if vmware and snapshots parent volume = ROOT
|
||||
if(snapshotCheck.getHypervisorType() == HypervisorType.VMware
|
||||
&& _volumeDao.findByIdIncludingRemoved(snapshotCheck.getVolumeId()).getVolumeType() == Type.ROOT){
|
||||
throw new UnsupportedServiceException("operation not supported, snapshot with id " + snapshotId + " is created from ROOT volume");
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
// Verify that zone exists
|
||||
|
|
@ -1867,17 +1874,17 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
|
|||
|
||||
capacities = _capacityDao.search(capacitySC, null);
|
||||
|
||||
long provFactor = 1;
|
||||
float provFactor = 1;
|
||||
if (storagePool.getPoolType() == StoragePoolType.NetworkFilesystem) {
|
||||
provFactor = (long) _overProvisioningFactor;
|
||||
provFactor = _overProvisioningFactor;
|
||||
}
|
||||
if (capacities.size() == 0) {
|
||||
CapacityVO capacity = new CapacityVO(storagePool.getId(), storagePool.getDataCenterId(), storagePool.getPodId(), storagePool.getClusterId(), allocated, storagePool.getCapacityBytes()
|
||||
* provFactor, CapacityVO.CAPACITY_TYPE_STORAGE_ALLOCATED);
|
||||
CapacityVO capacity = new CapacityVO(storagePool.getId(), storagePool.getDataCenterId(), storagePool.getPodId(), storagePool.getClusterId(), allocated, (long)(storagePool.getCapacityBytes()
|
||||
* provFactor), CapacityVO.CAPACITY_TYPE_STORAGE_ALLOCATED);
|
||||
_capacityDao.persist(capacity);
|
||||
} else {
|
||||
CapacityVO capacity = capacities.get(0);
|
||||
long currCapacity = provFactor * storagePool.getCapacityBytes();
|
||||
long currCapacity = (long)(provFactor * storagePool.getCapacityBytes());
|
||||
boolean update = false;
|
||||
if (capacity.getTotalCapacity() != currCapacity) {
|
||||
capacity.setTotalCapacity(currCapacity);
|
||||
|
|
@ -1980,46 +1987,8 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Cleanup secondary storage hosts
|
||||
List<HostVO> secondaryStorageHosts = _hostDao.listSecondaryStorageHosts();
|
||||
for (HostVO secondaryStorageHost : secondaryStorageHosts) {
|
||||
try {
|
||||
long hostId = secondaryStorageHost.getId();
|
||||
List<VMTemplateHostVO> destroyedTemplateHostVOs = _vmTemplateHostDao.listDestroyed(hostId);
|
||||
s_logger.debug("Secondary storage garbage collector found " + destroyedTemplateHostVOs.size() + " templates to cleanup on secondary storage host: "
|
||||
+ secondaryStorageHost.getName());
|
||||
for (VMTemplateHostVO destroyedTemplateHostVO : destroyedTemplateHostVOs) {
|
||||
if (!_tmpltMgr.templateIsDeleteable(destroyedTemplateHostVO)) {
|
||||
if (s_logger.isDebugEnabled()) {
|
||||
s_logger.debug("Not deleting template at: " + destroyedTemplateHostVO);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (s_logger.isDebugEnabled()) {
|
||||
s_logger.debug("Deleting template host: " + destroyedTemplateHostVO);
|
||||
}
|
||||
|
||||
String installPath = destroyedTemplateHostVO.getInstallPath();
|
||||
|
||||
if (installPath != null) {
|
||||
Answer answer = _agentMgr.sendToSecStorage(secondaryStorageHost, new DeleteTemplateCommand(secondaryStorageHost.getStorageUrl(),destroyedTemplateHostVO.getInstallPath()));
|
||||
|
||||
if (answer == null || !answer.getResult()) {
|
||||
s_logger.debug("Failed to delete " + destroyedTemplateHostVO + " due to " + ((answer == null) ? "answer is null" : answer.getDetails()));
|
||||
} else {
|
||||
_vmTemplateHostDao.remove(destroyedTemplateHostVO.getId());
|
||||
s_logger.debug("Deleted template at: " + destroyedTemplateHostVO.getInstallPath());
|
||||
}
|
||||
} else {
|
||||
_vmTemplateHostDao.remove(destroyedTemplateHostVO.getId());
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
s_logger.warn("problem cleaning up secondary storage " + secondaryStorageHost, e);
|
||||
}
|
||||
}
|
||||
|
||||
cleanupSecondaryStorage(recurring);
|
||||
|
||||
List<VolumeVO> vols = _volsDao.listVolumesToBeDestroyed();
|
||||
for (VolumeVO vol : vols) {
|
||||
|
|
@ -2037,6 +2006,142 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
|
|||
scanLock.releaseRef();
|
||||
}
|
||||
}
|
||||
|
||||
@DB
|
||||
List<Long> findAllVolumeIdInSnapshotTable(Long hostId) {
|
||||
String sql = "SELECT volume_id from snapshots WHERE sechost_id=? GROUP BY volume_id";
|
||||
List<Long> list = new ArrayList<Long>();
|
||||
try {
|
||||
Transaction txn = Transaction.currentTxn();
|
||||
ResultSet rs = null;
|
||||
PreparedStatement pstmt = null;
|
||||
pstmt = txn.prepareAutoCloseStatement(sql);
|
||||
pstmt.setLong(1, hostId);
|
||||
rs = pstmt.executeQuery();
|
||||
while (rs.next()) {
|
||||
list.add(rs.getLong(1));
|
||||
}
|
||||
return list;
|
||||
} catch (Exception e) {
|
||||
s_logger.debug("failed to get all volumes who has snapshots in secondary storage " + hostId + " due to " + e.getMessage());
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
List<String> findAllSnapshotForVolume(Long volumeId) {
|
||||
String sql = "SELECT backup_snap_id FROM snapshots WHERE volume_id=? and backup_snap_id is not NULL";
|
||||
try {
|
||||
Transaction txn = Transaction.currentTxn();
|
||||
ResultSet rs = null;
|
||||
PreparedStatement pstmt = null;
|
||||
pstmt = txn.prepareAutoCloseStatement(sql);
|
||||
pstmt.setLong(1, volumeId);
|
||||
rs = pstmt.executeQuery();
|
||||
List<String> list = new ArrayList<String>();
|
||||
while (rs.next()) {
|
||||
list.add(rs.getString(1));
|
||||
}
|
||||
return list;
|
||||
} catch (Exception e) {
|
||||
s_logger.debug("failed to get all snapshots for a volume " + volumeId + " due to " + e.getMessage());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@DB
|
||||
public void cleanupSecondaryStorage(boolean recurring) {
|
||||
try {
|
||||
// Cleanup templates in secondary storage hosts
|
||||
List<HostVO> secondaryStorageHosts = _hostDao.listSecondaryStorageHosts();
|
||||
for (HostVO secondaryStorageHost : secondaryStorageHosts) {
|
||||
try {
|
||||
long hostId = secondaryStorageHost.getId();
|
||||
List<VMTemplateHostVO> destroyedTemplateHostVOs = _vmTemplateHostDao.listDestroyed(hostId);
|
||||
s_logger.debug("Secondary storage garbage collector found " + destroyedTemplateHostVOs.size() + " templates to cleanup on secondary storage host: "
|
||||
+ secondaryStorageHost.getName());
|
||||
for (VMTemplateHostVO destroyedTemplateHostVO : destroyedTemplateHostVOs) {
|
||||
if (!_tmpltMgr.templateIsDeleteable(destroyedTemplateHostVO)) {
|
||||
if (s_logger.isDebugEnabled()) {
|
||||
s_logger.debug("Not deleting template at: " + destroyedTemplateHostVO);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (s_logger.isDebugEnabled()) {
|
||||
s_logger.debug("Deleting template host: " + destroyedTemplateHostVO);
|
||||
}
|
||||
|
||||
String installPath = destroyedTemplateHostVO.getInstallPath();
|
||||
|
||||
if (installPath != null) {
|
||||
Answer answer = _agentMgr.sendToSecStorage(secondaryStorageHost, new DeleteTemplateCommand(secondaryStorageHost.getStorageUrl(), destroyedTemplateHostVO.getInstallPath()));
|
||||
|
||||
if (answer == null || !answer.getResult()) {
|
||||
s_logger.debug("Failed to delete " + destroyedTemplateHostVO + " due to " + ((answer == null) ? "answer is null" : answer.getDetails()));
|
||||
} else {
|
||||
_vmTemplateHostDao.remove(destroyedTemplateHostVO.getId());
|
||||
s_logger.debug("Deleted template at: " + destroyedTemplateHostVO.getInstallPath());
|
||||
}
|
||||
} else {
|
||||
_vmTemplateHostDao.remove(destroyedTemplateHostVO.getId());
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
s_logger.warn("problem cleaning up templates in secondary storage " + secondaryStorageHost, e);
|
||||
}
|
||||
}
|
||||
|
||||
// Cleanup snapshot in secondary storage hosts
|
||||
for (HostVO secondaryStorageHost : secondaryStorageHosts) {
|
||||
try {
|
||||
long hostId = secondaryStorageHost.getId();
|
||||
List<Long> vIDs = findAllVolumeIdInSnapshotTable(hostId);
|
||||
if (vIDs == null) {
|
||||
continue;
|
||||
}
|
||||
for (Long volumeId : vIDs) {
|
||||
boolean lock = false;
|
||||
try {
|
||||
VolumeVO volume = _volsDao.findByIdIncludingRemoved(volumeId);
|
||||
if (volume.getRemoved() == null) {
|
||||
volume = _volsDao.acquireInLockTable(volumeId, 10);
|
||||
if (volume == null) {
|
||||
continue;
|
||||
}
|
||||
lock = true;
|
||||
}
|
||||
List<String> snapshots = findAllSnapshotForVolume(volumeId);
|
||||
if (snapshots == null) {
|
||||
continue;
|
||||
}
|
||||
CleanupSnapshotBackupCommand cmd = new CleanupSnapshotBackupCommand(secondaryStorageHost.getStorageUrl(), secondaryStorageHost.getDataCenterId(), volume.getAccountId(),
|
||||
volumeId, snapshots);
|
||||
|
||||
Answer answer = _agentMgr.sendToSecStorage(secondaryStorageHost, cmd);
|
||||
if ((answer == null) || !answer.getResult()) {
|
||||
String details = "Failed to cleanup snapshots for volume " + volumeId + " due to " + (answer == null ? "null" : answer.getDetails());
|
||||
s_logger.warn(details);
|
||||
}
|
||||
} catch (Exception e1) {
|
||||
s_logger.warn("problem cleaning up snapshots in secondary storage " + secondaryStorageHost, e1);
|
||||
} finally {
|
||||
if (lock) {
|
||||
_volsDao.releaseFromLockTable(volumeId);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception e2) {
|
||||
s_logger.warn("problem cleaning up snapshots in secondary storage " + secondaryStorageHost, e2);
|
||||
}
|
||||
}
|
||||
|
||||
} catch (Exception e3) {
|
||||
s_logger.warn("problem cleaning up secondary storage ", e3);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPrimaryStorageNameLabel(VolumeVO volume) {
|
||||
|
|
@ -2925,6 +3030,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onManagementNodeJoined(List<ManagementServerHostVO> nodeList, long selfNodeId) {
|
||||
|
|
|
|||
|
|
@ -349,16 +349,7 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma
|
|||
// does the caller have the authority to act on this volume
|
||||
_accountMgr.checkAccess(UserContext.current().getCaller(), null, v);
|
||||
try {
|
||||
if (v != null && _volsDao.getHypervisorType(v.getId()).equals(HypervisorType.KVM)) {
|
||||
/* KVM needs to lock on the vm of volume, because it takes snapshot on behalf of vm, not volume */
|
||||
UserVmVO uservm = _vmDao.findById(v.getInstanceId());
|
||||
if (uservm != null) {
|
||||
UserVmVO vm = _vmDao.acquireInLockTable(uservm.getId(), 10);
|
||||
if (vm == null) {
|
||||
throw new CloudRuntimeException("Creating snapshot failed due to volume:" + volumeId + " is being used, try it later ");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Long poolId = v.getPoolId();
|
||||
if (poolId == null) {
|
||||
throw new CloudRuntimeException("You cannot take a snapshot of a volume until it has been attached to an instance");
|
||||
|
|
@ -387,7 +378,7 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma
|
|||
+ userVm.getState().toString() + " state");
|
||||
}
|
||||
|
||||
if(userVm.getHypervisorType() == HypervisorType.VMware) {
|
||||
if(userVm.getHypervisorType() == HypervisorType.VMware || userVm.getHypervisorType() == HypervisorType.KVM) {
|
||||
List<SnapshotVO> activeSnapshots = _snapshotDao.listByInstanceId(v.getInstanceId(), Snapshot.Status.Creating, Snapshot.Status.CreatedOnPrimary, Snapshot.Status.BackingUp);
|
||||
if(activeSnapshots.size() > 1)
|
||||
throw new CloudRuntimeException("There is other active snapshot tasks on the instance to which the volume is attached, please try again later");
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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');
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ import java.io.FileOutputStream;
|
|||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.OutputStream;
|
||||
import java.net.ConnectException;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.URL;
|
||||
import java.net.URLEncoder;
|
||||
|
|
@ -47,12 +48,16 @@ import com.vmware.vim25.VimPortType;
|
|||
|
||||
public class VmwareContext {
|
||||
private static final Logger s_logger = Logger.getLogger(VmwareContext.class);
|
||||
|
||||
|
||||
private static int MAX_CONNECT_RETRY = 5;
|
||||
private static int CONNECT_RETRY_INTERVAL = 1000;
|
||||
|
||||
private ExtendedAppUtil _appUtil;
|
||||
private String _serverAddress;
|
||||
|
||||
private Map<String, Object> _stockMap = new HashMap<String, Object>();
|
||||
private int _CHUNKSIZE = 1*1024*1024; // 1M
|
||||
private int _CHUNKSIZE = 1*1024*1024; // 1M
|
||||
|
||||
|
||||
static {
|
||||
try {
|
||||
|
|
@ -328,7 +333,7 @@ public class VmwareContext {
|
|||
conn.setRequestProperty("Connection", "Keep-Alive");
|
||||
conn.setRequestProperty("Content-Type", "application/x-vnd.vmware-streamVmdk");
|
||||
conn.setRequestProperty("Content-Length", Long.toString(new File(localFileName).length()));
|
||||
conn.connect();
|
||||
connectWithRetry(conn);
|
||||
|
||||
BufferedOutputStream bos = null;
|
||||
BufferedInputStream is = null;
|
||||
|
|
@ -367,8 +372,8 @@ public class VmwareContext {
|
|||
conn.setRequestProperty(org.apache.axis.transport.http.HTTPConstants.HEADER_COOKIE, cookieString);
|
||||
conn.setDoInput(true);
|
||||
conn.setDoOutput(true);
|
||||
conn.setAllowUserInteraction(true);
|
||||
conn.connect();
|
||||
conn.setAllowUserInteraction(true);
|
||||
connectWithRetry(conn);
|
||||
|
||||
long bytesWritten = 0;
|
||||
InputStream in = null;
|
||||
|
|
@ -387,8 +392,6 @@ public class VmwareContext {
|
|||
if(progressUpdater != null)
|
||||
progressUpdater.action(new Long(totalBytesDownloaded));
|
||||
}
|
||||
} catch(Throwable e) {
|
||||
s_logger.error("Unexpected exception ", e);
|
||||
} finally {
|
||||
if(in != null)
|
||||
in.close();
|
||||
|
|
@ -533,7 +536,7 @@ public class VmwareContext {
|
|||
conn.setAllowUserInteraction(true);
|
||||
conn.setRequestProperty(org.apache.axis.transport.http.HTTPConstants.HEADER_COOKIE, cookieString);
|
||||
conn.setRequestMethod(httpMethod);
|
||||
conn.connect();
|
||||
connectWithRetry(conn);
|
||||
return conn;
|
||||
}
|
||||
|
||||
|
|
@ -556,6 +559,27 @@ public class VmwareContext {
|
|||
org.apache.axis.MessageContext msgContext = callObj.getMessageContext();
|
||||
String cookieString = (String)msgContext.getProperty(org.apache.axis.transport.http.HTTPConstants.HEADER_COOKIE);
|
||||
return cookieString;
|
||||
}
|
||||
|
||||
private static void connectWithRetry(HttpURLConnection conn) throws Exception {
|
||||
boolean connected = false;
|
||||
for(int i = 0; i < MAX_CONNECT_RETRY && !connected; i++) {
|
||||
try {
|
||||
conn.connect();
|
||||
connected = true;
|
||||
s_logger.info("Connected, conn: " + conn.toString() + ", retry: " + i);
|
||||
} catch (Exception e) {
|
||||
s_logger.warn("Unable to connect, conn: " + conn.toString() + ", message: " + e.toString() + ", retry: " + i);
|
||||
|
||||
try {
|
||||
Thread.sleep(CONNECT_RETRY_INTERVAL);
|
||||
} catch(InterruptedException ex) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(!connected)
|
||||
throw new Exception("Unable to connect to " + conn.toString());
|
||||
}
|
||||
|
||||
public void close() {
|
||||
|
|
|
|||
Loading…
Reference in New Issue