nicList = resp.getNics();
+ for (CloudStackNic nic : nicList) {
+ if (nic.getIsDefault()) {
+ vm.setPrivateIpAddress(nic.getIpaddress());
+ break;
+ }
}
+ vm.setIpAddress(resp.getIpAddress());
+ vm.setAccountName(resp.getAccountName());
+ vm.setDomainId(resp.getDomainId());
+ vm.setHypervisor(resp.getHypervisor());
+ vm.setServiceOffering( svcOffering.getName());
+ vm.setKeyPairName(resp.getKeyPairName());
+ instances.addInstance(vm);
+ countCreated++;
+ }catch(Exception e){
+ logger.error("Failed to deploy VM number: "+ (i+1) +" due to error: "+e.getMessage());
+ break;
}
- vm.setIpAddress(resp.getIpAddress());
- vm.setAccountName(resp.getAccountName());
- vm.setDomainId(resp.getDomainId());
- vm.setHypervisor(resp.getHypervisor());
- vm.setServiceOffering( svcOffering.getName());
- vm.setKeyPairName(resp.getKeyPairName());
- instances.addInstance(vm);
- countCreated++;
}
if (0 == countCreated) {
// TODO, we actually need to destroy left-over VMs when the exception is thrown
- throw new EC2ServiceException(ServerError.InsufficientInstanceCapacity, "Insufficient Instance Capacity" );
+ throw new EC2ServiceException(ServerError.InternalError, "Failed to deploy instances" );
}
+ logger.debug("Could deploy "+ countCreated + " VM's successfully");
return instances;
} catch( Exception e ) {
diff --git a/awsapi/src/com/cloud/bridge/service/core/ec2/EC2InstanceFilterSet.java b/awsapi/src/com/cloud/bridge/service/core/ec2/EC2InstanceFilterSet.java
index e0aae7364d9..b5b7c7840df 100644
--- a/awsapi/src/com/cloud/bridge/service/core/ec2/EC2InstanceFilterSet.java
+++ b/awsapi/src/com/cloud/bridge/service/core/ec2/EC2InstanceFilterSet.java
@@ -50,6 +50,7 @@ public class EC2InstanceFilterSet {
filterTypes.put( "group-id", "string" );
filterTypes.put( "tag-key", "string" );
filterTypes.put( "tag-value", "string" );
+ filterTypes.put( "dns-name", "string" );
}
@@ -184,6 +185,8 @@ public class EC2InstanceFilterSet {
}
}
return false;
+ }else if (filterName.equalsIgnoreCase( "dns-name" )){
+ return containsString( vm.getName(), valueSet );
}
else return false;
}
diff --git a/client/WEB-INF/classes/resources/messages.properties b/client/WEB-INF/classes/resources/messages.properties
index a0ed7c9a277..d167a5c0a4f 100644
--- a/client/WEB-INF/classes/resources/messages.properties
+++ b/client/WEB-INF/classes/resources/messages.properties
@@ -17,6 +17,13 @@
#new labels (begin) **********************************************************************************************
+label.menu.regions=Regions
+label.region=Region
+label.add.region=Add Region
+label.remove.region=Remove Region
+message.remove.region=Are you sure you want to remove this region from this management server?
+message.add.region=Please specify the required information to add a new region.
+label.endpoint=Endpoint
label.plugins=Plugins
label.plugin.details=Plugin details
label.author.name=Author name
diff --git a/client/WEB-INF/classes/resources/messages_fr_FR.properties b/client/WEB-INF/classes/resources/messages_fr_FR.properties
index e29d61b51ea..267baec0270 100644
--- a/client/WEB-INF/classes/resources/messages_fr_FR.properties
+++ b/client/WEB-INF/classes/resources/messages_fr_FR.properties
@@ -15,1505 +15,1453 @@
# specific language governing permissions and limitations
# under the License.
-
-#new labels (begin) **********************************************************************************************
-# label.isolation.uri=Isolation URI
-# label.broadcast.uri=Broadcast URI
-#new labels (end) ************************************************************************************************
-
-
-#modified labels (begin) *****************************************************************************************
-# message.zoneWizard.enable.local.storage=WARNING\: If you enable local storage for this zone, you must do the following, depending on where you would like your system VMs to launch\:
1. If system VMs need to be launched in primary storage, primary storage needs to be added to the zone after creation. You must also start the zone in a disabled state.
2. If system VMs need to be launched in local storage, system.vm.use.local.storage needs to be set to true before you enable the zone.
Would you like to continue?
-#modified labels (end) *******************************************************************************************
-
-# label.configure.network.ACLs=Configure Network ACLs
-# label.network.ACLs=Network ACLs
-# label.add.network.ACL=Add network ACL
-# label.private.Gateway=Private Gateway
-# label.VPC.router.details=VPC router details
-# label.VMs.in.tier=VMs in tier
-# label.local.storage.enabled=Local storage enabled
-# label.tier.details=Tier details
-# label.edit.tags=Edit tags
-label.action.enable.physical.network=Activer le réseau physique
-label.action.disable.physical.network=Désactiver le réseau physique
-message.action.enable.physical.network=Confirmer l\'activation de ce réseau physique.
-message.action.disable.physical.network=Confirmer la désactivation de ce réseau physique.
-
-# label.select.tier=Select Tier
-# label.add.ACL=Add ACL
-# label.remove.ACL=Remove ACL
-# label.tier=Tier
-# label.network.ACL=Network ACL
-# label.network.ACL.total=Network ACL Total
-# label.add.new.gateway=Add new gateway
-# message.add.new.gateway.to.vpc=Please specify the information to add a new gateway to this VPC.
-# label.delete.gateway=delete gateway
-# message.delete.gateway=Please confirm you want to delete the gateway
-# label.CIDR.of.destination.network=CIDR of destination network
-# label.add.route=Add route
-# label.add.static.route=Add static route
-# label.remove.static.route=Remove static route
-# label.site.to.site.VPN=site-to-site VPN
-# label.add.VPN.gateway=Add VPN Gateway
-# message.add.VPN.gateway=Please confirm that you want to add a VPN Gateway
-# label.VPN.gateway=VPN Gateway
-# label.delete.VPN.gateway=delete VPN Gateway
-# message.delete.VPN.gateway=Please confirm that you want to delete this VPN Gateway
-# label.VPN.connection=VPN Connection
-# label.IPsec.preshared.key=IPsec Preshared-Key
-# label.IKE.policy=IKE policy
-# label.ESP.policy=ESP policy
-# label.create.VPN.connection=Create VPN Connection
-# label.VPN.customer.gateway=VPN Customer Gateway
-# label.CIDR.list=CIDR list
-# label.IKE.lifetime=IKE Lifetime (second)
-# label.ESP.lifetime=ESP Lifetime(second)
-# label.dead.peer.detection=Dead Peer Detection
-# label.reset.VPN.connection=Reset VPN connection
-# message.reset.VPN.connection=Please confirm that you want to reset VPN connection
-# label.delete.VPN.connection=delete VPN connection
-# message.delete.VPN.connection=Please confirm that you want to delete VPN connection
-# label.add.new.tier=Add new tier
-# label.add.VM.to.tier=Add VM to tier
-# label.remove.tier=Remove tier
-
-# label.local.storage.enabled=Local storage enabled
-# label.associated.network=Associated Network
-# label.add.port.forwarding.rule=Add port forwarding rule
-# label.dns=DNS
-
-# label.vpc=VPC
-# label.vpc.id=VPC ID
-# label.tier=Tier
-# label.add.vpc=Add VPC
-# label.super.cidr.for.guest.networks=Super CIDR for Guest Networks
-# label.DNS.domain.for.guest.networks=DNS domain for Guest Networks
-# label.configure.vpc=Configure VPC
-# label.edit.vpc=Edit VPC
-# label.restart.vpc=restart VPC
-# message.restart.vpc=Please confirm that you want to restart the VPC
-# label.remove.vpc=remove VPC
-# message.remove.vpc=Please confirm that you want to remove the VPC
-# label.vpn.customer.gateway=VPN Customer Gateway
-# label.add.vpn.customer.gateway=Add VPN Customer Gateway
-# label.IKE.encryption=IKE Encryption
-# label.IKE.hash=IKE Hash
-# label.IKE.DH=IKE DH
-# label.ESP.encryption=ESP Encryption
-# label.ESP.hash=ESP Hash
-# label.perfect.forward.secrecy=Perfect Forward Secrecy
-# label.IKE.lifetime=IKE Lifetime (second)
-# label.ESP.lifetime=ESP Lifetime(second)
-# label.dead.peer.detection=Dead Peer Detection
-# label.delete.VPN.customer.gateway=delete VPN Customer Gateway
-# message.delete.VPN.customer.gateway=Please confirm that you want to delete this VPN Customer Gateway
-
-label.network.domain.text=Texte du domaine réseau
-label.memory.mb=Mémoire
-label.cpu.mhz=CPU (en MHz)
-
-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.reboot.router=Confirmez que vous souhaitez redémarrer ce routeur.
-message.action.stop.router=Confirmez que vous souhaitez arrêter ce routeur.
-message.restart.network=Confirmer le redémarrage du réseau
-
-
-label.ipaddress=Adresse IP
-label.vcdcname=Nom du DC vCenter
-label.vcipaddress=Adresse IP vCenter
-label.vsmctrlvlanid=VLAN ID Controle
-label.vsmpktvlanid=VLAN ID Paquet
-label.vsmstoragevlanid=VLAN ID Stockage
-label.nexusVswitch=Nexus Vswitch
-label.action.delete.nexusVswitch=Supprimer le NexusVswitch
-label.action.enable.nexusVswitch=Activer le NexusVswitch
-label.action.disable.nexusVswitch=Désactiver le NexusVswitch
-label.action.list.nexusVswitch=Lister les NexusVswitch
-message.action.delete.nexusVswitch=Confirmer la suppression de ce NexusVswitch.
-message.action.enable.nexusVswitch=Confirmer l\'activation de ce NexusVswitch.
-message.action.disable.nexusVswitch=Confirmer la désactivation de ce NexusVswitch.
-message.specify.url=Renseigner l\'URL
-label.select.instance.to.attach.volume.to=Sélectionner l\'instance à laquelle rattacher ce volume
-label.upload=Charger
-label.upload.volume=Charger un volume
-label.virtual.routers=Routeurs virtuels
-label.primary.storage.count=Groupes de stockage primaire
-label.secondary.storage.count=Groupes de stokage secondaire
-label.number.of.system.vms=Nombre de VM système
-label.number.of.virtual.routers=Nombre de routeurs virtuels
-label.action.register.iso=Enregistrer ISO
-label.isolation.method=Méthode de séparation
-label.action.register.template=Enregister image
-label.checksum=Checksum MD5
-label.vpn=VPN
-label.vlan=VLAN
-
-
-label.management.ips=Adresses IP de management
-label.devices=Machines
-label.rules=Règles
-label.traffic.label=Label trafic
-label.vm.state=Etat VM
-# message.setup.physical.network.during.zone.creation.basic=When adding a basic zone, you can set up one physical network, which corresponds to a NIC on the hypervisor. The network carries several types of traffic.
You may also drag and drop other traffic types onto the physical network.
-label.domain.router=Routeur du domaine
-label.console.proxy=Console proxy
-label.secondary.storage.vm=VM stockage secondaire
-label.add.netScaler.device=Ajouter un Netscaler
-label.add.F5.device=Ajouter un F5
-label.add.SRX.device=Ajouter un SRX
-label.account.and.security.group=Compte, groupe de sécurité
-label.fetch.latest=Raffraichir
-label.system.offering=Offre système
-message.validate.instance.name=le nom de l\'instance de l\'instance ne peut dépasser 63 caractères. Seuls les lettres de a à z, les chiffres de 0 à 9 et les tirets sont acceptés. Le nom doit commencer par une lettre et se terminer par une lettre ou un chiffre.
-
-
-label.isolated.networks=Réseaux isolés
-label.latest.events=Derniers évenements
-state.Enabled=Actifs
-label.system.wide.capacity=Capacité globale
-label.network.service.providers=Provider de réseau
-message.launch.zone=La zone est prête à démarrer; Continuer.
-error.unable.to.reach.management.server=Impossible de joindre le serveur de management
-label.internal.name=Nom interne
-message.configure.all.traffic.types=Vous avez de multiples réseaux physiques; veuillez configurer les labels pour chaque type de trafic en cliquant sur le bouton Modifier.
-message.edit.traffic.type=Spécifier le label de trafic associé avec ce type de trafic
-label.edit.traffic.type=Modifer le type de trafic
-label.label=Label
-label.max.networks=Réseaux Max.
-error.invalid.username.password=Utilisateur ou mot de passe invalide
-message.enabling.security.group.provider=Activation du groupe de sécurité pour le provider
-message.adding.Netscaler.provider=Ajouter un Netscaler provider
-message.creating.guest.network=Création du réseau pour les instances
-label.action.delete.physical.network=Supprimer le réseau physique
-message.action.delete.physical.network=Confirmer la suppression du réseau physique
-# message.installWizard.copy.whatIsAHost=A host is a single computer. Hosts provide the computing resources that run the guest virtual machines. Each host has hypervisor software installed on it to manage the guest VMs (except for bare metal hosts, which are a special case discussed in the Advanced Installation Guide). For example, a Linux KVM-enabled server, a Citrix XenServer server, and an ESXi server are hosts. In a Basic Installation, we use a single host running XenServer or KVM.
The host is the smallest organizational unit within a CloudStack&\#8482; deployment. Hosts are contained within clusters, clusters are contained within pods, and pods are contained within zones.
-
-
-label.add.compute.offering=Ajouter une offre de calcul
-label.compute.offering=Offre de calcul
-label.compute.offerings=Offres de calcul
-label.select.offering=Choisir une offre
-label.menu.infrastructure=Infrastructure
-label.sticky.tablesize=Taille du tableau
-label.sticky.expire=Expiration
-label.sticky.cookie-name=Nom du cookie
-label.sticky.mode=Mode
-label.sticky.length=Longueur
-label.sticky.holdtime=Temps de pause
-label.sticky.request-learn=Apprendre la requête
-label.sticky.prefix=Préfixe
-label.sticky.nocache=Pas de cache
-label.sticky.indirect=Indirect
-label.sticky.postonly=Après seulement
-label.sticky.domain=Domaine
-state.Allocating=Allocation en cours
-state.Migrating=Migration en cours
-error.please.specify.physical.network.tags=L\'offre réseau ne sera pas disponible tant que des label n\'auront pas été renseigner pour ce réseau physique.
-
-
-state.Stopping=Arrêt en cours
-message.add.load.balancer.under.ip=La règle de load balancer a été ajoutée sous l\'adresse IP \:
-message.select.instance=Sélectionner une instance.
-label.select=Selectionner
-label.select.vm.for.static.nat=Sélectionner une VM pour le NAT statique
-label.select.instance=Sélectionner une instance.
-label.nat.port.range=Plage de port NAT
-label.static.nat.vm.details=NAT statique, détails par VM
-label.edit.lb.rule=Modifier la règle LB
-message.migrate.instance.to.host=Merci de confirmer la migration de l\'instance vers un autre serveur
-label.migrate.instance.to.host=Migration de l\'instance sur un autre serveur
-message.migrate.instance.to.ps=Merci de confirmer la migration de l\'instance vers un autre stockage primaire
-label.migrate.instance.to.ps=Migration de l\'instance sur un autre stockage primaire
-label.corrections.saved=Modifications enregistrées
-# message.installWizard.copy.whatIsSecondaryStorage=Secondary storage is associated with a zone, and it stores the following\:- Templates - OS images that can be used to boot VMs and can include additional configuration information, such as installed applications
- ISO images - OS images that can be bootable or non-bootable
- Disk volume snapshots - saved copies of VM data which can be used for data recovery or to create new templates
-# message.installWizard.copy.whatIsPrimaryStorage=A CloudStack&\#8482; cloud infrastructure makes use of two types of storage\: primary storage and secondary storage. Both of these can be iSCSI or NFS servers, or localdisk.
Primary storage is associated with a cluster, and it stores the disk volumes of each guest VM for all the VMs running on hosts in that cluster. The primary storage server is typically located close to the hosts.
-# message.installWizard.copy.whatIsACluster=A cluster provides a way to group hosts. The hosts in a cluster all have identical hardware, run the same hypervisor, are on the same subnet, and access the same shared storage. Virtual machine instances (VMs) can be live-migrated from one host to another within the same cluster, without interrupting service to the user. A cluster is the third-largest organizational unit within a CloudStack&\#8482; deployment. Clusters are contained within pods, and pods are contained within zones.
CloudStack&\#8482; allows multiple clusters in a cloud deployment, but for a Basic Installation, we only need one cluster.
-# message.installWizard.copy.whatIsAPod=A pod often represents a single rack. Hosts in the same pod are in the same subnet.
A pod is the second-largest organizational unit within a CloudStack&\#8482; deployment. Pods are contained within zones. Each zone can contain one or more pods; in the Basic Installation, you will have just one pod in your zone.
-# message.installWizard.copy.whatIsAZone=A zone is the largest organizational unit within a CloudStack&\#8482; deployment. A zone typically corresponds to a single datacenter, although it is permissible to have multiple zones in a datacenter. The benefit of organizing infrastructure into zones is to provide physical isolation and redundancy. For example, each zone can have its own power supply and network uplink, and the zones can be widely separated geographically (though this is not required).
-# message.installWizard.copy.whatIsCloudStack=CloudStack&\#8482 is a software platform that pools computing resources to build public, private, and hybrid Infrastructure as a Service (IaaS) clouds. CloudStack&\#8482 manages the network, storage, and compute nodes that make up a cloud infrastructure. Use CloudStack&\#8482 to deploy, manage, and configure cloud computing environments.
Extending beyond individual virtual machine images running on commodity hardware, CloudStack&\#8482 provides a turnkey cloud infrastructure software stack for delivering virtual datacenters as a service - delivering all of the essential components to build, deploy, and manage multi-tier and multi-tenant cloud applications. Both open-source and Premium versions are available, with the open-source version offering nearly identical features.
-message.installWizard.tooltip.addSecondaryStorage.path=Le chemin exporté, situé sur le serveur spécifié précédement
-message.installWizard.tooltip.addSecondaryStorage.nfsServer=Adresse IP du server NFS supportant le stockage secondaire
-# message.installWizard.tooltip.addPrimaryStorage.path=(for NFS) In NFS this is the exported path from the server. Path (for SharedMountPoint). With KVM this is the path on each host that is where this primary storage is mounted. For example, "/mnt/primary".
-message.installWizard.tooltip.addPrimaryStorage.server=(pour NFS, iSCSI ou PreSetup) Adresse IP ou nom DNS du stockage
-message.installWizard.tooltip.addPrimaryStorage.name=Nom pour ce stockage
-message.installWizard.tooltip.addHost.password=Le mot de passe pour l\'utilisateur indiqué précédement (issu de l\'installation XenServer).
-message.installWizard.tooltip.addHost.username=Habituellement root.
-message.installWizard.tooltip.addHost.hostname=Le nom DNS ou adresse IP du serveur.
-message.installWizard.tooltip.addCluster.name=Un nom pour le cluster. Ce choix est libre et n\'est pas utilisé par CloudStack.
-# message.installWizard.tooltip.addPod.reservedSystemEndIp=This is the IP range in the private network that the CloudStack uses to manage Secondary Storage VMs and Console Proxy VMs. These IP addresses are taken from the same subnet as computing servers.
-# message.installWizard.tooltip.addPod.reservedSystemStartIp=This is the IP range in the private network that the CloudStack uses to manage Secondary Storage VMs and Console Proxy VMs. These IP addresses are taken from the same subnet as computing servers.
-message.installWizard.tooltip.addPod.reservedSystemNetmask=Le masque réseau que les instances utiliseront sur le réseau
-message.installWizard.tooltip.addPod.reservedSystemGateway=Passerelle pour les serveurs dans ce pod
-message.installWizard.tooltip.addPod.name=Nom pour le pod
-# message.installWizard.tooltip.configureGuestTraffic.guestEndIp=The range of IP addresses that will be available for allocation to guests in this zone. If one NIC is used, these IPs should be in the same CIDR as the pod CIDR.
-# message.installWizard.tooltip.configureGuestTraffic.guestStartIp=The range of IP addresses that will be available for allocation to guests in this zone. If one NIC is used, these IPs should be in the same CIDR as the pod CIDR.
-message.installWizard.tooltip.configureGuestTraffic.guestNetmask=Le masque réseau que les instances devrait utiliser sur le réseau
-message.installWizard.tooltip.configureGuestTraffic.guestGateway=La passerelle que les instances clientes doivent utiliser
-message.installWizard.tooltip.configureGuestTraffic.description=Desctiption pour ce réseau
-message.installWizard.tooltip.configureGuestTraffic.name=Nom pour ce réseau
-# message.installWizard.tooltip.addZone.internaldns2=These are DNS servers for use by system VMs in the zone. These DNS servers will be accessed via the private network interface of the System VMs. The private IP address you provide for the pods must have a route to the DNS server named here.
-# message.installWizard.tooltip.addZone.internaldns1=These are DNS servers for use by system VMs in the zone. These DNS servers will be accessed via the private network interface of the System VMs. The private IP address you provide for the pods must have a route to the DNS server named here.
-# message.installWizard.tooltip.addZone.dns2=These are DNS servers for use by guest VMs in the zone. These DNS servers will be accessed via the public network you will add later. The public IP addresses for the zone must have a route to the DNS server named here.
-message.installWizard.tooltip.addZone.name=Nom pour la zone
-# message.installWizard.tooltip.addZone.dns1=These are DNS servers for use by guest VMs in the zone. These DNS servers will be accessed via the public network you will add later. The public IP addresses for the zone must have a route to the DNS server named here.
-message.setup.successful=Installation Cloud réussie \!
-label.may.continue=Vous pouvez continuer.
-error.installWizard.message=Une erreur s\'est produite; vous pouvez retourner en arrière et corriger les erreurs
-message.installWizard.now.building=Construction de votre Cloud en cours
-message.installWizard.click.retry=Appuyer sur le bouton pour essayer à nouveau le démarrage.
-label.launch=Démarrer
-label.installWizard.click.launch=Appuyer sur le bouton démarrer.
-label.congratulations=Félicitations \!
-label.installWizard.addSecondaryStorageIntro.subtitle=Qu\'est ce que le stockage secondaire ?
-label.installWizard.addSecondaryStorageIntro.title=Ajoutons du stockage secondaire
-label.installWizard.addPrimaryStorageIntro.subtitle=Qu\'est ce que le stockage primaire ?
-label.installWizard.addPrimaryStorageIntro.title=Ajoutons du stockage primaire
-label.installWizard.addHostIntro.subtitle=Qu\'est ce qu\'un serveur ?
-label.installWizard.addHostIntro.title=Ajoutons un serveur
-label.installWizard.addClusterIntro.subtitle=Qu\'est ce qu\'un cluster ?
-label.installWizard.addClusterIntro.title=Ajoutons un cluster
-label.installWizard.addPodIntro.subtitle=Qu\'est ce qu\'un pod ?
-label.installWizard.addPodIntro.title=Ajoutons un pod
-label.installWizard.addZone.title=Ajouter une zone
-label.installWizard.addZoneIntro.subtitle=Qu\'est ce qu\'une zone ?
-label.installWizard.addZoneIntro.title=Ajoutons une zone
-error.password.not.match=Les mot de passe ne correspondent pas
-label.confirm.password=Confirmer le mot de passe
-message.change.password=Merci de modifier votre mot de passe.
-label.save.and.continue=Enregistrer et continuer
-label.skip.guide=J\'ai déjà utilisé CloudStack avant, passer ce tutorial
-label.continue.basic.install=Continuer avec l\'installation basique
-label.introduction.to.cloudstack=Introduction à CloudStack
-label.what.is.cloudstack=Qu\'est ce que CloudStack ?
-label.hints=Astuces
-label.installWizard.subtitle=Ce tutorial vous aidera à configurer votre installation CloudStack
-label.continue=Continuer
-label.installWizard.title=Bonjour et bienvenue dans CloudStack
-label.agree=Accepter
-label.manage.resources=Gérer les ressources
-label.port.forwarding.policies=Règles de transfert de port
-label.load.balancing.policies=Règles de répartition de charge
-label.networking.and.security=Réseau et sécurité
-label.bandwidth=Bande passante
-label.virtual.machines=Machines virtuelles
-label.compute.and.storage=Processeur et Stockage
-label.task.completed=Tâche terminée
-label.update.project.resources=Mettre à jour les ressources du projet
-label.remove.project.account=Supprimer le compte projet
-label.item.listing=Liste des éléments
-message.select.item=Merci de sélectionner un élément.
-label.removing=Suppression
-label.invite=Inviter
-label.add.by=Ajouté par
-label.max.vms=Max VMs utilisateur
-label.max.public.ips=Max IP publiques
-label.max.volumes=Max volumes
-label.max.snapshots=Max snapshots
-label.max.templates=Max images
-# label.max.vpcs=Max. VPCs
-label.project.dashboard=Tableau de bord projet
-label.remind.later=Rappeler moi plus tard
-label.invited.accounts=Comptes invités
-label.invite.to=Inviter sur
-label.add.accounts.to=Ajouter des comptes sur
-label.add.accounts=Ajouter des comptes
-label.project.name=Nom du projet
-label.create.project=Créer un projet
-label.networks=Réseaux
-label.launch.vm=Démarrer VM
-label.new.vm=Nouvelle VM
-label.previous=Retour
-label.add.to.group=Ajouter au groupe
-message.vm.review.launch=Merci de vérifier les informations suivantes et de confirmer que votre instance virtuelle est correcte avant de la démarrer.
-message.select.security.groups=Merci de sélectionner un(des) groupe(s) de sécurité pour la nouvelle VM
-label.new=Nouveau
-message.please.select.networks=Selectionner les réseaux pour votre instance.
-message.please.proceed=Continuer vers la prochaine étape.
-message.zone.no.network.selection=La zone sélectionnée ne propose pas le réseau choisi
-label.no.thanks=Non merci
-label.my.templates=Mes images
-message.select.template=Sélectionner une image pour votre nouvelle instance virtuelle.
-message.select.iso=Sélectionner une ISO pour votre nouvelle instance virtuelle.
-message.template.desc=Image OS pouvant être utilisée pour démarrer une VM
-message.iso.desc=Image ISO contenant des données ou des binaires de démarrage
-label.select.iso.or.template=Sélectionner une ISO ou une image
-message.select.a.zone=Une zone corespond en général à un seul datacenter. Des zones multiples peuvent permettre de rendre votre cloud plus fiable en apportant une isolation physique et de la redondance.
-label.select.a.zone=Sélectionner une zone
-label.review=Revoir
-label.select.a.template=Sélectionner une image
-label.setup=Configuration
-state.Allocated=Alloué
-changed.item.properties=Propriétés de l\'élément modifiées
-label.apply=Appliquer
-label.default=Par défaut
-label.viewing=Consultation en cours
-label.move.to.top=Placer au dessus
-label.move.up.row=Monter d\'un cran
-label.move.down.row=Descendre d\'un cran
-# label.move.to.bottom=Move to bottom
-label.drag.new.position=Déplacer sur une autre position
-label.order=Ordre
-label.no.data=Aucune donnée
-label.change.value=Modifier la valeur
-label.clear.list=Purger la liste
-label.full.path=Chemin complet
-message.add.domain=Spécifier le sous domaine que vous souhaitez créer sous ce domaine
-message.delete.user=Confirmer la suppression de l\'utilisateur.
-message.enable.user=Confirmer l\'activation de cet utilisateur.
-message.disable.user=Confirmer la désactivation de l\'utilisateur.
-message.generate.keys=Confirmer la génération de nouvelles clefs pour cet utilisateur.
-message.update.resource.count=Confirmer la mise à jour des ressources pour ce compte.
-message.edit.account=Modifier ("-1" signifie pas de limite de ressources)
-label.total.of.vm=Total VM
-label.total.of.ip=Total adresses IP
-state.enabled=Actif
-message.action.download.iso=Confirmer le téléchargement de l\'ISO
-message.action.download.template=Confirmer le téléchargement de l\'image
-label.destination.zone=Zone destination
-label.keyboard.type=Type de clavier
-label.nic.adapter.type=Type de carte réseau
-label.root.disk.controller=Controlleur disque principal
-label.community=Communauté
-label.remove.egress.rule=Supprimer la règle sortante
-label.add.egress.rule=Ajouter la règle sortante
-label.egress.rule=Règle sortante
-label.remove.ingress.rule=Supprimer la règle entrante
-label.delete.vpn.user=Supprimer l\'utilisateur VPN
-label.add.vpn.user=Ajouter un utilisateur VPN
-label.remove.pf=Supprimer la règle de transfert de port
-label.remove.vm.from.lb=Supprimer la VM de la règle de répartition de charge
-label.add.vms.to.lb=Ajouter une/des VM(s) à la règle de répartition de charge
-label.add.vm=Ajouter VM
-label.remove.static.nat.rule=Supprimer le NAT statique
-label.remove.rule=Supprimer la règle
-label.add.static.nat.rule=Ajouter une règle de NAT statique
-label.add.rule=Ajouter règle
-label.configuration=Configuration
-message.disable.vpn=Etes vous sûr de vouloir désactiver le VPN ?
-label.disable.vpn=Désactiver le VPN
-message.enable.vpn=Confirmer l\'activation de l\'accès VPN pour cette adresse IP.
-label.enable.vpn=Activer VPN
-message.acquire.new.ip=Confirmer l\'ajout d\'une nouvelle adresse IP pour ce réseau.
-label.elastic=Elastique
-label.my.network=Mon réseau
-label.add.vms=Ajouter VMs
-label.configure=Configurer
-label.stickiness=Fidélité
-label.source=Origine
-label.least.connections=Le moins de connexions
-label.round.robin=Aléatoire
-label.restart.required=Rédémarrage nécessaire
-label.clean.up=Nettoyage
-label.restart.network=Redémarrage du réseau
-label.edit.network.details=Modifier les paramètres réseau
-label.add.guest.network=Ajout d\'un réseau pour les VM
-label.guest.networks=Réseau pour les VM
-message.ip.address.changed=Vos adresses IP ont peut être changées; Voulez vous raffraichir la liste ? Dans ce cas, le panneau de détail se fermera.
-state.BackingUp=Sauvegarde en cours
-state.BackedUp=Sauvegardé
-label.done=Terminé
-label.vm.name=Nom de la VM
-message.migrate.volume=Confirmer la migration du volume vers un autre stockage primaire.
-label.migrate.volume=Migration du volume vers un autre stockage primaire
-message.create.template=Voulez vous créer l\'image ?
-label.create.template=Création d\'image
-message.download.volume.confirm=Confirmer le téléchargement du volume
-message.detach.disk=Voulez vous détacher ce disque ?
-state.ready=Prêt
-state.Ready=Prêt
-label.vm.display.name=Nom d\'affichage de la VM
-label.select-view=Sélectionner la vue
-label.local.storage=Stockage local
-label.direct.ips=IP directes
-label.view.all=Voir tout
-label.zone.details=Détails de la zone
-message.alert.state.detected=Etat d\'alerte détecté
-state.Starting=Démarrage en cours
-state.Expunging=Purge en cours
-state.Creating=Création en cours
-message.decline.invitation=Voulez vous refuser cette invitation au projet ?
-label.decline.invitation=Refuser l\'invitation
-message.confirm.join.project=Confirmer l\'invitation au projet
-message.join.project=Vous avez rejoint un projet. Sélectionnez la vue Projet pour le voir.
-label.accept.project.invitation=Accepter l\'invitation au projet
-label.token=Jeton unique
-label.project.id=ID projet
-message.enter.token=Entrer le jeton unique reçu dans le message d\'invitation.
-label.enter.token=Entrez le jeton unique
-state.Accepted=Accepté
-state.Pending=En attente
-state.Completed=Terminé
-state.Declined=Refusé
-label.project=Projet
-label.invitations=Invitations
-label.delete.project=Supprimer projet
-message.delete.project=Confirmer la suppression du projet
-message.activate.project=Confirmer l\'activation de ce projet
-label.activate.project=Activer projet
-label.suspend.project=Suspendre projet
-message.suspend.project=Confirmer la suspension de ce projet
-state.Suspended=Suspendu
-label.edit.project.details=Modifier les détails du projet
-label.new.project=Nouveau projet
-state.Active=Actif
-state.Disabled=Désactivé
-label.projects=Projets
-label.make.project.owner=Devenir propriétaire du projet
-label.remove.project.account=Supprimer le compte projet
-message.project.invite.sent=Invitation envoyée; les utilisateurs seront ajoutés après acceptation de l\'invitation
-label.add.account.to.project=Ajouter un compte au projet
-label.revoke.project.invite=Revoquer l\'invitation
-label.project.invite=Inviter sur le projet
-label.select.project=Sélectionner un projet
-message.no.projects=Vous n\'avez pas de projet.
Vous pouvez en créer un depuis la section projets.
-message.no.projects.adminOnly=Vous n\'avez pas de projet.
Contacter votre administrateur pour ajouter un projet.
-message.pending.projects.1=Vous avez des invitations projet en attente \:
-message.pending.projects.2=Pour les visualiser, aller dans la section projets, puis sélectionner invitation dans la liste déroulante.
-message.instanceWizard.noTemplates=Vous n\'avez pas de image disponible; Ajouter une image compatible puis relancer l\'assistant de création d\'instance.
-label.view=Voir
-instances.actions.reboot.label=Redémarrer l\'instance
-label.filterBy=Filtrer par
-label.ok=OK
-notification.reboot.instance=Redémarrer l\'instance
-notification.start.instance=Démarrer l\'instance
-notification.stop.instance=Stopper l\'instance
-label.display.name=Nom d\'affichage
-label.zone.name=Nom de la zone
-ui.listView.filters.all=Tous
-ui.listView.filters.mine=Mon
-state.Running=Démarrée
-state.Stopped=Arrétée
-state.Destroyed=Supprimée
-state.Error=Erreur
-message.reset.password.warning.notPasswordEnabled=L\'image de cette instance a été créée sans la gestion de mot de passe
-message.reset.password.warning.notStopped=Votre instance doit être arretée avant de changer son mot de passe
-label.notifications=Messages
-label.default.view=Vue par défaut
-label.project.view=Vue projet
-
-message.add.system.service.offering=Ajouter les informations suivantes pour créer une nouvelle offre système.
-message.action.delete.system.service.offering=Confirmer la suppression de l\'offre système.
-label.action.delete.system.service.offering=Supprimer l\'offre système
-label.hypervisor.capabilities=Fonctions hyperviseur
-label.hypervisor.version=Version hyperviseur
-label.max.guest.limit=Nombre maximum d\'instances
-label.add.network.offering=Ajouter une offre réseau
-label.supported.services=Services supportés
-label.service.capabilities=Fonctions disponibles
-label.guest.type=Type d\'instance
-label.specify.IP.ranges=Plages IP
-label.conserve.mode=Conserver le mode
-label.created.by.system=Créé par le system
-label.menu.system.service.offerings=Offres système
-label.add.system.service.offering=Ajouter une offre de service système
-label.redundant.router.capability=Router redondant
-label.supported.source.NAT.type=Type de NAT supporté
-label.elastic.LB=Répartition de charge extensible
-label.LB.isolation=Répartition de charge isolée
-label.elastic.IP=IP extensible
-label.network.label.display.for.blank.value=Utiliser la passerelle par défaut
-label.xen.traffic.label=Label pour le trafic Xenserver
-label.kvm.traffic.label=Label pour le trafic KVM
-label.vmware.traffic.label=Label pour le trafic VMware
-label.start.IP=Démarrer l\'IP
-label.end.IP=Résilier l\'IP
-label.remove.ip.range=Supprimer la plage IP
-label.ip.ranges=Plages IP
-label.start.vlan=VLAN de départ
-label.end.vlan=VLAN de fin
-label.broadcast.domain.range=Plage de brodcast domaine
-label.compute=Processeur
-message.add.guest.network=Confirmer l\'ajout du réseau
-label.subdomain.access=Accès au sous domaine
-label.guest.start.ip=Adresse IP de début pour les instances
-label.guest.end.ip=Adresse IP de fin pour les instances
-label.virtual.router=Routeur Virtuel
-label.physical.network.ID=ID du réseau physique
-label.destination.physical.network.id=ID du réseau physique de destination
-label.dhcp=DHCP
-label.destroy.router=Supprimer le routeur
-message.confirm.destroy.router=Confirmer la suppression du routeur
-label.change.service.offering=Modifier l\'offre de service
-label.view.console=Voir la console
-label.redundant.state=Etat redondant
-label.enable.provider=Activer le provider
-message.confirm.enable.provider=Confirmer l\'activation de ce provider
-label.disable.provider=Désactiver ce provider
-message.confirm.disable.provider=Confirmer la désactivation de ce provider
-label.shutdown.provider=Eteindre le provider
-message.confirm.shutdown.provider=Confirmer l\'extinction de ce provider
-label.netScaler=Netscaler
-label.add.new.NetScaler=Ajouter Netscaler
-label.capacity=Capacité
-label.dedicated=Dédié
-label.f5=F5
-label.add.new.F5=Ajouter un F5
-label.srx=SRX
-label.providers=Fournisseurs
-label.add.new.SRX=Ajouter un SRX
-label.timeout=Expiration
-label.public.network=Réseau public
-label.private.network=Réseau privé
-label.enable.swift=Activer Swift
-confirm.enable.swift=Remplir les informations suivantes pour activer Swift
-message.after.enable.swift=Swift configuré. Remarque \: une fois quitter cette page, il ne sera plus possible de reconfiguré Swift une nouvelle fois.
-label.key=Clef
-label.delete.NetScaler=Supprimer Netscaler
-message.confirm.delete.NetScaler=Confirmer la suppression du Netscaler
-label.delete.F5=Supprimer F5
-message.confirm.delete.F5=Confirmer la suppression du F5
-label.delete.SRX=Supprimer SRX
-message.confirm.delete.SRX=Confirmer la suppression du SRX
-label.pods=Pods
-label.pod.name=Nom du pod
-label.reserved.system.gateway=Gateway système réservée
-label.reserved.system.netmask=Masque réseau système réservé
-label.start.reserved.system.IP=Adresse IP de démarrage réservée pour le système
-label.end.reserved.system.IP=Adresse IP de fin réservée pour le système
-label.clusters=Clusters
-label.cluster.name=Nom du cluster
-label.host.MAC=MAC serveur
-label.agent.username=Compte de l\'agent
-label.agent.password=Mot de passe de l\'agent
-message.confirm.action.force.reconnect=Confirmer que reconnection forcée de ce serveur.
-label.resource.state=Etat des ressources
-label.LUN.number=N° LUN
-message.confirm.remove.IP.range=Confirmer la suppression de cette plage d\'adresses IP
-message.tooltip.zone.name=Nom pour la zone.
-message.tooltip.dns.1=Nom d\'un serveur DNS utilisé par les VM de la zone. Les adresses IP publiques de cette zones doivent avoir une route vers ce serveur.
-message.tooltip.dns.2=Nom d\'un serveur DNS secondaire utilisé par les VM de la zone. Les adresses IP publiques de cette zones doivent avoir une route vers ce serveur.
-message.tooltip.internal.dns.1=Nom d\'un serveur DNS que CloudStack peut utiliser pour les VM système dans cette zone. Les adresses IP privées des pods doivent avoir une route vers ce serveur.
-message.tooltip.internal.dns.2=Nom d\'un serveur DNS que CloudStack peut utiliser pour les VM système dans cette zone. Les adresses IP privées des pods doivent avoir une route vers ce serveur.
-message.tooltip.network.domain=Suffixe DNS pour les noms de domaine personnalisés accèdé par les intances.
-message.tooltip.pod.name=Nom pour le pod.
-message.tooltip.reserved.system.gateway=La passerelle pour les serveur du pod.
-message.tooltip.reserved.system.netmask=Le préfixe réseau utilisé par le sous-réseau du pod. Au format CIDR.
-message.creating.zone=Création de la zone
-message.creating.physical.networks=Création des réseaux physiques
-message.configuring.physical.networks=Configuration des réseaux physiques
-message.adding.Netscaler.device=Ajout du Netscaler
-message.creating.pod=Création d\'un pod
-message.configuring.public.traffic=Configuration du réseau public
-message.configuring.storage.traffic=Configuration du réseau de stockage
-message.configuring.guest.traffic=Configuration du réseau VM
-message.creating.cluster=Création du cluster
-message.adding.host=Ajout du serveur
-message.creating.primary.storage=Création du stockage primaire
-message.creating.secondary.storage=Création du stockage secondaire
-message.Zone.creation.complete=Création de la zone terminée
-message.enabling.zone=Activation de la zone
-error.something.went.wrong.please.correct.the.following=Erreur; corriger le point suivant
-error.could.not.enable.zone=Impossible d\'activer la zone
-message.zone.creation.complete.would.you.like.to.enable.this.zone=Création de la zone terminée. Voulez vous l\'activer ?
-message.please.add.at.lease.one.traffic.range=Ajouter au moins une plage réseau
-message.you.must.have.at.least.one.physical.network=Vous devez avoir au moins un réseau physique
-message.please.select.a.different.public.and.management.network.before.removing=Sélectionner un réseau publique et management différent avant de supprimer
-
-label.zone.type=Type de zone
-label.setup.zone=Configurer la zone
-label.setup.network=Configurer le réseau
-label.add.resources=Ajouter des resssources
-label.launch=Démarrer
-label.set.up.zone.type=configurer le type de zone
-message.please.select.a.configuration.for.your.zone=Sélectionner une configuration pour la zone.
-# message.desc.basic.zone=Provide a single network where each VM instance is assigned an IP directly from the network. Guest isolation can be provided through layer-3 means such as security groups (IP address source filtering).
-label.basic=Basic
-# message.desc.advanced.zone=For more sophisticated network topologies. This network model provides the most flexibility in defining guest networks and providing custom network offerings such as firewall, VPN, or load balancer support.
-label.advanced=Avancé
-# message.desc.zone=A zone is the largest organizational unit in CloudStack, and it typically corresponds to a single datacenter. Zones provide physical isolation and redundancy. A zone consists of one or more pods (each of which contains hosts and primary storage servers) and a secondary storage server which is shared by all pods in the zone.
-label.physical.network=Réseau physique
-label.public.traffic=Trafic public
-label.guest.traffic=Trafic invité
-label.storage.traffic=Trafic stockage
-# message.setup.physical.network.during.zone.creation=When adding an advanced zone, you need to set up one or more physical networks. Each network corresponds to a NIC on the hypervisor. Each physical network can carry one or more types of traffic, with certain restrictions on how they may be combined.
Drag and drop one or more traffic types onto each physical network.
-label.add.physical.network=Ajouter un réseau physique
-label.traffic.types=Type de trafic
-label.management=Management
-label.guest=Invité
-label.please.specify.netscaler.info=Renseigner les informations sur le Netscaler
-# message.public.traffic.in.advanced.zone=Public traffic is generated when VMs in the cloud access the internet. Publicly-accessible IPs must be allocated for this purpose. End users can use the CloudStack UI to acquire these IPs to implement NAT between their guest network and their public network.
Provide at least one range of IP addresses for internet traffic.
-# message.public.traffic.in.basic.zone=Public traffic is generated when VMs in the cloud access the Internet or provide services to clients over the Internet. Publicly accessible IPs must be allocated for this purpose. When a instance is created, an IP from this set of Public IPs will be allocated to the instance in addition to the guest IP address. Static 1-1 NAT will be set up automatically between the public IP and the guest IP. End users can also use the CloudStack UI to acquire additional IPs to implement static NAT between their instances and the public IP.
-# message.add.pod.during.zone.creation=Each zone must contain in one or more pods, and we will add the first pod now. A pod contains hosts and primary storage servers, which you will add in a later step. First, configure a range of reserved IP addresses for CloudStack\'s internal management traffic. The reserved IP range must be unique for each zone in the cloud.
-# message.guest.traffic.in.advanced.zone=Guest network traffic is communication between end-user virtual machines. Specify a range of VLAN IDs to carry guest traffic for each physical network.
-# message.guest.traffic.in.basic.zone=Guest network traffic is communication between end-user virtual machines. Specify a range of IP addresses that CloudStack can assign to guest VMs. Make sure this range does not overlap the reserved system IP range.
-# message.storage.traffic=Traffic between CloudStack\'s internal resources, including any components that communicate with the Management Server, such as hosts and CloudStack system VMs. Please configure storage traffic here.
-# message.desc.cluster=Each pod must contain one or more clusters, and we will add the first cluster now. A cluster provides a way to group hosts. The hosts in a cluster all have identical hardware, run the same hypervisor, are on the same subnet, and access the same shared storage. Each cluster consists of one or more hosts and one or more primary storage servers.
-# message.desc.host=Each cluster must contain at least one host (computer) for guest VMs to run on, and we will add the first host now. For a host to function in CloudStack, you must install hypervisor software on the host, assign an IP address to the host, and ensure the host is connected to the CloudStack management server.
Give the host\'s DNS or IP address, the user name (usually root) and password, and any labels you use to categorize hosts.
-# message.desc.primary.storage=Each cluster must contain one or more primary storage servers, and we will add the first one now. Primary storage contains the disk volumes for all the VMs running on hosts in the cluster. Use any standards-compliant protocol that is supported by the underlying hypervisor.
-# message.desc.secondary.storage=Each zone must have at least one NFS or secondary storage server, and we will add the first one now. Secondary storage stores VM templates, ISO images, and VM disk volume snapshots. This server must be available to all hosts in the zone.
Provide the IP address and exported path.
-label.launch.zone=Démarrer la zone
-message.please.wait.while.zone.is.being.created=Patienter pendant la création de la zone, cela peut prendre du temps...
-
-label.load.balancing=Load Balancing
-label.static.nat.enabled=NAT statique activé
-label.zones=Zones
-label.view.more=Voir plus
-label.number.of.zones=Nombre de zones
-label.number.of.pods=Nombre de Pods
-label.number.of.clusters=Nombre de clusters
-label.number.of.hosts=Nombre de serveurs
-label.total.hosts=Total serveurs
-label.total.CPU=Capacité Totale en CPU
-label.total.memory=Total mémoire
-label.total.storage=Total stockage
-label.purpose=Rôle
-
-
-
-
-label.action.migrate.router=Migration routeur
-label.action.migrate.router.processing=Migration routeur en cours...
-message.migrate.router.confirm=Confirmer la migration du routeur vers \:
-label.migrate.router.to=Migrer le routeur vers
-
-label.action.migrate.systemvm=Migration VM système
-label.action.migrate.systemvm.processing=Migration VM système en cours ...
-message.migrate.systemvm.confirm=Confirmer la migration de la VM système vers \:
-label.migrate.systemvm.to=Miger la VM système vers
-
-
-mode=Mode
-side.by.side=Côte à cote
-inline=Aligné
-
-extractable=Décompressable
-
-label.ocfs2=OCFS2
-
-label.action.edit.host=Modifier l\'hôte
-
-network.rate=Débit Réseau
-
-ICMP.type=Type ICMP
+#Stored by I18NEdit, may be edited!
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
-
-label.allocation.state=Etat de l\'allocation
-managed.state=Etat de la gestion
-
-label.default.use=Utilisation par défaut
-label.host.tags=Labels Server
-
-label.cidr=CIDR
-label.cidr.list=CIDR Source
-
-label.storage.tags=Etiquettes de stockage
-
-label.redundant.router=Routeur redondant
-label.is.redundant.router=Redondant
-
+ICMP.type=Type ICMP
+changed.item.properties=Propri\u00E9t\u00E9s de l\\'\u00E9l\u00E9ment modifi\u00E9es
+confirm.enable.s3=Remplir les informations suivantes pour activer le support de stockage secondaire S3
+confirm.enable.swift=Remplir les informations suivantes pour activer Swift
+error.could.not.enable.zone=Impossible d\\'activer la zone
+error.installWizard.message=Une erreur s\\'est produite ; vous pouvez retourner en arri\u00E8re et corriger les erreurs
+error.invalid.username.password=Utilisateur ou mot de passe invalide
+error.login=Votre nom d\\'utilisateur / mot de passe ne correspond pas \u00E0 nos donn\u00E9es.
+error.menu.select=\u00C9chec de l\\'action car il n\\'y a aucun \u00E9l\u00E9ment s\u00E9lectionn\u00E9.
+error.mgmt.server.inaccessible=Le serveur de gestion est indisponible. Essayez plus tard.
+error.password.not.match=Les mots de passe ne correspondent pas
+error.please.specify.physical.network.tags=L\\'offre r\u00E9seau ne sera pas disponible tant que des libell\u00E9s n\\'auront pas \u00E9t\u00E9 renseign\u00E9s pour ce r\u00E9seau physique.
+error.session.expired=Votre session a expir\u00E9e.
+error.something.went.wrong.please.correct.the.following=Erreur; corriger le point suivant
+error.unable.to.reach.management.server=Impossible de joindre le serveur d\\'administration
+error.unresolved.internet.name=Votre nom Internet ne peut pas \u00EAtre r\u00E9solu.
+extractable=D\u00E9compressable
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.delete.domain.warning=Attention \: Choisir cette option entra\u00EEnera la suppression de tous les domaines issus et l\\'ensemble des comptes associ\u00E9s, 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 \: un arrêt forcé sur cette instance est l\'option ultime. Cela peut engendrer des pertes de données et/ou un comportement inconsitent de votre instance.
-
-label.PreSetup=PreSetup
-label.SR.name = Nom du point de montage
-label.SharedMountPoint=Point de montage partagé
-label.clvm=CLVM
-label.volgroup=Volume Group
-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
+force.remove.host.warning=Attention \: Choisir cette option entra\u00EEnera CloudStack \u00E0\u00A0arr\u00EAter l\\'ensemble des machines virtuelles avant d\\'enlever l\\'h\u00F4te du cluster
+force.stop=Forcer l\\'arr\u00EAt
+force.stop.instance.warning=Attention \: un arr\u00EAt forc\u00E9 sur cette instance est la dernier option. Cela peut engendrer des pertes de donn\u00E9es et/ou un comportement inconsistant de votre instance.
+image.directory=R\u00E9pertoire d\\'images
+inline=Align\u00E9
+instances.actions.reboot.label=Red\u00E9marrer l\\'instance
+label.CIDR.list=Liste CIDR
+label.CIDR.of.destination.network=CIDR du r\u00E9seau de destination
+label.CPU.cap=Limitation CPU
label.DHCP.server.type=Serveur DHCP
+label.DNS.domain.for.guest.networks=Domaine DNS pour les r\u00E9seaux invit\u00E9s
+label.ESP.encryption=Chiffrement ESP
+label.ESP.hash=Empreinte ESP
+label.ESP.lifetime=Dur\u00E9e de vie ESP (secondes)
+label.ESP.policy=Mode ESP
+label.IKE.DH=DH IKE
+label.IKE.encryption=Chiffrement IKE
+label.IKE.hash=Empreinte IKE
+label.IKE.lifetime=Dur\u00E9e de vie IKE (secondes)
+label.IKE.policy=Mode IKE
+label.IPsec.preshared.key=Cl\u00E9 partag\u00E9e IPsec
+label.LB.isolation=R\u00E9partition de charge isol\u00E9e
+label.LUN.number=N\u00B0 LUN
+label.PING.CIFS.password=Mot de passe CIFS PING
+label.PING.CIFS.username=Identifiant CIFS PING
+label.PING.dir=R\u00E9pertoire PING
+label.PING.storage.IP=IP stockage PING
+label.PreSetup=PreSetup
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.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.SR.name=Nom du point de montage
+label.SharedMountPoint=Point de montage partag\u00E9
+label.TFTP.dir=R\u00E9pertoire TFTP
+label.VMFS.datastore=Magasin de donn\u00E9es VMFS
+label.VMs.in.tier=Machines virtuelles dans le tiers
+label.VPC.router.details=D\u00E9tails routeur VPC
+label.VPN.connection=Connexion VPN
+label.VPN.customer.gateway=Passerelle VPN client
+label.VPN.gateway=Passerelle VPN
+label.accept.project.invitation=Accepter l\\'invitation au projet
+label.account=Compte
+label.account.and.security.group=Compte, groupe de s\u00E9curit\u00E9
label.account.id=ID du Compte
label.account.name=Nom du compte
-label.account.specific=Spécifique au compte
-label.account=Compte
+label.account.specific=Sp\u00E9cifique au 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.acquire.new.ip=Acqu\u00E9rir une nouvelle adresse IP
+label.action.attach.disk=Rattacher un disque
+label.action.attach.disk.processing=Rattachement du Disque...
+label.action.attach.iso=Rattacher une image ISO
+label.action.attach.iso.processing=Rattachement de l\\'image ISO
label.action.cancel.maintenance.mode=Annuler le mode maintenance
+label.action.cancel.maintenance.mode.processing=Annulation du 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.change.service=Changer d\\'offre de service
+label.action.change.service.processing=Changement de d\\'offre de service...
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.copy.ISO.processing=Copie de l\\'image ISO...
+label.action.copy.template=Copier un mod\u00E8le
+label.action.copy.template.processing=Copie du Mod\u00E8le...
+label.action.create.template=Cr\u00E9er un mod\u00E8le
+label.action.create.template.from.vm=Cr\u00E9er un mod\u00E8le depuis la VM
+label.action.create.template.from.volume=Cr\u00E9er un mod\u00E8le depuis le volume
+label.action.create.template.processing=Cr\u00E9ation du Mod\u00E8le...
+label.action.create.vm=Cr\u00E9er une VM
+label.action.create.vm.processing=Cr\u00E9ation de la VM...
+label.action.create.volume=Cr\u00E9er un Volume
+label.action.create.volume.processing=Cr\u00E9ation du Volume...
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.IP.range.processing=Suppression de la plage IP...
+label.action.delete.ISO=Supprimer l\\'image ISO
+label.action.delete.ISO.processing=Suppression de l\\'image ISO...
label.action.delete.account=Supprimer un compte
-label.action.delete.cluster.processing=Suppression du Cluster...
+label.action.delete.account.processing=Suppression du compte...
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.cluster.processing=Suppression du Cluster...
+label.action.delete.disk.offering=Supprimer l\\'offre Disque
+label.action.delete.disk.offering.processing=Suppression de l\\'offre Disque...
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 la règle de firewall
-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 la règle de load balancer
-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.firewall=Supprimer la r\u00E8gle de pare-feu
+label.action.delete.firewall.processing=Suppression du Pare-feu...
+label.action.delete.ingress.rule=Supprimer la r\u00E8gle d\\'entr\u00E9e
+label.action.delete.ingress.rule.processing=Suppression de la r\u00E8gle d\\'entr\u00E9e..
+label.action.delete.load.balancer=Supprimer la r\u00E8gle de r\u00E9partition de charge
+label.action.delete.load.balancer.processing=Suppression du r\u00E9partiteur de charge...
+label.action.delete.network=Supprimer le r\u00E9seau
+label.action.delete.network.processing=Suppression du r\u00E9seau...
+label.action.delete.nexusVswitch=Supprimer le Nexus 1000v
+label.action.delete.physical.network=Supprimer le r\u00E9seau physique
label.action.delete.pod=Supprimer le Pod
-label.action.delete.primary.storage.processing=Suppression du stockage primaire...
+label.action.delete.pod.processing=Suppression du pod...
label.action.delete.primary.storage=Supprimer le stockage primaire
-label.action.delete.secondary.storage.processing=Suppression du stockage secondaire...
+label.action.delete.primary.storage.processing=Suppression du stockage primaire...
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.secondary.storage.processing=Suppression du stockage secondaire...
+label.action.delete.security.group=Supprimer le groupe de s\u00E9curit\u00E9
+label.action.delete.security.group.processing=Suppression du groupe de s\u00E9curit\u00E9
+label.action.delete.service.offering=Supprimer l\\'offre de service
+label.action.delete.service.offering.processing=Suppression de l\\'offre de service...
+label.action.delete.snapshot=Supprimer l\\'instantan\u00E9
+label.action.delete.snapshot.processing=Suppression de l\\'instantan\u00E9...
+label.action.delete.system.service.offering=Supprimer l\\'offre syst\u00E8me
+label.action.delete.template=Supprimer le mod\u00E8le
+label.action.delete.template.processing=Suppression du mod\u00E8le...
+label.action.delete.user=Supprimer l\\'utilisateur
+label.action.delete.user.processing=Suppression de l\\'utilisateur...
label.action.delete.volume=Supprimer le volume
-label.action.delete.zone.processing=Suppression de la zone...
+label.action.delete.volume.processing=Suppression du volume...
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.delete.zone.processing=Suppression de la zone...
+label.action.destroy.instance=Supprimer l\\'instance
+label.action.destroy.instance.processing=Suppression de l\\'instance...
+label.action.destroy.systemvm=Supprimer la VM Syst\u00E8me
+label.action.destroy.systemvm.processing=Suppression de la VM Syst\u00E8me...
+label.action.detach.disk=D\u00E9tacher le disque
+label.action.detach.disk.processing=D\u00E9tachement du disque...
+label.action.detach.iso=D\u00E9tacher l\\'image ISO
+label.action.detach.iso.processing=D\u00E9tachement de l\\'image ISO...
+label.action.disable.account=D\u00E9sactiver le compte
+label.action.disable.account.processing=D\u00E9sactivation du compte...
+label.action.disable.cluster=D\u00E9sactiver le cluster
+label.action.disable.cluster.processing=D\u00E9sactivation du cluster...
+label.action.disable.nexusVswitch=D\u00E9sactiver le Nexus 1000v
+label.action.disable.physical.network=D\u00E9sactiver le r\u00E9seau physique
+label.action.disable.pod=D\u00E9sactiver le Pod
+label.action.disable.pod.processing=D\u00E9sactivation du Pod...
+label.action.disable.static.NAT=D\u00E9sactiver le NAT Statique
+label.action.disable.static.NAT.processing=D\u00E9sactivation du NAT Statique...
+label.action.disable.user=D\u00E9sactiver l\\'utilisateur
+label.action.disable.user.processing=D\u00E9sactivation de l\\'utilisateur...
+label.action.disable.zone=D\u00E9sactivation de la zone
+label.action.disable.zone.processing=D\u00E9sactivation de la zone...
+label.action.download.ISO=T\u00E9l\u00E9charger une image ISO
+label.action.download.template=T\u00E9l\u00E9charger un mod\u00E8le
+label.action.download.volume=T\u00E9l\u00E9charger un volume
+label.action.download.volume.processing=T\u00E9l\u00E9chargement du 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.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.host=Modifier l\\'h\u00F4te
+label.action.edit.instance=Modifier l\\'instance
+label.action.edit.network=Modifier le r\u00E9seau
+label.action.edit.network.offering=Modifier l\\'offre de service r\u00E9seau
+label.action.edit.network.processing=Modification du R\u00E9seau...
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.service.offering=Modifier l\\'offre de service
+label.action.edit.template=Modifier le mod\u00E8le
+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.account.processing=Activation du compte...
+label.action.enable.cluster=Activer le cluster
+label.action.enable.cluster.processing=Activation du cluster...
label.action.enable.maintenance.mode=Activer le mode maintenance
-label.action.enable.static.NAT.processing=Activation du NAT Statique...
+label.action.enable.maintenance.mode.processing=Activation du mode maintenance...
+label.action.enable.nexusVswitch=Activer le Nexus 1000v
+label.action.enable.physical.network=Activer le r\u00E9seau physique
+label.action.enable.pod=Activer le Pod
+label.action.enable.pod.processing=Activation du Pod...
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.enable.static.NAT.processing=Activation du NAT Statique...
+label.action.enable.user=Activer l\\'utilisateur
+label.action.enable.user.processing=Activation de l\\'utilisateur...
+label.action.enable.zone=Activer la zone
+label.action.enable.zone.processing=Activation de la zone...
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=Snapshots récurrents
-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.force.reconnect.processing=Reconnexion en cours...
+label.action.generate.keys=G\u00E9n\u00E9rer les cl\u00E9s
+label.action.generate.keys.processing=G\u00E9n\u00E9ration des cl\u00E9s...
+label.action.list.nexusVswitch=Liste des Nexus 1000v
+label.action.lock.account=Verrouiller le compte
+label.action.lock.account.processing=Verrouillage du compte...
+label.action.manage.cluster=G\u00E9rer le Cluster
+label.action.manage.cluster.processing=Gestion du cluster...
+label.action.migrate.instance=Migrer l\\'instance
+label.action.migrate.instance.processing=Migration de l\\'instance...
+label.action.migrate.router=Migration routeur
+label.action.migrate.router.processing=Migration routeur en cours...
+label.action.migrate.systemvm=Migration VM syst\u00E8me
+label.action.migrate.systemvm.processing=Migration VM syst\u00E8me en cours ...
+label.action.reboot.instance=Red\u00E9marrer l\\'instance
+label.action.reboot.instance.processing=Red\u00E9marrage de l\\'instance...
+label.action.reboot.router=Red\u00E9marrer le routeur
+label.action.reboot.router.processing=Red\u00E9marrage du routeur...
+label.action.reboot.systemvm=Red\u00E9marrer la VM Syst\u00E8me
+label.action.reboot.systemvm.processing=Red\u00E9marrage de la VM Syst\u00E8me...
+label.action.recurring.snapshot=Instantan\u00E9s r\u00E9currents
+label.action.register.iso=Enregistrer ISO
+label.action.register.template=Enregistrer mod\u00E8le
+label.action.release.ip=Lib\u00E9rer l\\'adresse IP
+label.action.release.ip.processing=Lib\u00E9ration de l\\'adresse IP...
+label.action.remove.host=Supprimer l\\'h\u00F4te
+label.action.remove.host.processing=Suppression de l\\'h\u00F4te...
+label.action.reset.password=R\u00E9-initialiser le mot de passe
+label.action.reset.password.processing=R\u00E9-initialisation du 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.action.restore.instance=Restaurer l\\'instance
+label.action.restore.instance.processing=Restauration de l\\'instance...
+label.action.start.instance=D\u00E9marrer l\\'instance
+label.action.start.instance.processing=D\u00E9marrage de l\\'instance...
+label.action.start.router=D\u00E9marrer le routeur
+label.action.start.router.processing=D\u00E9marrage du routeur...
+label.action.start.systemvm=D\u00E9marrer la VM syst\u00E8me
+label.action.start.systemvm.processing=D\u00E9marrage de la VM syst\u00E8me...
+label.action.stop.instance=Arr\u00EAter l\\'Instance
+label.action.stop.instance.processing=Arr\u00EAt de l\\'Instance...
+label.action.stop.router=Arr\u00EAter le routeur
+label.action.stop.router.processing=Arr\u00EAt du routeur...
+label.action.stop.systemvm=Arr\u00EAter la VM syst\u00E8me
+label.action.stop.systemvm.processing=Arr\u00EAt de la VM syst\u00E8me...
+label.action.take.snapshot=Prendre un instantan\u00E9
+label.action.take.snapshot.processing=Prise de l\\'instantan\u00E9...
+label.action.unmanage.cluster=Ne plus g\u00E9rer le Cluster
+label.action.unmanage.cluster.processing=Arr\u00EAt de la gestion du Cluster
+label.action.update.OS.preference=Mettre \u00E0 jour les pr\u00E9f\u00E9rences d\\'OS
+label.action.update.OS.preference.processing=Mise \u00E0 jour des pr\u00E9f\u00E9rences d\\'OS...
+label.action.update.resource.count=Mettre \u00E0 jour le compteur des ressources
+label.action.update.resource.count.processing=Mise \u00E0 jour du compteur...
label.actions=Actions
+label.activate.project=Activer projet
label.active.sessions=Sessions actives
+label.add=Ajouter
+label.add.ACL=Ajouter une r\u00E8gle ACL
+label.add.F5.device=Ajouter un F5
+label.add.NiciraNvp.device=Ajouter un contr\u00F4leur Nvp
+label.add.SRX.device=Ajouter un SRX
+label.add.VM.to.tier=Ajouter une machine virtuelle au tiers
+label.add.VPN.gateway=Ajouter une passerelle VPN
label.add.account=Ajouter un compte
+label.add.account.to.project=Ajouter un compte au projet
+label.add.accounts=Ajouter des comptes
+label.add.accounts.to=Ajouter des comptes sur
+label.add.by=Ajout\u00E9 par
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.compute.offering=Ajouter une offre de calcul
+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 une règle firewall
-label.add.host=Ajouter un hôte
-label.add.ingress.rule=Ajouter une règle Ingress
+label.add.egress.rule=Ajouter la r\u00E8gle sortante
+label.add.firewall=Ajouter une r\u00E8gle de pare-feu
+label.add.guest.network=Ajouter un r\u00E9seau d\\'invit\u00E9
+label.add.host=Ajouter un h\u00F4te
+label.add.ingress.rule=Ajouter une r\u00E8gle d\\'entr\u00E9e
label.add.ip.range=Ajouter une plage IP
-label.add.load.balancer=Ajouter un partageur de charge
+label.add.load.balancer=Ajouter un r\u00E9partiteur de charge
label.add.more=Ajouter plus
-label.add.network=Ajouter un réseau
+label.add.netScaler.device=Ajouter un Netscaler
+label.add.network=Ajouter un r\u00E9seau
+label.add.network.ACL=Ajouter une r\u00E8gle d\\'acc\u00E8s r\u00E9seau ACL
+label.add.network.device=Ajouter un \u00E9quipement r\u00E9seau
+label.add.network.offering=Ajouter une offre r\u00E9seau
+label.add.new.F5=Ajouter un F5
+label.add.new.NetScaler=Ajouter un Netscaler
+label.add.new.SRX=Ajouter un SRX
+label.add.new.gateway=Ajouter une nouvelle passerelle
+label.add.new.tier=Ajouter un nouveau tiers
+label.add.physical.network=Ajouter un r\u00E9seau physique
label.add.pod=Ajouter un pod
+label.add.port.forwarding.rule=Ajouter une r\u00E8gle de transfert de port
label.add.primary.storage=Ajouter un stockage primaire
+label.add.resources=Ajouter des ressources
+label.add.route=Ajouter une route
+label.add.rule=Ajouter une r\u00E8gle
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.template=Ajouter un modèle
+label.add.security.group=Ajouter un groupe de s\u00E9curit\u00E9
+label.add.service.offering=Ajouter une offre de service
+label.add.static.nat.rule=Ajouter une r\u00E8gle de NAT statique
+label.add.static.route=Ajouter une route statique
+label.add.system.service.offering=Ajouter une offre de service syst\u00E8me
+label.add.template=Ajouter un mod\u00E8le
+label.add.to.group=Ajouter au groupe
label.add.user=Ajouter un utilisateur
-label.add.vlan=Ajouter un vlan
+label.add.vlan=Ajouter un VLAN
+label.add.vm=Ajouter VM
+label.add.vms=Ajouter VMs
+label.add.vms.to.lb=Ajouter une/des VM(s) \u00E0 la r\u00E8gle de r\u00E9partition de charge
label.add.volume=Ajouter un volume
+label.add.vpc=Ajouter un VPC
+label.add.vpn.customer.gateway=Ajouter une passerelle VPN cliente
+label.add.vpn.user=Ajouter un utilisateur VPN
label.add.zone=Ajouter une zone
-label.add=Ajouter
+label.adding=Ajout
label.adding.cluster=Ajout du Cluster
-label.adding.failed=Echec de l\'ajout
+label.adding.failed=\u00C9chec 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.succeeded=Ajout r\u00E9ussi
+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.additional.networks=R\u00E9seaux additionnels
label.admin=Administrateur
-label.advanced.mode=Mode avancé
-label.advanced.search=Recherche avancée
-label.advanced=Avancé
+label.admin.accounts=Comptes Administrateur
+label.advanced=Avanc\u00E9
+label.advanced.mode=Mode avanc\u00E9
+label.advanced.search=Recherche avanc\u00E9e
+label.agent.password=Mot de passe Agent
+label.agent.username=Identifiant Agent
+label.agree=Accepter
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.allocated=Allou\u00E9
+label.allocation.state=\u00C9tat de l\\'allocation
+label.api.key=Cl\u00E9 d\\'API
+label.apply=Appliquer
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.assign.to.load.balancer=Assigner l\\'instance au r\u00E9partiteur de charge
+label.associated.network=R\u00E9seau associ\u00E9
+label.associated.network.id=ID du r\u00E9seau associ\u00E9
+label.attached.iso=Image ISO attach\u00E9e
+label.availability=Disponibilit\u00E9
+label.availability.zone=Zone de disponibilit\u00E9
label.available=Disponible
+label.available.public.ips=Adresses IP publiques disponibles
label.back=Retour
+label.bandwidth=Bande passante
+label.basic=Basique
label.basic.mode=Mode basique
-label.bootable=Bootable
-label.broadcast.domain.type=Type de domaine de broadcast
+label.bootable=Amor\u00E7able
+label.broadcast.domain.range=Plage du domaine multi-diffusion
+label.broadcast.domain.type=Type de domaine de multi-diffusion
+label.broadcast.uri=URI multi-diffusion
label.by.account=Par compte
-label.by.availability=Par disponibilité
+label.by.availability=Par disponibilit\u00E9
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.role=Par r\u00F4le
+label.by.start.date=Par date de d\u00E9but
+label.by.state=Par \u00E9tat
+label.by.traffic.type=Par type de trafic
label.by.type=Par type
+label.by.type.id=Par type d\\'ID
label.by.zone=Par zone
-label.bytes.received=Octets reçus
-label.bytes.sent=Octets envoyés
+label.bytes.received=Octets re\u00E7us
+label.bytes.sent=Octets envoy\u00E9s
label.cancel=Annuler
+label.capacity=Capacit\u00E9
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.change.service.offering=Modifier l\\'offre de service
+label.change.value=Modifier la valeur
+label.character=Caract\u00E8re
+label.checksum=Somme de contr\u00F4le MD5
+label.cidr=CIDR
+label.cidr.account=CIDR ou Compte/Groupe de s\u00E9curit\u00E9
+label.cidr.list=CIDR Source
+label.clean.up=Nettoyage
+label.clear.list=Purger la liste
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.cloud.console=Console d\\'Administration du Cloud
+label.cloud.managed=G\u00E9r\u00E9 par Cloud.com
label.cluster=Cluster
+label.cluster.name=Nom du cluster
+label.cluster.type=Type de Cluster
+label.clusters=Clusters
+label.clvm=CLVM
label.code=Code
+label.community=Communaut\u00E9
+label.compute=Processeur
+label.compute.and.storage=Processeur et Stockage
+label.compute.offering=Offre de calcul
+label.compute.offerings=Offres de calcul
+label.configuration=Configuration
+label.configure=Configurer
+label.configure.network.ACLs=Configurer les r\u00E8gles d\\'acc\u00E8s r\u00E9seau ACL
+label.configure.vpc=Configurer le VPC
+label.confirm.password=Confirmer le mot de passe
label.confirmation=Confirmation
-label.cpu.allocated.for.VMs=CPU alloué aux VMs
-label.cpu.allocated=CPU alloué
-label.cpu.utilized=CPU utilisé
+label.congratulations=F\u00E9licitations \!
+label.conserve.mode=Conserver le mode
+label.console.proxy=Console proxy
+label.continue=Continuer
+label.continue.basic.install=Continuer avec l\\'installation basique
+label.corrections.saved=Modifications enregistr\u00E9es
label.cpu=CPU
-label.created=Créé
+label.cpu.allocated=CPU allou\u00E9e
+label.cpu.allocated.for.VMs=CPU allou\u00E9e aux VMs
+label.cpu.mhz=CPU (en MHz)
+label.cpu.utilized=CPU utilis\u00E9e
+label.create.VPN.connection=Cr\u00E9er une connexion VPN
+label.create.project=Cr\u00E9er un projet
+label.create.template=Cr\u00E9er un mod\u00E8le
+label.created=Cr\u00E9\u00E9
+label.created.by.system=Cr\u00E9\u00E9 par le syst\u00E8me
label.cross.zones=Multi Zones
-label.custom.disk.size=Taille de disque personnalisée
+label.custom.disk.size=Taille de disque personnalis\u00E9e
label.daily=Quotidien
-label.data.disk.offering=Offre de disque de données
+label.data.disk.offering=Offre de disque de donn\u00E9es
label.date=Date
label.day.of.month=Jour du mois
label.day.of.week=Jour de la semaine
+label.dead.peer.detection=D\u00E9tection de pair mort
+label.decline.invitation=Refuser l\\'invitation
+label.dedicated=D\u00E9di\u00E9
+label.default=Par d\u00E9faut
+label.default.use=Utilisation par d\u00E9faut
+label.default.view=Vue par d\u00E9faut
label.delete=Supprimer
-label.deleting.failed=Suppression échouée
+label.delete.F5=Supprimer F5
+label.delete.NetScaler=Supprimer Netscaler
+label.delete.NiciraNvp=Supprimer un contr\u00F4leur Nvp
+label.delete.SRX=Supprimer SRX
+label.delete.VPN.connection=Supprimer la connexion VPN
+label.delete.VPN.customer.gateway=Supprimer la passerelle VPN client
+label.delete.VPN.gateway=Supprimer la passerelle VPN
+label.delete.gateway=Supprimer la passerelle
+label.delete.project=Supprimer projet
+label.delete.vpn.user=Supprimer l\\'utilisateur VPN
+label.deleting.failed=Suppression \u00E9chou\u00E9e
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.destination.physical.network.id=Identifiant du r\u00E9seau physique de destination
+label.destination.zone=Zone de destination
+label.destroy=D\u00E9truire
+label.destroy.router=Supprimer le routeur
+label.detaching.disk=D\u00E9tacher le disque
+label.details=D\u00E9tails
+label.device.id=ID du p\u00E9riph\u00E9rique
+label.devices=Machines
+label.dhcp=DHCP
+label.direct.ips=Adresses IP du r\u00E9seau partag\u00E9
+label.disable.provider=D\u00E9sactiver ce fournisseur
+label.disable.vpn=D\u00E9sactiver le VPN
+label.disabled=D\u00E9sactiv\u00E9
+label.disabling.vpn.access=D\u00E9sactiver l\\'acc\u00E8s VPN
+label.disk.allocated=Disque Allou\u00E9
label.disk.offering=Offre de Disque
-label.disk.size.gb=Taille du disque (en Go)
label.disk.size=Taille du disque
+label.disk.size.gb=Taille du disque (en Go)
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.display.name=Nom d\\'affichage
+label.display.text=Texte affich\u00E9
+label.dns=DNS
+label.dns.1=DNS 1
+label.dns.2=DNS 2
+label.domain=Domaine
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.domain.router=Routeur du domaine
+label.domain.suffix=Suffixe de domaine DNS (i.e., xyz.com)
+label.done=Termin\u00E9
+label.double.quotes.are.not.allowed=Les guillemets ne sont pas autoris\u00E9es
+label.download.progress=Progression du t\u00E9l\u00E9chargement
+label.drag.new.position=D\u00E9placer sur une autre position
label.edit=Modifier
+label.edit.lb.rule=Modifier la r\u00E8gle LB
+label.edit.network.details=Modifier les param\u00E8tres r\u00E9seau
+label.edit.project.details=Modifier les d\u00E9tails du projet
+label.edit.tags=Modifier les balises
+label.edit.traffic.type=Modifier le type de trafic
+label.edit.vpc=Modifier le VPC
+label.egress.rule=R\u00E8gle sortante
+label.egress.rules=R\u00E8gles de sortie
+label.elastic=\u00C9lastique
+label.elastic.IP=IP extensible
+label.elastic.LB=R\u00E9partition de charge extensible
label.email=Email
-label.enabling.vpn.access=Activation de l\'accès VPN
+label.enable.provider=Activer le fournisseur
+label.enable.s3=Activer le stockage secondaire de type S3
+label.enable.swift=Activer Swift
+label.enable.vpn=Activer VPN
label.enabling.vpn=Activation du VPN
+label.enabling.vpn.access=Activation de l\\'acc\u00E8s VPN
+label.end.IP=R\u00E9silier l\\'IP
label.end.port=Port de fin
-label.endpoint.or.operation=Terminaison ou Opération
-label.error.code=Code d\'erreur
+label.end.reserved.system.IP=Adresse IP de fin r\u00E9serv\u00E9e Syst\u00E8me
+label.end.vlan=VLAN de fin
+label.endpoint.or.operation=Terminaison ou Op\u00E9ration
+label.enter.token=Entrez le jeton unique
label.error=Erreur
-label.esx.host=Hôte ESX/ESXi
+label.error.code=Code d\\'erreur
+label.esx.host=H\u00F4te ESX/ESXi
label.example=Exemple
-label.failed=Echoué
-label.featured=Sponsorisé
-label.firewall=Parefeu
-label.first.name=Prénom
+label.f5=F5
+label.failed=\u00C9chou\u00E9
+label.featured=Sponsoris\u00E9
+label.fetch.latest=Rafra\u00EEchir
+label.filterBy=Filtrer par
+label.firewall=Pare-feu
+label.first.name=Pr\u00E9nom
label.format=Format
label.friday=Vendredi
label.full=Complet
+label.full.path=Chemin complet
label.gateway=Passerelle
-label.general.alerts=Alertes générales
-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.general.alerts=Alertes g\u00E9n\u00E9rales
+label.generating.url=G\u00E9n\u00E9ration de l\\'URL
+label.go.step.2=Aller \u00E0 l\\'\u00E9tape 2
+label.go.step.3=Aller \u00E0 l\\'\u00E9tape 3
+label.go.step.4=Aller \u00E0 l\\'\u00E9tape 4
+label.go.step.5=Aller \u00E0 l\\'\u00E9tape 5
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.group.optional=Groupe (optionnel)
+label.guest=Invit\u00E9
+label.guest.cidr=CIDR invit\u00E9
+label.guest.end.ip=Adresse IP de fin pour les invit\u00E9s
+label.guest.gateway=Passerelle pour les invit\u00E9s
+label.guest.ip=Adresse IP des invit\u00E9s
+label.guest.ip.range=Plage d\\'adresses IP des invit\u00E9s
+label.guest.netmask=Masque de r\u00E9seau des invit\u00E9s
+label.guest.networks=R\u00E9seaux d\\'invit\u00E9
+label.guest.start.ip=Adresse IP de d\u00E9but pour les invit\u00E9s
+label.guest.traffic=Trafic invit\u00E9
+label.guest.type=Type d\\'invit\u00E9
+label.ha.enabled=Haute disponibilit\u00E9 activ\u00E9e
label.help=Aide
-label.host.alerts=Alertes des hôtes
-label.host.name=Nom d\'hôte
-label.host=Serveur
-label.hosts=Serveurs
-label.hourly=A l\'heure
-label.hypervisor.type=Type d\'hyperviseur
+label.hide.ingress.rule=Cacher la r\u00E8gle d\\'entr\u00E9e
+label.hints=Astuces
+label.host=H\u00F4te
+label.host.MAC=Adresse MAC h\u00F4te
+label.host.alerts=Alertes des h\u00F4tes
+label.host.name=Nom d\\'h\u00F4te
+label.host.tags=\u00C9tiquettes d\\'h\u00F4te
+label.hosts=H\u00F4tes
+label.hourly=Chaque heure
label.hypervisor=Hyperviseur
+label.hypervisor.capabilities=Fonctions hyperviseur
+label.hypervisor.type=Type d\\'hyperviseur
+label.hypervisor.version=Version 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.ingress.rule=R\u00E8gle d\\'entr\u00E9e
+label.initiated.by=Initi\u00E9 par
+label.installWizard.addClusterIntro.subtitle=Qu\\'est ce qu\\'un cluster ?
+label.installWizard.addClusterIntro.title=Ajoutons un cluster
+label.installWizard.addHostIntro.subtitle=Qu\\'est ce qu\\'un h\u00F4te ?
+label.installWizard.addHostIntro.title=Ajoutons un h\u00F4te
+label.installWizard.addPodIntro.subtitle=Qu\\'est ce qu\\'un pod ?
+label.installWizard.addPodIntro.title=Ajoutons un pod
+label.installWizard.addPrimaryStorageIntro.subtitle=Qu\\'est ce que le stockage primaire ?
+label.installWizard.addPrimaryStorageIntro.title=Ajoutons du stockage primaire
+label.installWizard.addSecondaryStorageIntro.subtitle=Qu\\'est ce que le stockage secondaire ?
+label.installWizard.addSecondaryStorageIntro.title=Ajoutons du stockage secondaire
+label.installWizard.addZone.title=Ajouter une zone
+label.installWizard.addZoneIntro.subtitle=Qu\\'est ce qu\\'une zone ?
+label.installWizard.addZoneIntro.title=Ajoutons une zone
+label.installWizard.click.launch=Appuyer sur le bouton d\u00E9marrer.
+label.installWizard.subtitle=Ce tutoriel vous aidera \u00E0 configurer votre installation CloudStack&\#8482;
+label.installWizard.title=Bonjour et bienvenue dans CloudStack&\#8482;
label.instance=Instance
+label.instance.limits=Limites des instances
+label.instance.name=Nom de l\\'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.internal.name=Nom interne
+label.interval.type=Type d\\'intervalle
+label.introduction.to.cloudstack=Introduction \u00E0 CloudStack&\#8482;
label.invalid.integer=Nombre entier invalide
label.invalid.number=Nombre invalide
+label.invitations=Invitations
+label.invite=Inviter
+label.invite.to=Inviter sur
+label.invited.accounts=Comptes invit\u00E9s
+label.ip=IP
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.ip.ranges=Plages IP
+label.ipaddress=Adresse IP
label.ips=IPs
-label.is.default=Est par défaut
-label.is.shared=Est partagé
-label.is.system=Type système
+label.is.default=Est par d\u00E9faut
+label.is.redundant.router=Redondant
+label.is.shared=Est partag\u00E9
+label.is.system=Est Syst\u00E8me
label.iscsi=iSCSI
-label.iso.boot=Démarrage par ISO
label.iso=ISO
-label.isolation.mode=Mode d\'isolation
+label.iso.boot=D\u00E9marrage par ISO
+label.isolated.networks=R\u00E9seaux isol\u00E9s
+label.isolation.method=M\u00E9thode de s\u00E9paration
+label.isolation.mode=Mode d\\'isolation
+label.isolation.uri=URI d\\'isolation
+label.item.listing=Liste des \u00E9l\u00E9ments
label.keep=Conserver
-label.lang.chinese=Chinois (simplifié)
+label.key=Clef
+label.keyboard.type=Type de clavier
+label.kvm.traffic.label=Libell\u00E9 pour le trafic KVM
+label.label=Libell\u00E9
+label.lang.brportugese=Portuguais Br\u00E9sil
+label.lang.chinese=Chinois (simplifi\u00E9)
label.lang.english=Anglais
+label.lang.french=Fran\u00E7ais
label.lang.japanese=Japonais
-label.lang.korean=Coréen
+label.lang.russian=Russe
label.lang.spanish=Espagnol
-label.last.disconnected=Dernière Déconnexion
-label.last.name=Nom de famille
+label.last.disconnected=Derni\u00E8re D\u00E9connexion
+label.last.name=Nom
+label.latest.events=Derniers \u00E9v\u00E9nements
+label.launch=D\u00E9marrer
+label.launch.vm=D\u00E9marrer VM
+label.launch.zone=D\u00E9marrer la zone
+label.least.connections=Le moins de connexions
label.level=Niveau
label.linklocal.ip=Adresse IP de lien local
-label.load.balancer=Partageur de charge
+label.load.balancer=R\u00E9partiteur de charge
+label.load.balancing=R\u00E9partition de charge
+label.load.balancing.policies=R\u00E8gles de r\u00E9partition de charge
label.loading=Chargement en cours
label.local=Local
-# label.local.storage.enabled=Local storage enabled
+label.local.storage=Stockage local
+label.local.storage.enabled=Stockage local activ\u00E9
label.login=Connexion
-label.logout=Déconnexion
+label.logout=D\u00E9connexion
label.lun=LUN
-label.manage=Géré
+label.make.project.owner=Devenir propri\u00E9taire du projet
+label.manage=G\u00E9r\u00E9
+label.manage.resources=G\u00E9rer les ressources
+label.management=Administration
+label.management.ips=Adresses IP de gestion
+label.max.guest.limit=Nombre maximum d\\'invit\u00E9s
+label.max.networks=R\u00E9seaux Max.
+label.max.public.ips=Max. IP publiques
+label.max.snapshots=Max instantan\u00E9es
+label.max.templates=Max. mod\u00E8les
+label.max.vms=Max. VMs utilisateur
+label.max.volumes=Max. volumes
+label.max.vpcs=Max. VPCs
label.maximum=Maximum
-label.memory.allocated=Mémoire allouée
-label.memory.total=Mémoire totale
-label.memory.used=Mémoire utilisée
-label.memory=Mémoire (en MB)
+label.may.continue=Vous pouvez continuer.
+label.memory=M\u00E9moire (en Mo)
+label.memory.allocated=M\u00E9moire allou\u00E9e
+label.memory.mb=M\u00E9moire (en MB)
+label.memory.total=M\u00E9moire totale
+label.memory.used=M\u00E9moire utilis\u00E9e
label.menu.accounts=Comptes
label.menu.alerts=Alertes
-label.menu.all.accounts=Tout les comptes
+label.menu.all.accounts=Tous 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.community.isos=ISO de la communaut\u00E9
+label.menu.community.templates=Mod\u00E8les de la communaut\u00E9
label.menu.configuration=Configuration
label.menu.dashboard=Tableau de bord
-label.menu.destroyed.instances=Instances détruites
+label.menu.destroyed.instances=Instances d\u00E9truites
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.events=\u00C9v\u00E9nements
+label.menu.featured.isos=ISOs Sponsoris\u00E9es
+label.menu.featured.templates=Mod\u00E8les sponsoris\u00E9s
+label.menu.global.settings=Param\u00E8tres globaux
+label.menu.infrastructure=Infrastructure
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.my.templates=Mes mod\u00E8les
+label.menu.network=R\u00E9seau
+label.menu.network.offerings=Offres de Service R\u00E9seau
label.menu.physical.resources=Ressources physiques
label.menu.running.instances=Instances actives
-label.menu.security.groups=Groupes de sécurité
+label.menu.security.groups=Groupes de s\u00E9curit\u00E9
label.menu.service.offerings=Offres de Service
-label.menu.snapshots=Instantanés
-label.menu.stopped.instances=Instances Arrêtées
+label.menu.snapshots=Instantan\u00E9s
+label.menu.stopped.instances=Instances Arr\u00EAt\u00E9es
label.menu.storage=Stockage
-label.menu.system.vms=\ VMs Systèmes
-label.menu.system=Système
-label.menu.templates=Modèles
+label.menu.system=Syst\u00E8me
+label.menu.system.service.offerings=Offres syst\u00E8me
+label.menu.system.vms=\ VMs Syst\u00E8mes
+label.menu.templates=Mod\u00E8les
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.migrate.instance.to=Migrer l\\'instance vers
+label.migrate.instance.to.host=Migration de l\\'instance sur un autre h\u00F4te
+label.migrate.instance.to.ps=Migration de l\\'instance sur un autre stockage primaire
+label.migrate.router.to=Migrer le routeur vers
+label.migrate.systemvm.to=Migrer la VM syst\u00E8me vers
+label.migrate.to.host=Migrer vers un h\u00F4te
+label.migrate.to.storage=Migrer vers un stockage
+label.migrate.volume=Migration du volume vers un autre stockage primaire
label.minimum=Minimum
label.minute.past.hour=minute(s)
label.monday=Lundi
label.monthly=Mensuel
-label.more.templates=Plus de modèles
+label.more.templates=Plus de mod\u00E8les
+label.move.down.row=Descendre d\\'un cran
+label.move.to.bottom=D\u00E9placer en bas
+label.move.to.top=Placer au dessus
+label.move.up.row=Monter d\\'un cran
label.my.account=Mon compte
-label.name.optional=Nom (optionnel)
+label.my.network=Mon r\u00E9seau
+label.my.templates=Mes mod\u00E8les
label.name=Nom
-label.netmask=Masque de réseau
-label.network.desc=Description réseau
+label.name.optional=Nom (optionnel)
+label.nat.port.range=Plage de port NAT
+label.netScaler=NetScaler
+label.netmask=Masque de r\u00E9seau
+label.network=R\u00E9seau
+label.network.ACL=R\u00E8gles d\\'acc\u00E8s r\u00E9seau ACL
+label.network.ACL.total=Total R\u00E8gles d\\'acc\u00E8s r\u00E9seau
+label.network.ACLs=R\u00E8gles d\\'acc\u00E8s r\u00E9seau
+label.network.desc=Description r\u00E9seau
+label.network.device=\u00C9quipement R\u00E9seau
+label.network.device.type=Type d\\'\u00E9quipement r\u00E9seau
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.network.domain.text=Domaine r\u00E9seau
+label.network.id=ID r\u00E9seau
+label.network.label.display.for.blank.value=Utiliser la passerelle par d\u00E9faut
+label.network.name=Nom du r\u00E9seau
+label.network.offering=Offre de Service R\u00E9seau
+label.network.offering.display.text=Texte affich\u00E9 d\\'Offre de R\u00E9seau
+label.network.offering.id=ID de l\\'Offre de Service R\u00E9seau
+label.network.offering.name=Nom de l\\'Offre de Service R\u00E9seau
+label.network.rate=D\u00E9bit R\u00E9seau
+label.network.rate.megabytes=D\u00E9bit r\u00E9seau (Mo/s)
+label.network.read=Lecture r\u00E9seau
+label.network.service.providers=Fournisseurs de service r\u00E9seau
+label.network.type=Type de r\u00E9seau
+label.network.write=\u00C9criture r\u00E9seau
+label.networking.and.security=R\u00E9seau et s\u00E9curit\u00E9
+label.networks=R\u00E9seaux
+label.new=Nouveau
label.new.password=Nouveau mot de passe
+label.new.project=Nouveau projet
+label.new.vm=Nouvelle VM
label.next=Suivant
+label.nexusVswitch=Nexus 1000v
+label.nfs=NFS
label.nfs.server=Serveur NFS
label.nfs.storage=Stockage NFS
-label.nfs=NFS
+label.nic.adapter.type=Type de carte r\u00E9seau
+label.nicira.controller.address=Adresse du contr\u00F4leur
+label.nicira.l3gatewayserviceuuid=Uuid du service passerelle L3
+label.nicira.transportzoneuuid=Uuid de la Zone Transport
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.no.actions=Aucune action disponible
+label.no.alerts=Aucune alerte r\u00E9cente
+label.no.data=Aucune donn\u00E9e
+label.no.errors=Aucune erreur r\u00E9cente
+label.no.isos=Aucun ISOs disponible
+label.no.items=Aucun \u00E9l\u00E9ment disponible
+label.no.security.groups=Aucun groupe de s\u00E9curit\u00E9 disponible
+label.no.thanks=Non merci
label.none=Aucun
label.not.found=Introuvable
-label.num.cpu.cores=Nombre de c\u0153urs de processeur
+label.notifications=Messages
+label.num.cpu.cores=Nombre de coeurs de processeur
+label.number.of.clusters=Nombre de clusters
+label.number.of.hosts=Nombre d\\'H\u00F4tes
+label.number.of.pods=Nombre de Pods
+label.number.of.system.vms=Nombre de VM Syst\u00E8me
+label.number.of.virtual.routers=Nombre de routeurs virtuels
+label.number.of.zones=Nombre de zones
label.numretries=Nombre de tentatives
-label.offer.ha=Offrir la haute disponibilité
+label.ocfs2=OCFS2
+label.offer.ha=Offrir la haute disponibilit\u00E9
+label.ok=OK
label.optional=Facultatif
-label.os.preference=Préférence du OS
+label.order=Ordre
+label.os.preference=Pr\u00E9f\u00E9rence 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=Propriétaire du domaine
-label.parent.domain=Domaine Parent
-label.password.enabled=Mot de passe activé
+label.owned.public.ips=Adresses IP Publiques d\u00E9tenues
+label.owner.account=Propri\u00E9taire du compte
+label.owner.domain=Propri\u00E9taire du domaine
+label.parent.domain=Parent du Domaine
label.password=Mot de passe
+label.password.enabled=Mot de passe activ\u00E9
label.path=Chemin
-label.please.wait=Patientez s\'il vous plait
+label.perfect.forward.secrecy=Confidentialit\u00E9 persistante
+label.physical.network=R\u00E9seau physique
+label.physical.network.ID=Identifiant du r\u00E9seau physique
+label.please.specify.netscaler.info=Renseigner les informations sur le Netscaler
+label.please.wait=Patientez s\\'il vous plait
label.pod=Pod
+label.pod.name=Nom du pod
+label.pods=Pods
label.port.forwarding=Redirection de port
+label.port.forwarding.policies=R\u00E8gles de transfert 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.prev=Pr\u00E9c\u00E9dent
+label.previous=Retour
+label.primary.allocated=Stockage primaire allou\u00E9
+label.primary.network=R\u00E9seau primaire
+label.primary.storage=Premier stockage
+label.primary.storage.count=Groupes de stockage primaire
+label.primary.used=Stockage primaire utilis\u00E9
+label.private.Gateway=Passerelle priv\u00E9e
+label.private.interface=Interface priv\u00E9e
+label.private.ip=Adresse IP Priv\u00E9e
+label.private.ip.range=Plage d\\'adresses IP Priv\u00E9es
+label.private.ips=Adresses IP Priv\u00E9es
+label.private.network=R\u00E9seau priv\u00E9
+label.private.port=Port priv\u00E9
+label.private.zone=Zone Priv\u00E9e
+label.privatekey=Cl\u00E9 priv\u00E9e PKCS\#8
+label.project=Projet
+label.project.dashboard=Tableau de bord projet
+label.project.id=ID projet
+label.project.invite=Inviter sur le projet
+label.project.name=Nom du projet
+label.project.view=Vue projet
+label.projects=Projets
label.protocol=Protocole
+label.providers=Fournisseurs
+label.public=Publique
label.public.interface=Interface publique
label.public.ip=Adresse IP publique
label.public.ips=Adresses IP publiques
+label.public.network=R\u00E9seau public
label.public.port=Port public
+label.public.traffic=Trafic public
label.public.zone=Zone publique
-label.public=Publique
-label.recent.errors=Erreurs récentes
+label.purpose=R\u00F4le
+label.quickview=Aper\u00E7u
+label.reboot=Red\u00E9marrer
+label.recent.errors=Erreurs r\u00E9centes
+label.redundant.router=Routeur redondant
+label.redundant.router.capability=Router redondant
+label.redundant.state=\u00C9tat de la redondance
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.remind.later=Rappeler moi plus tard
+label.remove.ACL=Supprimer une r\u00E8gle ACL
+label.remove.egress.rule=Supprimer la r\u00E8gle sortante
+label.remove.from.load.balancer=Supprimer l\\'instance du r\u00E9partiteur de charge
+label.remove.ingress.rule=Supprimer la r\u00E8gle entrante
+label.remove.ip.range=Supprimer la plage IP
+label.remove.pf=Supprimer la r\u00E8gle de transfert de port
+label.remove.project.account=Supprimer le compte projet
+label.remove.rule=Supprimer la r\u00E8gle
+label.remove.static.nat.rule=Supprimer le NAT statique
+label.remove.static.route=Supprimer une route statique
+label.remove.tier=Supprimer le tiers
+label.remove.vm.from.lb=Supprimer la VM de la r\u00E8gle de r\u00E9partition de charge
+label.remove.vpc=Supprimer le VPC
+label.removing=Suppression
+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.reserved.system.gateway=Passerelle r\u00E9serv\u00E9e Syst\u00E8me
+label.reserved.system.ip=Adresse IP Syst\u00E8me r\u00E9serv\u00E9e
+label.reserved.system.netmask=Masque de sous-r\u00E9seau r\u00E9serv\u00E9 Syst\u00E8me
+label.reset.VPN.connection=R\u00E9-initialiser la connexion VPN
label.resource=Ressource
+label.resource.limits=Limite des ressources
+label.resource.state=\u00C9tat des ressources
label.resources=Ressources
-label.role=Rôle
+label.restart.network=Red\u00E9marrage du r\u00E9seau
+label.restart.required=Red\u00E9marrage n\u00E9cessaire
+label.restart.vpc=Red\u00E9marrer le VPC
+label.restore=Restaurer
+label.review=Revoir
+label.revoke.project.invite=R\u00E9voquer l\\'invitation
+label.role=R\u00F4le
+label.root.disk.controller=Contr\u00F4leur de disque principal
label.root.disk.offering=Offre de disque racine
+label.round.robin=Al\u00E9atoire
+label.rules=R\u00E8gles
label.running.vms=VMs actives
+label.s3.access_key=Cl\u00E9 d\\'Acc\u00E8s
+label.s3.bucket=Seau
+label.s3.connection_timeout=D\u00E9lai d\\'expiration de connexion
+label.s3.endpoint=Terminaison
+label.s3.max_error_retry=Nombre d\\'essai en erreur max.
+label.s3.secret_key=Cl\u00E9 Priv\u00E9e
+label.s3.socket_timeout=D\u00E9lai d\\'expiration de la socket
+label.s3.use_https=Utiliser HTTPS
label.saturday=Samedi
label.save=Sauvegarder
-label.saving.processing=Sauvegarde en cours....
-label.scope=Portée
+label.save.and.continue=Enregistrer et continuer
+label.saving.processing=Sauvegarde en cours...
+label.scope=Port\u00E9e
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.secondary.storage.count=Groupes de stockage secondaire
+label.secondary.storage.vm=VM stockage secondaire
+label.secondary.used=Stockage secondaire utilis\u00E9
+label.secret.key=Cl\u00E9 priv\u00E9e
+label.security.group=Groupe de s\u00E9curit\u00E9
+label.security.group.name=Nom du groupe de s\u00E9curit\u00E9
+label.security.groups=Groupes de s\u00E9curit\u00E9
+label.security.groups.enabled=Groupes de s\u00E9curit\u00E9 Activ\u00E9s
+label.select=S\u00E9lectionner
+label.select-view=S\u00E9lectionner la vue
+label.select.a.template=S\u00E9lectionner un mod\u00E8le
+label.select.a.zone=S\u00E9lectionner une zone
+label.select.instance=S\u00E9lectionner une instance
+label.select.instance.to.attach.volume.to=S\u00E9lectionner l\\'instance \u00E0 laquelle rattacher ce volume
+label.select.iso.or.template=S\u00E9lectionner un ISO ou un mod\u00E8le
+label.select.offering=S\u00E9lectionner une offre
+label.select.project=S\u00E9lectionner un projet
+label.select.tier=S\u00E9lectionner le tiers
+label.select.vm.for.static.nat=S\u00E9lectionner une VM pour le NAT statique
+label.sent=Envoy\u00E9
label.server=Serveur
+label.service.capabilities=Fonctions disponibles
label.service.offering=Offre de Service
-label.system.service.offering=Offre de Service Système
-label.session.expired=Session expiré
+label.session.expired=Session expir\u00E9e
+label.set.up.zone.type=Configurer le type de zone
+label.setup=Configuration
+label.setup.network=Configurer le r\u00E9seau
+label.setup.zone=Configurer la zone
label.shared=En partage
+label.show.ingress.rule=Montrer la r\u00E8gle d\\'entr\u00E9e
+label.shutdown.provider=\u00C9teindre ce fournisseur
+label.site.to.site.VPN=VPN Site-\u00E0-Site
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=Configurer un snapshot récurrent
-label.snapshot=Instantané
-label.snapshots=Instantanés
+label.skip.guide=J\\'ai d\u00E9j\u00E0 utilis\u00E9 CloudStack avant, passer ce tutoriel
+label.snapshot=Instantan\u00E9
+label.snapshot.limits=Limites d\\'instantan\u00E9
+label.snapshot.name=Nom de l\\'instantan\u00E9
+label.snapshot.s=Instantan\u00E9(s)
+label.snapshot.schedule=Configurer un instantan\u00E9 r\u00E9current
+label.snapshots=Instantan\u00E9s
+label.source=Origine
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.specify.IP.ranges=Sp\u00E9cifier des plages IP
+label.specify.vlan=Pr\u00E9ciser le VLAN
+label.srx=SRX
+label.start.IP=D\u00E9marrer l\\'IP
+label.start.port=Port de d\u00E9but
+label.start.reserved.system.IP=Adresse IP de d\u00E9but r\u00E9serv\u00E9e Syst\u00E8me
+label.start.vlan=VLAN de d\u00E9part
+label.state=\u00C9tat
+label.static.nat=NAT Statique
+label.static.nat.enabled=NAT statique activ\u00E9
+label.static.nat.to=NAT Statique vers
+label.static.nat.vm.details=D\u00E9tails des NAT statique VM
label.statistics=Statistiques
label.status=Statut
-label.step.1.title=Etape 1 \: Sélectionnez un modèle
-label.step.1=Étape 1
-label.step.2.title=Etape 2\: Offre de Service
-label.step.2=Étape 2
-label.step.3.title=Etape 3\: Sélectionnez une offre de service
-label.step.3=Étape 3
-label.step.4.title=Etape 4\: Réseau
-label.step.4=Étape 4
-label.step.5.title=Etape 5\: Vérification
-label.step.5=Étape 5
-label.stopped.vms=VMs arrêtés
-label.storage.type=Type de stockage
+label.step.1=\u00C9tape 1
+label.step.1.title=\u00C9tape 1 \: S\u00E9lectionnez un mod\u00E8le
+label.step.2=\u00C9tape 2
+label.step.2.title=\u00C9tape 2 \: Offre de Service
+label.step.3=\u00C9tape 3
+label.step.3.title=\u00C9tape 3 \: S\u00E9lectionnez une offre de service
+label.step.4=\u00C9tape 4
+label.step.4.title=\u00C9tape 4 \: R\u00E9seau
+label.step.5=\u00C9tape 5
+label.step.5.title=\u00C9tape 5 \: V\u00E9rification
+label.stickiness=Fid\u00E9lit\u00E9
+label.sticky.cookie-name=Nom du cookie
+label.sticky.domain=Domaine
+label.sticky.expire=Expiration
+label.sticky.holdtime=Temps de pause
+label.sticky.indirect=Indirect
+label.sticky.length=Longueur
+label.sticky.mode=Mode
+label.sticky.nocache=Pas de cache
+label.sticky.postonly=Apr\u00E8s seulement
+label.sticky.prefix=Pr\u00E9fixe
+label.sticky.request-learn=Apprendre la requ\u00EAte
+label.sticky.tablesize=Taille du tableau
+label.stop=Arr\u00EAter
+label.stopped.vms=VMs arr\u00EAt\u00E9es
label.storage=Stockage
+label.storage.tags=\u00C9tiquettes de stockage
+label.storage.traffic=Trafic stockage
+label.storage.type=Type de stockage
+label.subdomain.access=Acc\u00E8s sous-domaine
label.submit=Envoyer
-label.submitted.by=[Soumis par\: ]
-label.succeeded=Réussi
+label.submitted.by=[Soumis par \: ]
+label.succeeded=R\u00E9ussi
label.sunday=Dimanche
-label.system.capacity=Capacité 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.super.cidr.for.guest.networks=Super CIDR pour les r\u00E9seaux invit\u00E9s
+label.supported.services=Services support\u00E9s
+label.supported.source.NAT.type=Type de NAT support\u00E9
+label.suspend.project=Suspendre projet
+label.system.capacity=Capacit\u00E9 syst\u00E8me
+label.system.offering=Offre de syst\u00E8me
+label.system.service.offering=Offre de Service Syst\u00E8me
+label.system.vm=VM Syst\u00E8me
+label.system.vm.type=Type de VM syst\u00E8me
+label.system.vms=\ VMs Syst\u00E8mes
+label.system.wide.capacity=Capacit\u00E9 globale
+label.tagged=\u00C9tiquet\u00E9
+label.tags=\u00C9tiquette
+label.target.iqn=Cible IQN
+label.task.completed=T\u00E2che termin\u00E9e
+label.template=Mod\u00E8le
+label.template.limits=Limites de mod\u00E8le
+label.theme.default=Th\u00E8me par d\u00E9faut
+label.theme.grey=Personnalis\u00E9 - Gris
+label.theme.lightblue=Personnalis\u00E9 - Bleu clair
label.thursday=Jeudi
-label.time.zone=Fuseau horaire
+label.tier=Tiers
+label.tier.details=D\u00E9tails du tiers
label.time=Temps
-label.timeout.in.second = Timeout (secondes)
+label.time.zone=Fuseau horaire
+label.timeout=D\u00E9lai d\\'expiration
+label.timeout.in.second=D\u00E9lai d\\'expiration (secondes)
label.timezone=Fuseau horaire
-label.total.cpu=Capacité Totale en CPU
+label.token=Jeton unique
+label.total.CPU=Capacit\u00E9 totale en CPU
+label.total.cpu=Capacit\u00E9 Totale en CPU
+label.total.hosts=Total H\u00F4tes
+label.total.memory=Total m\u00E9moire
+label.total.of.ip=Total adresses IP
+label.total.of.vm=Total VM
+label.total.storage=Total stockage
label.total.vms=Nombre total de VMs
-label.traffic.type=Type de Traffic
+label.traffic.label=Libell\u00E9 de trafic
+label.traffic.type=Type de Trafic
+label.traffic.types=Types de trafic
label.tuesday=Mardi
-label.type.id=ID du Type
label.type=Type
+label.type.id=ID du 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.unlimited=Illimit\u00E9
+label.untagged=Non Tagg\u00E9
+label.update.project.resources=Mettre \u00E0 jour les ressources du projet
+label.update.ssl=Certificat SSL
+label.update.ssl.cert=Certificat SSL
+label.updating=Mise \u00E0 jour
+label.upload=Charger
+label.upload.volume=Charger un volume
label.url=URL
-label.usage.interface=Interface d\'Usage
-label.used=Utilisé
+label.usage.interface=Interface Utilisation
+label.used=Utilis\u00E9
label.user=Utilisateur
-label.username=Nom d\'Utilisateur
+label.username=Nom d\\'Utilisateur
label.users=Utilisateurs
label.value=Valeur
+label.vcdcname=Nom du DC vCenter
label.vcenter.cluster=Cluster vCenter
label.vcenter.datacenter=Datacenter vCenter
label.vcenter.datastore=Datastore vCenter
-label.vcenter.host=Hôte Vcenter
+label.vcenter.host=H\u00F4te vCenter
label.vcenter.password=Mot de passe vCenter
-label.vcenter.username=Nom d\'utilisateur vCenter
+label.vcenter.username=Nom d\\'utilisateur vCenter
+label.vcipaddress=Adresse IP vCenter
label.version=Version
+label.view=Voir
+label.view.all=Voir tout
+label.view.console=Voir la console
+label.view.more=Voir plus
+label.viewing=Consultation en cours
label.virtual.appliance=Appliance Virtuelle
label.virtual.appliances=Appliances Virtuelles
-label.virtual.network=Réseau virtuel
+label.virtual.machines=Machines virtuelles
+label.virtual.network=R\u00E9seau virtuel
+label.virtual.router=Routeur Virtuel
+label.virtual.routers=Routeurs virtuels
+label.vlan=VLAN
label.vlan.id=ID du VLAN
label.vlan.range=Plage du 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.vm.destroy=D\u00E9truire
+label.vm.display.name=Nom d\\'affichage de la VM
+label.vm.name=Nom de la VM
+label.vm.reboot=Red\u00E9marrer
+label.vm.start=D\u00E9marrer
+label.vm.state=\u00C9tat VM
+label.vm.stop=Arr\u00EAter
label.vmfs=VMFS
label.vms=VMs
+label.vmware.traffic.label=Libell\u00E9 pour le trafic VMware
+label.volgroup=Groupe de Volume
+label.volume=Volume
label.volume.limits=Limites des volumes
label.volume.name=Nom du volume
-label.volume=Volume
label.volumes=Volumes
-label.vsphere.managed=Gérée par vSphere
+label.vpc=VPC
+label.vpc.id=ID VPC
+label.vpn=VPN
+label.vpn.customer.gateway=Passerelle VPN client
+label.vsmctrlvlanid=\ ID VLAN Contr\u00F4le
+label.vsmpktvlanid=ID VLAN Paquet
+label.vsmstoragevlanid=VLAN ID Stockage
+label.vsphere.managed=G\u00E9r\u00E9e par vSphere
label.waiting=En attente
-label.warn=Avertir
+label.warn=Avertissement
label.wednesday=Mercredi
label.weekly=Hebdomadaire
-label.welcome.cloud.console=Bienvenue dans la console de gestion
label.welcome=Bienvenue
+label.welcome.cloud.console=Bienvenue dans la Console d\\'Administration
+label.what.is.cloudstack=Qu\\'est-ce-que CloudStack&\#8482; ?
+label.xen.traffic.label=Libell\u00E9 pour le trafic XenServer
label.yes=Oui
-label.zone.id=ID de la zone
-label.zone.step.1.title=Etape 1\: Sélectionnez un réseau
-label.zone.step.2.title=Etape 2\: Ajoutez une zone
-label.zone.step.3.title=Etape 3\: Ajoutez un Pod
-label.zone.step.4.title=Etape 4\: Ajoutez une plage d\'adresses IP
-label.zone.wide=Transverse à 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.
+label.zone.details=D\u00E9tails de la zone
+label.zone.id=ID de la zone
+label.zone.name=Nom de la zone
+label.zone.step.1.title=\u00C9tape 1 \: S\u00E9lectionnez un r\u00E9seau
+label.zone.step.2.title=\u00C9tape 2 \: Ajoutez une zone
+label.zone.step.3.title=\u00C9tape 3 \: Ajoutez un Pod
+label.zone.step.4.title=\u00C9tape 4 \: Ajoutez une plage d\\'adresses IP
+label.zone.type=Type de zone
+label.zone.wide=Transverse \u00E0 la zone
+label.zoneWizard.trafficType.guest=Invit\u00E9 \: Trafic entre les machines virtuelles utilisateurs
+label.zoneWizard.trafficType.management=Administration \: Trafic entre les ressources internes de CloudStack, incluant tous les composants qui communiquent avec le serveur d\\'administration, tels que les h\u00F4tes and les machines virtuelles Syst\u00E8mes CloudStack
+label.zoneWizard.trafficType.public=Public \: Trafic entre Internet et les machines virtuelles dans le nuage
+label.zoneWizard.trafficType.storage=Stockage \: Trafic entre les serveurs de stockages primaires et secondaires, tel que le transfert de machines virtuelles mod\u00E8les et des instantan\u00E9s de disques
+label.zones=Zones
+managed.state=\u00C9tat de la gestion
+message.Zone.creation.complete=Cr\u00E9ation de la zone termin\u00E9e
+message.acquire.new.ip=Confirmer l\\'acquisition d\\'une nouvelle adresse IP pour ce r\u00E9seau.
+message.acquire.new.ip.vpc=Veuillez confirmer que vous voulez une nouvelle adresse IP pour ce VPC
+message.acquire.public.ip=S\u00E9lectionnez la zone dans laquelle vous voulez acqu\u00E9rir votre nouvelle adresse IP.
+message.action.cancel.maintenance=Votre h\u00F4te a quitt\u00E9 la maintenance. Ce processus peut prendre jusqu\\'\u00E0 plusieurs minutes.
+message.action.cancel.maintenance.mode=Confirmer l\\'annulation de cette maintenance.
+message.action.change.service.warning.for.instance=Votre instance doit \u00EAtre arr\u00EAt\u00E9e avant d\\'essayer de changer son offre de service.
+message.action.change.service.warning.for.router=Votre routeur doit \u00EAtre arr\u00EAt\u00E9 avant d\\'essayer de changer son offre de service.
message.action.delete.ISO=Confirmer que vous souhaitez supprimer cette ISO.
+message.action.delete.ISO.for.all.zones=L\\'ISO est utilis\u00E9 par toutes les zones. S\\'il vous pla\u00EEt confirmer que vous voulez le supprimer de toutes les zones.
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.external.firewall=Confirmer que vous souhaitez supprimer ce pare-feu externe. Attention \: Si vous pr\u00E9voyez de rajouter le m\u00EAme pare-feu externe de nouveau, vous devez r\u00E9-initialiser les donn\u00E9es d\\'utilisation sur l\\'appareil.
+message.action.delete.external.load.balancer=Confirmez que vous souhaitez supprimer ce r\u00E9partiteur de charge externe. Attention \: Si vous pensez ajouter le m\u00EAme r\u00E9partiteur de charge plus tard, vous devez remettre \u00E0 z\u00E9ro les statistiques d\\'utilisation de cet \u00E9quipement.
+message.action.delete.ingress.rule=Confirmez que vous souhaitez supprimer cette r\u00E8gle d\\'entr\u00E9e.
+message.action.delete.network=Confirmer que vous voulez supprimer ce r\u00E9seau.
+message.action.delete.nexusVswitch=Confirmer la suppession de ce Nexus 1000v
+message.action.delete.physical.network=Confirmer la suppression du r\u00E9seau physique
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.security.group=Confirmez que vous souhaitez supprimer ce groupe de s\u00E9curit\u00E9.
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.snapshot=Confirmez que vous souhaitez supprimer cet instantan\u00E9
+message.action.delete.system.service.offering=Confirmer la suppression de l\\'offre syst\u00E8me.
+message.action.delete.template=Confirmez que vous souhaitez supprimer ce mod\u00E8le.
+message.action.delete.template.for.all.zones=Ce mod\u00E8le est utilis\u00E9 par toutes les zones. Confirmez que vous souhaitez le supprimer de toutes les zones.
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.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.destroy.systemvm=Confirmez que vous souhaitez supprimer cette VM Syst\u00E8me.
+message.action.disable.cluster=Confirmez que vous souhaitez d\u00E9sactiver ce cluster
+message.action.disable.nexusVswitch=Confirmer la d\u00E9sactivation de ce Nexus 1000v
+message.action.disable.physical.network=Confirmer l\\'activation de ce r\u00E9seau physique.
+message.action.disable.pod=Confirmez que vous voulez d\u00E9sactiver ce Pod
+message.action.disable.static.NAT=Confirmez que vous souhaitez d\u00E9sactiver le NAT statique.
+message.action.disable.zone=Confirmez que vous voulez d\u00E9sactiver cette zone
+message.action.download.iso=Confirmer le t\u00E9l\u00E9chargement de cet ISO
+message.action.download.template=Confirmer le t\u00E9l\u00E9chargement de ce mod\u00E8le
+message.action.enable.cluster=Confirmez que vous souhaitez activer ce cluster
+message.action.enable.maintenance=Votre h\u00F4te a \u00E9t\u00E9 mis en mode maintenance avec succ\u00E8s. Ce processus peut durer plusieurs minutes ou plus, suivant le nombre de VMs actives sur cet h\u00F4te.
+message.action.enable.nexusVswitch=Confirmer l\\'activation de ce Nexus 1000v
+message.action.enable.physical.network=Confirmer l\\'activation de ce r\u00E9seau physique.
+message.action.enable.pod=Confirmez que vous souhaitez activer ce Pod
+message.action.enable.zone=Confirmez que vous voulez activer cette zone
+message.action.force.reconnect=Votre h\u00F4te a \u00E9t\u00E9 forc\u00E9e \u00E0 se reconnecter avec succ\u00E8s. Ce processus peut prendre jusqu\\'\u00E0 plusieurs minutes.
+message.action.host.enable.maintenance.mode=Activer le mode maintenance va causer la migration \u00E0 chaud de l\\'ensemble des instances de cet h\u00F4te sur les autres h\u00F4tes disponibles.
message.action.instance.reset.password=Confirmer le changement du mot de passe ROOT pour 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.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.manage.cluster=Confirmez que vous voulez g\u00E9rer le cluster
+message.action.primarystorage.enable.maintenance.mode=Attention \: placer ce stockage primaire en mode maintenance va provoquer l\\'arr\u00EAt de l\\'ensemble des VMs utilisant des volumes sur ce stockage. Souhaitez-vous continuer ?
+message.action.reboot.instance=Confirmez que vous souhaitez red\u00E9marrer cette instance.
+message.action.reboot.router=Tous les services fournit par ce routeur virtuel vont \u00EAtre interrompus. Confirmer le r\u00E9-amor\u00E7age de ce routeur.
+message.action.reboot.systemvm=Confirmez que vous souhaitez red\u00E9marrer cette VM Syst\u00E8me
+message.action.release.ip=Confirmez que vous souhaitez lib\u00E9rer cette IP.
+message.action.remove.host=Confirmer la suppression de cet h\u00F4te.
+message.action.reset.password.off=Votre instance ne supporte pas pour le moment cette fonctionnalit\u00E9.
+message.action.reset.password.warning=Votre instance doit \u00EAtre arr\u00EAt\u00E9e avant d\\'essayer de changer son mot de passe.
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.systemvm=Confirmez que vous souhaitez arrêter cette VM.
-message.action.take.snapshot=Confirmer la prise d\'un snapshot pour ce volume.
-message.add.cluster.zone=Ajouter un cluster d\'hyperviseurs géré pour cette zone
-message.add.cluster=Ajouter un cluster d\'hyperviseurs géré pour cette zone , pod
-message.add.disk.offering=Renseignez les paramètres suivants pour ajouter un offre de service de disques
-message.add.firewall=Ajouter un parefeu à cette zone
-message.add.host=Renseignez les paramètres suivant pour ajouter un hôte
-message.add.ip.range.direct.network=Ajouter une plage IP au réseau direct dans la zone
+message.action.start.instance=Confirmez que vous souhaitez d\u00E9marrer cette instance.
+message.action.start.router=Confirmez que vous souhaitez d\u00E9marrer ce routeur.
+message.action.start.systemvm=Confirmez que vous souhaitez red\u00E9marrer cette VM syst\u00E8me.
+message.action.stop.instance=Confirmez que vous souhaitez arr\u00EAter cette instance.
+message.action.stop.router=Tous les services fournit par ce routeur virtuel vont \u00EAtre interrompus. Confirmer l\\'arr\u00EAt de ce routeur.
+message.action.stop.systemvm=Confirmez que vous souhaitez arr\u00EAter cette VM.
+message.action.take.snapshot=Confirmer la prise d\\'un instantan\u00E9 pour ce volume.
+message.action.unmanage.cluster=Confirmez que vous ne voulez plus g\u00E9rer le cluster
+message.activate.project=\u00CAtes-vous s\u00FBr de vouloir activer ce projet ?
+message.add.VPN.gateway=Confirmer l\\'ajout d\\'une passerelle VPN
+message.add.cluster=Ajouter un cluster d\\'hyperviseurs g\u00E9r\u00E9 pour cette zone , pod
+message.add.cluster.zone=Ajouter un cluster d\\'hyperviseurs g\u00E9r\u00E9 pour cette zone
+message.add.disk.offering=Renseignez les param\u00E8tres suivants pour ajouter un offre de service de disques
+message.add.domain=Sp\u00E9cifier le sous domaine que vous souhaitez cr\u00E9er sous ce domaine
+message.add.firewall=Ajouter un pare-feu \u00E0 cette zone
+message.add.guest.network=Confirmer l\\'ajout du r\u00E9seau invit\u00E9
+message.add.host=Renseignez les param\u00E8tres suivants pour ajouter une h\u00F4te
+message.add.ip.range=Ajouter une plage IP pour le r\u00E9seau publique dans la zone
+message.add.ip.range.direct.network=Ajouter une plage IP au r\u00E9seau direct dans la zone
message.add.ip.range.to.pod=Ajouter une plage IP pour le pod\:
-message.add.ip.range=Ajouter une plage IP pour le réseau publique dans la zone
-message.add.load.balancer=Ajouter un partageur de charge à la zone
-message.add.network=Ajouter un nouveau réseau à la zone\:
-message.add.pod=Ajouter un nouveau pod à la zone
-message.add.primary.storage=Ajouter un nouveau stockage primaire à la zone , pod
-message.add.primary=Renseignez les paramètres suivants pour ajouter un sotckage primaire
+message.add.load.balancer=Ajouter un r\u00E9partiteur de charge \u00E0 la zone
+message.add.load.balancer.under.ip=La r\u00E8gle de r\u00E9partition de charge \u00E9t\u00E9 ajout\u00E9e sous l\\'adresse IP \:
+message.add.network=Ajouter un nouveau r\u00E9seau \u00E0 la zone\:
+message.add.new.gateway.to.vpc=Renseigner les informations suivantes pour ajouter une nouvelle passerelle pour ce VPC
+message.add.pod=Ajouter un nouveau pod \u00E0 la zone
+message.add.pod.during.zone.creation=Chaque zone doit contenir un ou plusieurs pods, et le premier pod sera ajout\u00E9 maintenant. Une pod contient les h\u00F4tes et les serveurs de stockage primaire, qui seront ajout\u00E9s dans une \u00E9tape ult\u00E9rieure. Configurer une plage d\\'adresses IP r\u00E9serv\u00E9es pour le trafic de gestion interne de CloudStack. La plage d\\'IP r\u00E9serv\u00E9e doit \u00EAtre unique pour chaque zone dans le nuage.
+message.add.primary=Renseignez les param\u00E8tres suivants pour ajouter un stockage primaire
+message.add.primary.storage=Ajouter un nouveau stockage primaire \u00E0 la zone , pod
message.add.secondary.storage=Ajouter un nouveau stockage pour la zone
-message.add.service.offering=Renseigner les informations suivantes pour ajouter une nouvelle offre de service computing.
-message.add.template=Renseignez les informations suivantes pour créer votre nouveau modèle
+message.add.service.offering=Renseigner les informations suivantes pour ajouter une nouvelle offre de service de calcul.
+message.add.system.service.offering=Ajouter les informations suivantes pour cr\u00E9er une nouvelle offre syst\u00E8me.
+message.add.template=Renseignez les informations suivantes pour cr\u00E9er votre nouveau mod\u00E8le
message.add.volume=Renseignez les informations suivantes pour ajouter un nouveau volume
-message.additional.networks.desc=Sélectionnez le(s) réseau(x) additionnel(s) au(x)quel(s) sera connectée votre instance.
-message.advanced.mode.desc=Choisissez ce modèle de réseau si vous souhaitez bénéficier du support des VLANs. Ce mode de réseau donne le plus de flexibilité aux administrateurs pour fournir des offres de service réseau personnalisées comme fournir des parefeux, vpn, partageurs de charge ou également activer des réseaux virtuels ou directs.
-message.advanced.security.group=Choisissez ceci si vous souhaitez utiliser les groupes de sécurité pour fournir l\'isolation des VMs invitées.
-message.advanced.virtual=Choisissez ceci si vous souhaitez utiliser des VLANs pour fournir l\'isolation des VMs invitées.
-message.allow.vpn.access=Entrez un nom d\'utilisateur et un mot de passe pour l\'utilisateur que vous souhaitez autorisé à utiliser l\'accès VPN.
-message.attach.iso.confirm=Confirmez que vous souhaitez attacher l\'image ISO à cette instance.
-message.attach.volume=Renseignez les données suivante pour attacher un nouveau volume. Si vous attachez un volume disque à une machine virtuelle sous Windows, vous aurez besoin de redémarrer l\'instance pour voir le nouveau disque.
-message.basic.mode.desc=Choisissez ce modèle de réseau si vous *ne voulez pas* activer le support des VLANs. Toutes les instances créées avec ce modèle de réseau se verront assignées une adresse IP et les groupes de sécurité seront utilisés pour fournir l\'isolation entre les VMs.\n
-message.change.offering.confirm=Confirmez que vous souhaitez changer l\'offre de service de cette instance.
+message.adding.Netscaler.device=Ajouter un Netscaler
+message.adding.Netscaler.provider=Ajouter un fournisseur Netscaler
+message.adding.host=Ajout un h\u00F4te
+message.additional.networks.desc=S\u00E9lectionnez le(s) r\u00E9seau(x) additionnel(s) au(x)quel(s) sera connect\u00E9e votre instance.
+message.advanced.mode.desc=Choisissez ce mod\u00E8le de r\u00E9seau si vous souhaitez b\u00E9n\u00E9ficier du support des VLANs. Ce mode de r\u00E9seau donne le plus de flexibilit\u00E9 aux administrateurs pour fournir des offres de service r\u00E9seau personnalis\u00E9es comme fournir des pare-feux, VPN, r\u00E9partiteurs de charge ou \u00E9galement activer des r\u00E9seaux virtuels ou directs.
+message.advanced.security.group=Choisissez ceci si vous souhaitez utiliser les groupes de s\u00E9curit\u00E9 pour fournir l\\'isolation des VMs invit\u00E9es.
+message.advanced.virtual=Choisissez ceci si vous souhaitez utiliser des VLANs pour fournir l\\'isolation des VMs invit\u00E9es.
+message.after.enable.s3=Le stockage secondaire S3 est configur\u00E9. Note \: Quand vous quitterez cette page, vous ne pourrez plus re-configurer le support S3.
+message.after.enable.swift=Swift configur\u00E9. Remarque \: une fois que vous quitterez cette page, il ne sera plus possible de re-configurer Swift \u00E0 nouveau.
+message.alert.state.detected=\u00C9tat d\\'alerte d\u00E9tect\u00E9
+message.allow.vpn.access=Entrez un nom d\\'utilisateur et un mot de passe pour l\\'utilisateur que vous souhaitez autoriser \u00E0 utiliser l\\'acc\u00E8s VPN.
+message.apply.snapshot.policy=Vous avez mis \u00E0 jour votre politique d\\'instantan\u00E9s avec succ\u00E8s.
+message.attach.iso.confirm=Confirmez que vous souhaitez attacher l\\'image ISO \u00E0 cette instance.
+message.attach.volume=Renseignez les donn\u00E9es suivantes pour attacher un nouveau volume. Si vous attachez un volume disque \u00E0 une machine virtuelle sous Windows, vous aurez besoin de red\u00E9marrer l\\'instance pour voir le nouveau disque.
+message.basic.mode.desc=Choisissez ce mod\u00E8le de r\u00E9seau si vous *ne voulez pas* activer le support des VLANs. Toutes les instances cr\u00E9\u00E9es avec ce mod\u00E8le de r\u00E9seau se verront assigner une adresse IP et les groupes de s\u00E9curit\u00E9 seront utilis\u00E9s pour fournir l\\'isolation entre les VMs.
+message.change.offering.confirm=Confirmez que vous souhaitez changer l\\'offre de service de cette instance.
+message.change.password=Merci de modifier votre mot de passe.
+message.configure.all.traffic.types=Vous avez de multiples r\u00E9seaux physiques ; veuillez configurer les libell\u00E9s pour chaque type de trafic en cliquant sur le bouton Modifier.
+message.configuring.guest.traffic=Configuration du r\u00E9seau VM
+message.configuring.physical.networks=Configuration des r\u00E9seaux physiques
+message.configuring.public.traffic=Configuration du r\u00E9seau public
+message.configuring.storage.traffic=Configuration du r\u00E9seau de stockage
+message.confirm.action.force.reconnect=Confirmer la re-connexion forc\u00E9e de cet h\u00F4te.
+message.confirm.delete.F5=Confirmer la suppression du F5
+message.confirm.delete.NetScaler=Confirmer la suppression du Netscaler
+message.confirm.delete.SRX=Confirmer la suppression du SRX
+message.confirm.destroy.router=Confirmer la suppression de ce routeur
+message.confirm.disable.provider=Confirmer la d\u00E9sactivation de ce fournisseur
+message.confirm.enable.provider=Confirmer l\\'activation de ce fournisseur
+message.confirm.join.project=Confirmer que vous souhaitez rejoindre ce projet.
+message.confirm.remove.IP.range=Confirmer la suppression de cette plage d\\'adresses IP
+message.confirm.shutdown.provider=Confirmer l\\'arr\u00EAt de ce fournisseur
message.copy.iso.confirm=Confirmez que vous souhaitez copier votre image ISO vers
-message.copy.template=Copier le modèle XXX de la zone vers
-message.create.template.vm=Créer la VM depuis le modèle
-message.create.template.volume=Renseignez les informations suivantes avec de créer un modèle à partir de votre volume de disque\:. La création du modèle peut prendre plusieurs minutes suivant la taille du volume.
+message.copy.template=Copier le mod\u00E8le XXX de la zone vers
+message.create.template=Voulez vous cr\u00E9er un mod\u00E8le ?
+message.create.template.vm=Cr\u00E9er la VM depuis le mod\u00E8le
+message.create.template.volume=Renseignez les informations suivantes avec de cr\u00E9er un mod\u00E8le \u00E0 partir de votre volume de disque\:. La cr\u00E9ation du mod\u00E8le peut prendre plusieurs minutes suivant la taille du volume.
+message.creating.cluster=Cr\u00E9ation du cluster
+message.creating.guest.network=Cr\u00E9ation du r\u00E9seau pour les invit\u00E9s
+message.creating.physical.networks=Cr\u00E9ation des r\u00E9seaux physiques
+message.creating.pod=Cr\u00E9ation d\\'un pod
+message.creating.primary.storage=Cr\u00E9ation du stockage primaire
+message.creating.secondary.storage=Cr\u00E9ation du stockage secondaire
+message.creating.zone=Cr\u00E9ation de la zone
+message.decline.invitation=Voulez-vous refuser cette invitation au projet ?
+message.delete.VPN.connection=Confirmer la suppression de la connexion VPN
+message.delete.VPN.customer.gateway=Confirmer la suppression de cette passerelle VPN client
+message.delete.VPN.gateway=Confirmer la suppression de cette passerelle VPN
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=Please confirm that you want to disable this account. By disabling the account, all users for this account will no longer have access to their cloud resources. All running virtual machines will be immediately shut down.
-message.disable.vpn.access=Confirmez que vous souhaitez désactiver l\'accès VPN.
-message.download.ISO=Cliquer le lien 00000 pour télécharger une image ISO
-message.download.template=Cliquer le lien 00000 pour télécharger une template
-message.download.volume=Cliquez sur 00000 pour télécharger le volume
-message.edit.confirm=Confirmer les changement avant de cliquer sur "Enregistrer".
-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.delete.gateway=Confirmer la suppression de cette passerelle
+message.delete.project=\u00CAtes-vous s\u00FBr de vouloir supprimer ce projet ?
+message.delete.user=Confirmer la suppression de cet utilisateur.
+message.desc.advanced.zone=Pour des topologies de r\u00E9seau plus sophistiqu\u00E9es. Ce mod\u00E8le de r\u00E9seau permet plus de flexibilit\u00E9 dans la d\u00E9finition des r\u00E9seaux d\\'invit\u00E9s et propose des offres personnalis\u00E9es telles que le support de pare-feu, VPN ou d\\'\u00E9quilibrage de charge.
+message.desc.basic.zone=Fournit un r\u00E9seau unique o\u00F9 chaque instance de machine virtuelle se voit attribuer une adresse IP directement depuis le r\u00E9seau. L\\'isolation des invit\u00E9s peut \u00EAtre assur\u00E9 au niveau de la couche r\u00E9seau-3 tels que les groupes de s\u00E9curit\u00E9 (filtrage d\\'adresse IP source).
+message.desc.cluster=Chaque pod doit contenir un ou plusieurs clusters, et le premier cluster sera ajout\u00E9 tout de suite. Un cluster est un regroupement pour h\u00F4tes. Les h\u00F4tes d\\'un cluster ont tous un mat\u00E9riel identique, ex\u00E9cutent le m\u00EAme hyperviseur, sont dans le m\u00EAme sous-r\u00E9seau, et acc\u00E8dent au m\u00EAme stockage partag\u00E9. Chaque cluster comprend une ou plusieurs h\u00F4tes et un ou plusieurs serveurs de stockage primaire.
+message.desc.host=Chaque cluster doit contenir au moins un h\u00F4te (machine) pour ex\u00E9cuter des machines virtuelles invit\u00E9es, et le premier h\u00F4te sera ajout\u00E9 tout de suite. Pour un h\u00F4te fonctionnant dans CloudStack, vous devez installer un logiciel hyperviseur sur l\\'h\u00F4te, attribuer une adresse IP \u00E0 l\\'h\u00F4te, et s\\'assurer que l\\'h\u00F4te est connect\u00E9 au serveur d\\'administration CloudStack.
Indiquer le nom de l\\'h\u00F4te ou son adresse IP, l\\'identifiant de connexion (g\u00E9n\u00E9ralement root) et le mot de passe ainsi que toutes les \u00E9tiquettes permettant de classer les h\u00F4tes.
+message.desc.primary.storage=Chaque cluster doit contenir un ou plusieurs serveurs de stockage primaire, et le premier sera ajout\u00E9 tout de suite. Le stockage principal contient les volumes de disque pour les machines virtuelles s\\'ex\u00E9cutant sur les h\u00F4tes dans le cluster. Utiliser les protocoles standards pris en charge par l\\'hyperviseur sous-jacent.
+message.desc.secondary.storage=Chaque zone doit avoir au moins un serveur NFS ou un serveur de stockage secondaire, et sera ajout\u00E9 en premier tout de suite. Le stockage secondaire entrepose les mod\u00E8les de machines virtuelles, les images ISO et les images disques des volumes des machines virtuelles. Ce serveur doit \u00EAtre accessible pour toutes les machines h\u00F4tes dans la zone.
Saisir l\\'adresse IP et le chemin d\\'export.
+message.desc.zone=Une zone est la plus grande unit\u00E9 organisationnelle dans CloudStack, et correspond typiquement \u00E0 un centre de donn\u00E9es. Les zones fournissent un isolement physique et de la redondance. Une zone est constitu\u00E9e d\\'un ou plusieurs pods (dont chacun contient les h\u00F4tes et les serveurs de stockage primaire) et un serveur de stockage secondaire qui est partag\u00E9e par tous les pods dans la zone.
+message.detach.disk=Voulez-vous d\u00E9tacher ce disque ?
+message.detach.iso.confirm=Confirmez que vous souhaitez d\u00E9tacher l\\'image ISO de cette instance.
+message.disable.account=Veuillez confirmer que vous voulez d\u00E9sactiver ce compte. En d\u00E9sactivant le compte, tous les utilisateurs pour ce compte n\\'auront plus acc\u00E8s \u00E0 leurs ressources sur le cloud. Toutes les machines virtuelles vont \u00EAtre arr\u00EAt\u00E9es imm\u00E9diatement.
+message.disable.snapshot.policy=Vous avez d\u00E9sactiv\u00E9 votre politique d\\'instantan\u00E9 avec succ\u00E8s.
+message.disable.user=Confirmer la d\u00E9sactivation de cet utilisateur.
+message.disable.vpn=\u00CAtes-vous s\u00FBr de vouloir d\u00E9sactiver le VPN ?
+message.disable.vpn.access=Confirmez que vous souhaitez d\u00E9sactiver l\\'acc\u00E8s VPN.
+message.download.ISO=Cliquer 00000 pour t\u00E9l\u00E9charger une image ISO
+message.download.template=Cliquer sur 00000 pour t\u00E9l\u00E9charger le mod\u00E8le
+message.download.volume=Cliquer sur 00000 pour t\u00E9l\u00E9charger le volume
+message.download.volume.confirm=Confirmer le t\u00E9l\u00E9chargement du volume
+message.edit.account=Modifier ("-1" signifie pas de limite de ressources)
+message.edit.confirm=Confirmer les changements avant de cliquer sur "Enregistrer".
+message.edit.limits=Renseignez les limites pour les ressources suivantes. "-1" indique qu\\'il n\\'y a pas de limites pour la cr\u00E9ation de ressources.
+message.edit.traffic.type=Sp\u00E9cifier le libell\u00E9 de trafic associ\u00E9 avec ce type de trafic.
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.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 cette instance sur votre propre réseau privé ?
-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.enable.user=Confirmer l\\'activation de cet utilisateur.
+message.enable.vpn=Confirmer l\\'activation de l\\'acc\u00E8s VPN pour cette adresse IP.
+message.enable.vpn.access=Le VPN est d\u00E9sactiv\u00E9 pour cette adresse IP. Voulez vous activer l\\'acc\u00E8s VPN ?
+message.enabled.vpn=Votre acc\u00E8s VPN est activ\u00E9 et peut \u00EAtre acc\u00E9d\u00E9 par l\\'IP
+message.enabled.vpn.ip.sec=Votre cl\u00E9 partag\u00E9e IPSec est
+message.enabling.security.group.provider=Activation du fournisseur de groupe de s\u00E9curit\u00E9
+message.enabling.zone=Activation de la zone
+message.enter.token=Entrer le jeton unique re\u00E7u dans le message d\\'invitation.
+message.generate.keys=Confirmer la g\u00E9n\u00E9ration de nouvelles clefs pour cet utilisateur.
+message.guest.traffic.in.advanced.zone=Le trafic r\u00E9seau d\\'invit\u00E9 est la communication entre les machines virtuelles utilisateur. Sp\u00E9cifier une plage d\\'identifiant VLAN pour le trafic des invit\u00E9s pour chaque r\u00E9seau physique.
+message.guest.traffic.in.basic.zone=Le trafic r\u00E9seau d\\'invit\u00E9 est la communication entre les machines virtuelles utilisateur. Sp\u00E9cifier une plage d\\'adresses IP que CloudStack peut assigner aux machines virtuelles Invit\u00E9. S\\'assurer que cette plage n\\'empi\u00E8te pas sur la plage r\u00E9serv\u00E9e aux adresses IP Syst\u00E8me.
+message.installWizard.click.retry=Appuyer sur le bouton pour essayer \u00E0 nouveau le d\u00E9marrage.
+message.installWizard.copy.whatIsACluster=Un cluster permet de grouper les h\u00F4tes. Les h\u00F4tes d\\'un cluster ont un mat\u00E9riel identique, ex\u00E9cutent le m\u00EAme hyperviseur, sont sur le m\u00EAme sous-r\u00E9seau, et acc\u00E8dent au m\u00EAme stockage partag\u00E9. Les instances de machines virtuelles (VM) peuvent \u00EAtre migr\u00E9es \u00E0 chaud d\\'un h\u00F4te \u00E0 un autre au sein du m\u00EAme groupe, sans interrompre les services utilisateur. Un cluster est la trois \u00E8me plus large unit\u00E9 organisationnelle dans un d\u00E9ploiement CloudStack&\#8482;. Les clusters sont contenus dans les pods et les pods sont contenus dans les zones.
CloudStack&\#8482; permet d\\'avoir plusieurs clusters dans un d\u00E9ploiement en nuage, mais pour une installation basique, il n\\'y a qu\\'un seul cluster.
+message.installWizard.copy.whatIsAHost=Un h\u00F4te est une machine. Les h\u00F4tes fournissent les ressources informatiques qui ex\u00E9cutent les machines virtuelles invit\u00E9es. Chaque h\u00F4te a un logiciel hyperviseur install\u00E9 pour g\u00E9rer les machines virtuelles invit\u00E9es (sauf pour les h\u00F4tes de type \\'bare-metal\\', qui sont un cas particulier d\u00E9taill\u00E9 dans le Guide d\\'installation avanc\u00E9e). Par exemple, un serveur Linux avec KVM, un serveur Citrix XenServer, et un serveur ESXi sont des h\u00F4tes. Dans une installation basique, un seul h\u00F4te ex\u00E9cutant XenServer ou KVM est utilis\u00E9.
L\\'h\u00F4te est la plus petite unit\u00E9 organisation au sein d\\'un d\u00E9ploiement CloudStack&\#8482;. Les h\u00F4tes sont contenus dans les clusters, les clusters sont contenus dans les pods et les pods sont contenus dans les zones.
+message.installWizard.copy.whatIsAPod=Un pod repr\u00E9sente souvent un seul rack. Les h\u00F4tes dans le m\u00EAme pod sont dans le m\u00EAme sous-r\u00E9seau.
Un pod est la deuxi\u00E8me plus grande unit\u00E9 organisationnelle au sein d\\'un d\u00E9ploiement CloudStack&\#8482;. Les pods sont contenus dans les zones. Chaque zone peut contenir un ou plusieurs pods ; dans l\\'Installation Basique, vous aurez juste un pod dans votre zone.
+message.installWizard.copy.whatIsAZone=Une zone est la plus grande unit\u00E9 organisationnelle au sein d\\'un d\u00E9ploiement CloudStack&\#8482;. Une zone correspond typiquement \u00E0 un centre de donn\u00E9es, mais il est permis d\\'avoir plusieurs zones dans un centre de donn\u00E9es. L\\'avantage d\\'organiser une infrastructure en zones est de fournir une isolation physique et de la redondance. Par exemple, chaque zone peut avoir sa propre alimentation et de liaison avec le r\u00E9seau, et les zones peuvent \u00EAtre tr\u00E8s \u00E9loign\u00E9es g\u00E9ographiquement (m\u00EAme si ce n\\'est pas une obligation).
+message.installWizard.copy.whatIsCloudStack=CloudStack&\#8482; est une plate-forme logicielle de pools de ressources informatiques pour construire des infrastructures publiques, priv\u00E9es et hybrides en tant que services (IaaS) dans les nuages. CloudStack&\#8482; g\u00E8re le r\u00E9seau, le stockage et les noeuds de calcul qui composent une infrastructure dans les nuages. Utilisez CloudStack&\#8482; pour d\u00E9ployer, g\u00E9rer et configurer les environnements d\\'informatiques dans les nuages.
S\\'\u00E9tendant au-del\u00E0 des machines virtuelles individuelles fonctionnant sur du mat\u00E9riel standard, CloudStack&\#8482; offre une solution d\\'informatique en nuage cl\u00E9 en main pour fournir des centres de donn\u00E9es virtuels comme service - fournissant tous les composants essentiels pour construire, d\u00E9ployer et g\u00E9rer des applications \\'cloud\\' multi-niveaux et multi-locataire. Les versions libre et Premium sont disponibles, la version Libre offrant des caract\u00E9ristiques presque identiques.
+message.installWizard.copy.whatIsPrimaryStorage=Une infrastructure CloudStack&\#8482; utilise deux types de stockage \: stockage primaire et stockage secondaire. Les deux peuvent \u00EAtre des serveurs iSCSI ou NFS, ou sur disque local.
Le stockage primaire est associ\u00E9 \u00E0 un cluster, et stocke les volumes disques de chaque machine virtuelle pour toutes les VMs s\\'ex\u00E9cutant sur les h\u00F4tes dans le cluster. Le serveur de stockage primaire est typiquement proche des h\u00F4tes.
+message.installWizard.copy.whatIsSecondaryStorage=Le stockage secondaire est associ\u00E9 \u00E0 une zone, et il stocke les \u00E9l\u00E9ments suivants\:- Mod\u00E8les - images de syst\u00E8mes d\\'exploitation qui peuvent \u00EAtre utilis\u00E9es pour d\u00E9marrer les machines virtuelles et peuvent inclure des informations de configuration suppl\u00E9mentaires, telles que les applications pr\u00E9-install\u00E9es
- Images ISO - images de syst\u00E8me d\\'exploitation ou d\\'installation d\\'OS qui peuvent \u00EAtre amor\u00E7able ou non-amor\u00E7able
- Images de volume disque - capture des donn\u00E9es de machines virtuelles qui peuvent \u00EAtre utilis\u00E9es pour la r\u00E9cup\u00E9ration des donn\u00E9es ou cr\u00E9er des mod\u00E8les
+message.installWizard.now.building=Construction de votre Cloud en cours
+message.installWizard.tooltip.addCluster.name=Un nom pour le cluster. Ce choix est libre et n\\'est pas utilis\u00E9 par CloudStack.
+message.installWizard.tooltip.addHost.hostname=Le nom DNS ou adresse IP du serveur.
+message.installWizard.tooltip.addHost.password=Le mot de passe pour l\\'utilisateur indiqu\u00E9 pr\u00E9c\u00E9demment (issu de l\\'installation XenServer).
+message.installWizard.tooltip.addHost.username=Habituellement root.
+message.installWizard.tooltip.addPod.name=Nom pour le pod
+message.installWizard.tooltip.addPod.reservedSystemEndIp=Ceci est la plage d\\'adresses IP dans le r\u00E9seau priv\u00E9 que CloudStack utilise la gestion des VMs du stockage secondaire et les VMs Console Proxy. Ces adresses IP sont prises dans le m\u00EAme sous-r\u00E9seau que les serveurs h\u00F4tes.
+message.installWizard.tooltip.addPod.reservedSystemGateway=Passerelle pour les serveurs dans ce pod
+message.installWizard.tooltip.addPod.reservedSystemNetmask=Le masque r\u00E9seau que les instances utiliseront sur le r\u00E9seau
+message.installWizard.tooltip.addPod.reservedSystemStartIp=Ceci est la plage d\\'adresses IP dans le r\u00E9seau priv\u00E9 que CloudStack utilise la gestion des VMs du stockage secondaire et les VMs Console Proxy. Ces adresses IP sont prises dans le m\u00EAme sous-r\u00E9seau que les serveurs h\u00F4tes.
+message.installWizard.tooltip.addPrimaryStorage.name=Nom pour ce stockage
+message.installWizard.tooltip.addPrimaryStorage.path=(pour NFS) Dans NFS, ceci est le chemin d\\'export depuis le serveur. (pour SharedMountPoint) Le chemin. Avec KVM, c\\'est le chemin sur chaque h\u00F4te o\u00F9 ce stockage primaire est mont\u00E9. Par exemple, "/mnt/primary".
+message.installWizard.tooltip.addPrimaryStorage.server=(pour NFS, iSCSI ou PreSetup) Adresse IP ou nom DNS du stockage
+message.installWizard.tooltip.addSecondaryStorage.nfsServer=Adresse IP du serveur NFS supportant le stockage secondaire
+message.installWizard.tooltip.addSecondaryStorage.path=Le chemin export\u00E9, situ\u00E9 sur le serveur sp\u00E9cifi\u00E9 pr\u00E9c\u00E9demment
+message.installWizard.tooltip.addZone.dns1=Ces serveurs DNS sont utilis\u00E9s par les machines virtuelles Invit\u00E9es dans la zone. Ces serveurs DNS seront accessibles par le r\u00E9seau public, ce dernier sera ajout\u00E9 plus tard. Les adresses IP publiques pour la zone doivent avoir une route vers les serveurs DNS indiqu\u00E9s ici.
+message.installWizard.tooltip.addZone.dns2=Ces serveurs DNS sont utilis\u00E9s par les machines virtuelles Invit\u00E9es dans la zone. Ces serveurs DNS seront accessibles par le r\u00E9seau public, ce dernier sera ajout\u00E9 plus tard. Les adresses IP publiques pour la zone doivent avoir une route vers les serveurs DNS indiqu\u00E9s ici.
+message.installWizard.tooltip.addZone.internaldns1=Ces serveurs DNS sont utilis\u00E9s par les machines virtuelles Invit\u00E9es dans la zone. Ces serveurs DNS seront accessibles par le r\u00E9seau public, ce dernier sera ajout\u00E9 plus tard. Les adresses IP publiques pour la zone doivent avoir une route vers les serveurs DNS indiqu\u00E9s ici.
+message.installWizard.tooltip.addZone.internaldns2=Ces serveurs DNS sont utilis\u00E9s par les machines virtuelles Invit\u00E9es dans la zone. Ces serveurs DNS seront accessibles par le r\u00E9seau public, ce dernier sera ajout\u00E9 plus tard. Les adresses IP publiques pour la zone doivent avoir une route vers les serveurs DNS indiqu\u00E9s ici.
+message.installWizard.tooltip.addZone.name=Nom pour la zone
+message.installWizard.tooltip.configureGuestTraffic.description=Description pour ce r\u00E9seau
+message.installWizard.tooltip.configureGuestTraffic.guestEndIp=La plage d\\'adresses IP qui sera disponible en allocation pour les machines invit\u00E9es dans cette zone. Si une carte r\u00E9seau est utilis\u00E9e, ces adresses IP peuvent \u00EAtre dans le m\u00EAme CIDR que le CIDR du pod.
+message.installWizard.tooltip.configureGuestTraffic.guestGateway=La passerelle que les instances invit\u00E9es doivent utiliser
+message.installWizard.tooltip.configureGuestTraffic.guestNetmask=Le masque r\u00E9seau que les instances devrait utiliser sur le r\u00E9seau
+message.installWizard.tooltip.configureGuestTraffic.guestStartIp=La plage d\\'adresses IP qui sera disponible en allocation pour les machines invit\u00E9es dans cette zone. Si une carte r\u00E9seau est utilis\u00E9e, ces adresses IP peuvent \u00EAtre dans le m\u00EAme CIDR que le CIDR du pod.
+message.installWizard.tooltip.configureGuestTraffic.name=Nom pour ce r\u00E9seau
+message.instanceWizard.noTemplates=Vous n\\'avez pas de image disponible ; Ajouter un mod\u00E8le compatible puis relancer l\\'assistant de cr\u00E9ation d\\'instance.
+message.ip.address.changed=Vos adresses IP ont peut \u00EAtre chang\u00E9es ; Voulez vous rafra\u00EEchir la liste ? Dans ce cas, le panneau de d\u00E9tail se fermera.
+message.iso.desc=Image disque contenant des donn\u00E9es ou un support amor\u00E7able pour OS
+message.join.project=Vous avez rejoint un projet. S\u00E9lectionnez la vue Projet pour le voir.
+message.launch.vm.on.private.network=Souhaitez vous d\u00E9marrer cette instance sur votre propre r\u00E9seau priv\u00E9 ?
+message.launch.zone=La zone est pr\u00EAte \u00E0 d\u00E9marrer ; passer \u00E0 l\\'\u00E9tape suivante.
+message.lock.account=Confirmez que vous souhaitez verrouiller ce compte. En le verrouillant, les utilisateurs de ce compte ne seront plus capables de g\u00E9rer leurs ressources. Les ressources existantes resteront toutefois accessibles.
+message.migrate.instance.confirm=Confirmez l\\'h\u00F4te vers lequel vous souhaitez migrer cette instance
+message.migrate.instance.to.host=Confirmer la migration de l\\'instance vers un autre h\u00F4te
+message.migrate.instance.to.ps=Confirmer la migration de l\\'instance vers un autre stockage primaire
+message.migrate.router.confirm=Confirmer la migration du routeur vers \:
+message.migrate.systemvm.confirm=Confirmer la migration de la VM syst\u00E8me vers \:
+message.migrate.volume=Confirmer la migration du volume vers un autre stockage primaire.
message.new.user=Renseigner les informations suivantes pour ajouter un nouveau compte utilisateur
-message.no.network.support.configuration.not.true=Il n\'y a pas de zone avec la fonction groupe de sécurité active. Dès lors, pas de fonction réseau supplémentaires disponibles. Continuer à l\'étape 5.
-message.no.network.support=Sélectionnez l\'hyperviseur. vSphere, n\'a pas de fonctionnalités supplémentaires pour le réseau. Continuez à l\'étape 5.
-message.number.clusters= \# of Clusters
-message.number.hosts= \# of Hôtes
-message.number.pods= \# of Pods
-message.number.storage= \# of Volumes de Stockage Primaire
-message.number.zones= \# of Zones
-message.remove.vpn.access=Confirmez que vous souhaitez supprimer l\'accès VPN à l\'utilisateur suivant.
-message.restart.mgmt.server=Redémarrez votre(vos) serveur(s) de management pour appliquer les nouveaux paramètres.
-message.restart.mgmt.usage.server=Redémarrer le ou les management server et usage server pour que les nouveaux paramètres soient pris en compte.
-message.security.group.usage=(Utilisez Ctrl-clic pour séléctionner les groupes de sécurité visés)
-message.snapshot.schedule=Vous pouvez mettre en place les politiques de génération d\'instantanés en sélectionnant les options disponibles ci-dessous et en appliquant votre politique.
-message.step.1.continue=Sélectionnez un modèle ou une image ISO pour continuer
-message.step.1.desc=Sélectionnez un template pour votre nouvelle instance virtuelle. Vous pouvez également choisir un modèle vierge sur lequel une image ISO pourra être installé.
-message.step.2.continue=Sélectionnez une offre de service pour continuer
-message.step.2.desc=
-message.step.3.continue=Sélectionnez un offre de service de disque pour continuer
-message.step.3.desc=
-message.step.4.continue=Sélectionnez au moins un réseau pour continuer
-message.step.4.desc=Sélectionnez le réseau principal auquel votre instance va être connecté.
-message.update.os.preference=Choisissez votre OS préféré pour cet hôte. Toutes les instances avec des préférences similaires seront d\'abord allouées à cet hôte avant d\'en choisir un autre.
-message.update.ssl=Soumettez un nouveau certificat SSL compatible X.509 qui sera mis à jour sur l\'ensemble de instance de proxy console.
-message.virtual.network.desc=Un réseau virtuel dédié pour votre compte. Ce domaine de broadcast est contenu dans un VLAN et l\'ensemble de accès réseau publique sont routés par un routeur virtuel.
-message.volume.create.template.confirm=Confirmez que vous souhaitez créer un modèle pour ce disque. La création peut prendre plusieurs minutes, voire plus, selon la taille du volume.
-message.zone.step.1.desc=Sélectionnez un modèle de réseau pour votre zone.
+message.no.network.support=S\u00E9lectionnez l\\'hyperviseur. vSphere, n\\'a pas de fonctionnalit\u00E9s suppl\u00E9mentaires pour le r\u00E9seau. Continuez \u00E0 l\\'\u00E9tape 5.
+message.no.network.support.configuration.not.true=Il n\\'y a pas de zone avec la fonction groupe de s\u00E9curit\u00E9 active. D\u00E8s lors, pas de fonction r\u00E9seau suppl\u00E9mentaires disponibles. Continuer \u00E0 l\\'\u00E9tape 5.
+message.no.projects=Vous n\\'avez pas de projet.
Vous pouvez en cr\u00E9er un depuis la section projets.
+message.no.projects.adminOnly=Vous n\\'avez pas de projet.
Contacter votre administrateur pour ajouter un projet.
+message.number.clusters= \# de Clusters
+message.number.hosts= \# d\\' H\u00F4tes
+message.number.pods= \# de Pods
+message.number.storage= \# de Volumes de Stockage Primaire
+message.number.zones= \# de Zones
+message.pending.projects.1=Vous avez des invitations projet en attente \:
+message.pending.projects.2=Pour les visualiser, aller dans la section projets, puis s\u00E9lectionner invitation dans la liste d\u00E9roulante.
+message.please.add.at.lease.one.traffic.range=Ajouter au moins une plage r\u00E9seau
+message.please.proceed=Continuer vers la prochaine \u00E9tape.
+message.please.select.a.configuration.for.your.zone=S\u00E9lectionner une configuration pour la zone.
+message.please.select.a.different.public.and.management.network.before.removing=S\u00E9lectionner un r\u00E9seau public et d\\'administration diff\u00E9rent avant de supprimer
+message.please.select.networks=S\u00E9lectionner les r\u00E9seaux pour votre machine virtuelle.
+message.please.wait.while.zone.is.being.created=Patienter pendant la cr\u00E9ation de la zone, cela peut prendre du temps...
+message.project.invite.sent=Invitation envoy\u00E9e ; les utilisateurs seront ajout\u00E9s apr\u00E8s acceptation de l\\'invitation
+message.public.traffic.in.advanced.zone=Le trafic public est g\u00E9n\u00E9r\u00E9 lorsque les machines virtuelles dans le nuage acc\u00E8dent \u00E0 Internet. Des adresses IP publiquement accessibles doivent \u00EAtre pr\u00E9vues \u00E0 cet effet. Les utilisateurs peuvent utiliser l\\'interface d\\'administration de CloudStack pour acqu\u00E9rir ces adresses IP qui impl\u00E9menteront une translation d\\'adresse NAT entre le r\u00E9seau d\\'invit\u00E9 et le r\u00E9seau public.
Fournir au moins une plage d\\'adresses IP pour le trafic Internet.
+message.public.traffic.in.basic.zone=Le trafic public est g\u00E9n\u00E9r\u00E9 lorsque les machines virtuelles dans le nuage acc\u00E8dent \u00E0 Internet ou fournissent des services \u00E0 des utilisateurs sur Internet. Des adresses IP publiquement accessibles doivent \u00EAtre pr\u00E9vus \u00E0 cet effet. Quand une instance est cr\u00E9\u00E9e, une adresse IP publique depuis un ensemble d\\'adresses IP publiques sera allou\u00E9e \u00E0 l\\'instance, en plus de l\\'adresse IP de l\\'invit\u00E9. La translation d\\'adresses statique NAT 1-1 sera mises en place automatiquement entre l\\'adresse IP publique et l\\'adresse IP de l\\'invit\u00E9. Les utilisateurs peuvent \u00E9galement utiliser l\\'interface d\\'administration CloudStack pour acqu\u00E9rir des adresses IP suppl\u00E9mentaires pour ajouter une translation d\\'adresse statique NAT entre leurs instances et le r\u00E9seau d\\'adresses IP publiques.
+message.remove.vpc=Confirmer la suppression du VPC
+message.remove.vpn.access=Confirmez que vous souhaitez supprimer l\\'acc\u00E8s VPN \u00E0 l\\'utilisateur suivant.
+message.reset.VPN.connection=Confirmer le r\u00E9-initialisation de la connexion VPN
+message.reset.password.warning.notPasswordEnabled=Le mod\u00E8le de cette instance a \u00E9t\u00E9 cr\u00E9\u00E9 sans la gestion de mot de passe
+message.reset.password.warning.notStopped=Votre instance doit \u00EAtre arr\u00EAt\u00E9e avant de changer son mot de passe
+message.restart.mgmt.server=Red\u00E9marrez votre(vos) serveur(s) de management pour appliquer les nouveaux param\u00E8tres.
+message.restart.mgmt.usage.server=Red\u00E9marrer le ou les serveur(s) de gestion et le ou les serveur(s) de consommation pour que les nouveaux param\u00E8tres soient pris en compte.
+message.restart.network=Tous les services fournit par ce routeur virtuel vont \u00EAtre interrompus. Confirmer le red\u00E9marrage de ce routeur.
+message.restart.vpc=Confirmer le red\u00E9marrage du VPC
+message.security.group.usage=(Utilisez Ctrl-clic pour s\u00E9lectionner les groupes de s\u00E9curit\u00E9 vis\u00E9s)
+message.select.a.zone=Une zone correspond typiquement \u00E0 un seul centre de donn\u00E9es. Des zones multiples peuvent permettre de rendre votre cloud plus fiable en apportant une isolation physique et de la redondance.
+message.select.instance=S\u00E9lectionner une instance.
+message.select.iso=S\u00E9lectionner un ISO pour votre nouvelle instance virtuelle.
+message.select.item=Merci de s\u00E9lectionner un \u00E9l\u00E9ment.
+message.select.security.groups=Merci de s\u00E9lectionner un(des) groupe(s) de s\u00E9curit\u00E9 pour la nouvelle VM
+message.select.template=S\u00E9lectionner un mod\u00E8le pour votre nouvelle instance virtuelle.
+message.setup.physical.network.during.zone.creation=Lorsque vous ajoutez une zone avanc\u00E9e, vous avez besoin de d\u00E9finir un ou plusieurs r\u00E9seaux physiques. Chaque r\u00E9seau correspond \u00E0 une carte r\u00E9seau sur l\\'hyperviseur. Chaque r\u00E9seau physique peut supporter un ou plusieurs types de trafic, avec certaines restrictions sur la fa\u00E7on dont ils peuvent \u00EAtre combin\u00E9s.
Glisser et d\u00E9poser un ou plusieurs types de trafic sur chaque r\u00E9seau physique.
+message.setup.physical.network.during.zone.creation.basic=Quand vous ajoutez une zone basique, vous pouvez param\u00E9trer un seul r\u00E9seau physique, correspondant \u00E0 une carte r\u00E9seau sur l\\'hyperviseur. Ce r\u00E9seau comportera plusieurs types de trafic.
Vous pouvez \u00E9galement glisser et d\u00E9poser d\\'autres types de trafic sur le r\u00E9seau physique.
+message.setup.successful=Installation du Cloud r\u00E9ussie \!
+message.snapshot.schedule=Vous pouvez mettre en place les politiques de g\u00E9n\u00E9ration d\\'instantan\u00E9s en s\u00E9lectionnant les options disponibles ci-dessous et en appliquant votre politique.
+message.specify.url=Renseigner l\\'URL
+message.step.1.continue=S\u00E9lectionnez un mod\u00E8le ou une image ISO pour continuer
+message.step.1.desc=S\u00E9lectionnez un mod\u00E8le pour votre nouvelle instance virtuelle. Vous pouvez \u00E9galement choisir un mod\u00E8le vierge sur lequel une image ISO pourra \u00EAtre install\u00E9e.
+message.step.2.continue=S\u00E9lectionnez une offre de service pour continuer
+message.step.3.continue=S\u00E9lectionnez un offre de service de disque pour continuer
+message.step.4.continue=S\u00E9lectionnez au moins un r\u00E9seau pour continuer
+message.step.4.desc=S\u00E9lectionnez le r\u00E9seau principal auquel votre instance va \u00EAtre connect\u00E9.
+message.storage.traffic=Trafic entre les ressources internes de CloudStack, incluant tous les composants qui communiquent avec le serveur d\\'administration, tels que les h\u00F4tes et les machines virtuelles Syst\u00E8mes CloudStack. Veuillez configurer le trafic de stockage ici.
+message.suspend.project=\u00CAtes-vous s\u00FBr de vouloir suspendre ce projet ?
+message.template.desc=Image OS pouvant \u00EAtre utilis\u00E9e pour d\u00E9marrer une VM
+message.tooltip.dns.1=Nom d\\'un serveur DNS utilis\u00E9 par les VM de la zone. Les adresses IP publiques de cette zone doivent avoir une route vers ce serveur.
+message.tooltip.dns.2=Nom d\\'un serveur DNS secondaire utilis\u00E9 par les VM de la zone. Les adresses IP publiques de cette zone doivent avoir une route vers ce serveur.
+message.tooltip.internal.dns.1=Nom d\\'un serveur DNS que CloudStack peut utiliser pour les VM syst\u00E8me dans cette zone. Les adresses IP priv\u00E9es des pods doivent avoir une route vers ce serveur.
+message.tooltip.internal.dns.2=Nom d\\'un serveur DNS que CloudStack peut utiliser pour les VM syst\u00E8me dans cette zone. Les adresses IP priv\u00E9es des pods doivent avoir une route vers ce serveur.
+message.tooltip.network.domain=Suffixe DNS qui cr\u00E9era un nom de domaine personnalis\u00E9 pour les r\u00E9seau accessible par les VM invit\u00E9es.
+message.tooltip.pod.name=Nom pour ce pod.
+message.tooltip.reserved.system.gateway=La passerelle pour les h\u00F4tes du pod.
+message.tooltip.reserved.system.netmask=Le pr\u00E9fixe r\u00E9seau utilis\u00E9 par le sous-r\u00E9seau du pod. Au format CIDR.
+message.tooltip.zone.name=Nom pour cette zone.
+message.update.os.preference=Choisissez votre OS pr\u00E9f\u00E9r\u00E9 pour cet h\u00F4te. Toutes les instances avec des pr\u00E9f\u00E9rences similaires seront d\\'abord allou\u00E9es \u00E0 cet h\u00F4te avant d\\'en choisir un autre.
+message.update.resource.count=Confirmer la mise \u00E0 jour des ressources pour ce compte.
+message.update.ssl=Soumettez un nouveau certificat SSL compatible X.509 qui sera mis \u00E0 jour sur l\\'ensemble de instance de proxy console.
+message.validate.instance.name=Le nom de l\\'instance ne peut d\u00E9passer 63 caract\u00E8res. Seuls les lettres de a \u00E0 z, les chiffres de 0 \u00E0 9 et les tirets sont accept\u00E9s. Le nom doit commencer par une lettre et se terminer par une lettre ou un chiffre.
+message.virtual.network.desc=Un r\u00E9seau virtuel d\u00E9di\u00E9 pour votre compte. Ce domaine de multi-diffusion est contenu dans un VLAN et l\\'ensemble des r\u00E9seaux d\\'acc\u00E8s publique sont rout\u00E9s par un routeur virtuel.
+message.vm.create.template.confirm=Cr\u00E9er un mod\u00E8le va red\u00E9marrer la VM automatiquement
+message.vm.review.launch=Merci de v\u00E9rifier les informations suivantes et de confirmer que votre instance virtuelle est correcte avant de la d\u00E9marrer.
+message.volume.create.template.confirm=Confirmez que vous souhaitez cr\u00E9er un mod\u00E8le pour ce disque. La cr\u00E9ation peut prendre plusieurs minutes, voire plus, selon la taille du volume.
+message.you.must.have.at.least.one.physical.network=Vous devez avoir au moins un r\u00E9seau physique
+message.zone.creation.complete.would.you.like.to.enable.this.zone=Cr\u00E9ation de la zone termin\u00E9e. Voulez-vous l\\'activer ?
+message.zone.no.network.selection=La zone s\u00E9lectionn\u00E9e ne propose pas le r\u00E9seau choisi
+message.zone.step.1.desc=S\u00E9lectionnez un mod\u00E8le de r\u00E9seau pour votre zone.
message.zone.step.2.desc=Renseigner les informations suivantes pour ajouter une nouvelle zone
message.zone.step.3.desc=Renseigner les informations suivantes pour ajouter un nouveau 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=Echec de l\'action car il n\'y a aucun élément sélectionné.
-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.
-#resizeVolumes
-label.resize.new.size=New Size(GB)
-label.action.resize.volume=Resize Volume
-label.action.resize.volume.processing=Resizing Volume....
-label.resize.new.offering.id=New Offering
-label.resize.shrink.ok=Shrink OK
+message.zoneWizard.enable.local.storage=ATTENTION \: si vous activez le stockage local pour cette zone, vous devez effectuer les op\u00E9rations suivantes, selon l\\'endroit o\u00F9 vous souhaitez lancer vos machines virtuelles Syst\u00E8mes \:
1. Si les machines virtuelles Syst\u00E8mes doivent \u00EAtre lanc\u00E9es depuis le stockage primaire, ce dernier doit \u00EAtre ajout\u00E9 \u00E0 la zone apr\u00E8s la cr\u00E9ation. Vous devez \u00E9galement d\u00E9marrer la zone dans un \u00E9tat d\u00E9sactiv\u00E9.
2. Si les machines virtuelles Syst\u00E8mes doivent \u00EAtre lanc\u00E9es depuis le stockage local, le param\u00E8tre system.vm.use.local.storage doit \u00EAtre d\u00E9fini \u00E0 \\'true\\' avant d\\'activer la zone.
Voulez-vous continuer ?
+mode=Mode
+network.rate=D\u00E9bit R\u00E9seau
+notification.reboot.instance=Red\u00E9marrer l\\'instance
+notification.start.instance=D\u00E9marrer l\\'instance
+notification.stop.instance=Stopper l\\'instance
+side.by.side=C\u00F4te \u00E0 c\u00F4te
+state.Accepted=Accept\u00E9
+state.Active=Actif
+state.Allocated=Allou\u00E9
+state.Allocating=Allocation en cours
+state.BackedUp=Sauvegard\u00E9
+state.BackingUp=Sauvegarde en cours
+state.Completed=Termin\u00E9
+state.Creating=Cr\u00E9ation en cours
+state.Declined=Refus\u00E9
+state.Destroyed=Supprim\u00E9e
+state.Disabled=D\u00E9sactiv\u00E9
+state.Enabled=Actifs
+state.Error=Erreur
+state.Expunging=Purge en cours
+state.Migrating=Migration en cours
+state.Pending=En attente
+state.Ready=Pr\u00EAt
+state.Running=D\u00E9marr\u00E9e
+state.Starting=D\u00E9marrage en cours
+state.Stopped=Arr\u00EAt\u00E9e
+state.Stopping=Arr\u00EAt en cours
+state.Suspended=Suspendu
+state.enabled=Actifs
+state.ready=Pr\u00EAt
+ui.listView.filters.all=Tous
+ui.listView.filters.mine=Mon
diff --git a/client/WEB-INF/web.xml b/client/WEB-INF/web.xml
index 0d75165659e..da2f13c8cf7 100644
--- a/client/WEB-INF/web.xml
+++ b/client/WEB-INF/web.xml
@@ -19,6 +19,14 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
+
+
+ log4jConfigLocation
+ classpath:log4j-cloud.xml
+
+
+ org.springframework.web.util.Log4jConfigListener
+
org.springframework.web.context.ContextLoaderListener
diff --git a/client/pom.xml b/client/pom.xml
index 0c37df3a5f5..cda6ab8b4e7 100644
--- a/client/pom.xml
+++ b/client/pom.xml
@@ -17,7 +17,7 @@
org.apache.cloudstack
cloudstack
- 4.1.0-SNAPSHOT
+ 4.2.0-SNAPSHOT
@@ -85,6 +85,16 @@
cloud-plugin-hypervisor-xen
${project.version}
+
+ org.apache.cloudstack
+ cloud-plugin-hypervisor-baremetal
+ ${project.version}
+
+
+ org.apache.cloudstack
+ cloud-plugin-hypervisor-ucs
+ ${project.version}
+
org.apache.cloudstack
cloud-plugin-hypervisor-ovm
@@ -229,9 +239,12 @@
-XX:MaxPermSize=512m -Xmx2g
- /client
${project.build.directory}/${project.build.finalName}/WEB-INF/web.xml
${project.build.directory}/${project.build.finalName}
+
+ /client
+ ${project.build.directory}/utilities/scripts/db/;${project.build.directory}/utilities/scripts/db/db/
+
@@ -255,6 +268,13 @@
+
+
+
+
+
+
+
@@ -267,12 +287,7 @@
-
-
-
-
+
@@ -291,7 +306,7 @@
+ value="${cs.replace.properties}" />
@@ -302,7 +317,7 @@
-
+
@@ -313,7 +328,7 @@
-
+
@@ -324,7 +339,7 @@
-
+
@@ -334,10 +349,26 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -368,8 +399,8 @@
test
+ match="classpath:componentContext.xml"
+ replace="classpath:nonossComponentContext.xml" byline="true" />
@@ -392,14 +423,14 @@
org.jasypt
jasypt
- 1.9.0`
+ 1.9.0
false
${project.build.directory}/pythonlibs
org.jasypt
jasypt
- 1.8`
+ 1.8
false
${project.build.directory}/pythonlibs
diff --git a/client/tomcatconf/applicationContext.xml.in b/client/tomcatconf/applicationContext.xml.in
index 9503a6c137e..6cec8b38223 100644
--- a/client/tomcatconf/applicationContext.xml.in
+++ b/client/tomcatconf/applicationContext.xml.in
@@ -37,7 +37,7 @@
-
+
+
-
-
+
-
diff --git a/client/tomcatconf/commands.properties.in b/client/tomcatconf/commands.properties.in
index e1d0fb20731..5018236e5e2 100644
--- a/client/tomcatconf/commands.properties.in
+++ b/client/tomcatconf/commands.properties.in
@@ -218,9 +218,13 @@ listZones=15
#### events commands
listEvents=15
listEventTypes=15
+archiveEvents=15
+deleteEvents=15
#### alerts commands
listAlerts=3
+archiveAlerts=1
+deleteAlerts=1
#### system capacity commands
listCapacity=3
@@ -326,6 +330,11 @@ addNicToVirtualMachine=15
removeNicFromVirtualMachine=15
updateDefaultNicForVirtualMachine=15
+####
+addIpToNic=15
+removeIpFromNic=15
+listNics=15
+
#### SSH key pair commands
registerSSHKeyPair=15
createSSHKeyPair=15
@@ -543,3 +552,6 @@ listVMSnapshot=15
createVMSnapshot=15
deleteVMSnapshot=15
revertToSnapshot=15
+
+#### Baremetal commands
+addBaremetalHost=1
diff --git a/client/tomcatconf/componentContext.xml.in b/client/tomcatconf/componentContext.xml.in
index c45ab1bd91b..7b64f49ee20 100644
--- a/client/tomcatconf/componentContext.xml.in
+++ b/client/tomcatconf/componentContext.xml.in
@@ -44,15 +44,22 @@
-
-
+
+
+
+
+
+
+
+
+
-
+
+
-
+
@@ -119,6 +136,14 @@
+
+
+
+
+
+
+
+
@@ -174,7 +199,14 @@
-
+
+
+
+
@@ -198,10 +230,18 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/client/tomcatconf/components-cloudzones.xml.in b/client/tomcatconf/components-cloudzones.xml.in
deleted file mode 100755
index 4bd39108e1f..00000000000
--- a/client/tomcatconf/components-cloudzones.xml.in
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
- true
-
-
-
diff --git a/client/tomcatconf/components-nonoss.xml.in b/client/tomcatconf/components-nonoss.xml.in
deleted file mode 100755
index fbfc5cc2726..00000000000
--- a/client/tomcatconf/components-nonoss.xml.in
+++ /dev/null
@@ -1,97 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- true
-
-
-
-
- true
-
-
-
-
-
-
diff --git a/client/tomcatconf/components.xml.in b/client/tomcatconf/components.xml.in
deleted file mode 100755
index c62abe8ff2a..00000000000
--- a/client/tomcatconf/components.xml.in
+++ /dev/null
@@ -1,309 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- true
-
-
-
- 1
- 25
- 50000
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- true
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/client/tomcatconf/log4j-cloud.xml.in b/client/tomcatconf/log4j-cloud.xml.in
index 02f70998d53..086669376aa 100755
--- a/client/tomcatconf/log4j-cloud.xml.in
+++ b/client/tomcatconf/log4j-cloud.xml.in
@@ -105,7 +105,7 @@ under the License.
-
+
diff --git a/client/tomcatconf/nonossComponentContext.xml.in b/client/tomcatconf/nonossComponentContext.xml.in
index 5532becba18..7e3552db67e 100644
--- a/client/tomcatconf/nonossComponentContext.xml.in
+++ b/client/tomcatconf/nonossComponentContext.xml.in
@@ -49,7 +49,7 @@
-
+
@@ -58,18 +58,25 @@
-
+
+
+
+
+
-
-
+
+
-
-
+
+
+
+
+
@@ -104,16 +111,21 @@
+
+
+
+
-
+
-
+
@@ -128,6 +140,10 @@
+
+
+
+
@@ -193,10 +209,11 @@
-
+
+
@@ -224,11 +241,10 @@
-
+
-
@@ -274,14 +290,6 @@
-
-
-
-
-
-
-
-
@@ -290,6 +298,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/client/tomcatconf/tomcat6-nonssl.conf.in b/client/tomcatconf/tomcat6-nonssl.conf.in
index d69d6ed94c0..4a9a70f619e 100644
--- a/client/tomcatconf/tomcat6-nonssl.conf.in
+++ b/client/tomcatconf/tomcat6-nonssl.conf.in
@@ -41,7 +41,7 @@ CATALINA_TMPDIR="@MSENVIRON@/temp"
# Use JAVA_OPTS to set java.library.path for libtcnative.so
#JAVA_OPTS="-Djava.library.path=/usr/lib64"
-JAVA_OPTS="-Djava.awt.headless=true -Dcom.sun.management.jmxremote.port=45219 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=@MSLOGDIR@ -XX:PermSize=256M"
+JAVA_OPTS="-Djava.awt.headless=true -Dcom.sun.management.jmxremote.port=45219 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Xmx2g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=@MSLOGDIR@ -XX:PermSize=512M -XX:MaxPermSize=800m"
# What user should run tomcat
TOMCAT_USER="@MSUSER@"
diff --git a/client/tomcatconf/tomcat6-ssl.conf.in b/client/tomcatconf/tomcat6-ssl.conf.in
index ecb93b23abc..84b6d6275bb 100644
--- a/client/tomcatconf/tomcat6-ssl.conf.in
+++ b/client/tomcatconf/tomcat6-ssl.conf.in
@@ -40,7 +40,7 @@ CATALINA_TMPDIR="@MSENVIRON@/temp"
# Use JAVA_OPTS to set java.library.path for libtcnative.so
#JAVA_OPTS="-Djava.library.path=/usr/lib64"
-JAVA_OPTS="-Djava.awt.headless=true -Djavax.net.ssl.trustStore=/etc/cloud/management/cloudmanagementserver.keystore -Djavax.net.ssl.trustStorePassword=vmops.com -Dcom.sun.management.jmxremote.port=45219 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=@MSLOGDIR@ -XX:PermSize=256M"
+JAVA_OPTS="-Djava.awt.headless=true -Djavax.net.ssl.trustStore=/etc/cloud/management/cloudmanagementserver.keystore -Djavax.net.ssl.trustStorePassword=vmops.com -Dcom.sun.management.jmxremote.port=45219 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Xmx2g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=@MSLOGDIR@ -XX:MaxPermSize=800m -XX:PermSize=512M"
# What user should run tomcat
TOMCAT_USER="@MSUSER@"
diff --git a/core/pom.xml b/core/pom.xml
index 3d6356e561e..0da69529400 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -23,7 +23,7 @@
org.apache.cloudstack
cloudstack
- 4.1.0-SNAPSHOT
+ 4.2.0-SNAPSHOT
@@ -31,7 +31,11 @@
cloud-api
${project.version}
-
+
+ org.apache.cloudstack
+ cloud-engine-api
+ ${project.version}
+
commons-httpclient
commons-httpclient
diff --git a/core/src/com/cloud/agent/api/NetworkRulesVmSecondaryIpCommand.java b/core/src/com/cloud/agent/api/NetworkRulesVmSecondaryIpCommand.java
new file mode 100644
index 00000000000..ce4080878a1
--- /dev/null
+++ b/core/src/com/cloud/agent/api/NetworkRulesVmSecondaryIpCommand.java
@@ -0,0 +1,71 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.agent.api;
+
+import com.cloud.vm.VirtualMachine;
+
+public class NetworkRulesVmSecondaryIpCommand extends Command {
+
+ private String vmName;
+ private VirtualMachine.Type type;
+ private String vmSecIp;
+ private String vmMac;
+ private String action;
+
+ public NetworkRulesVmSecondaryIpCommand(String vmName, VirtualMachine.Type type) {
+ this.vmName = vmName;
+ this.type = type;
+ }
+
+
+ public NetworkRulesVmSecondaryIpCommand(String vmName, String vmMac,
+ String secondaryIp, boolean action) {
+ this.vmName = vmName;
+ this.vmMac = vmMac;
+ this.vmSecIp = secondaryIp;
+ if (action) {
+ this.action = "-A";
+ } else {
+ this.action = "-D";
+ }
+ }
+
+ public String getVmName() {
+ return vmName;
+ }
+
+ public VirtualMachine.Type getType() {
+ return type;
+ }
+
+ public String getVmSecIp() {
+ return vmSecIp;
+ }
+
+ public String getVmMac() {
+ return vmMac;
+ }
+
+ public String getAction() {
+ return action;
+ }
+
+ @Override
+ public boolean executeInSequence() {
+ return false;
+ }
+}
diff --git a/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java b/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java
index fc7f08f76a2..7148e0710ca 100755
--- a/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java
+++ b/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java
@@ -600,6 +600,10 @@ public class VirtualRoutingResource implements Manager {
command.add("-6", cmd.getVmIp6Address());
command.add("-u", cmd.getDuid());
}
+
+ if (!cmd.isDefault()) {
+ command.add("-z");
+ }
final String result = command.execute();
return new Answer(cmd, result==null, result);
@@ -859,35 +863,29 @@ public class VirtualRoutingResource implements Manager {
}
public void assignVpcIpToRouter(final String routerIP, final boolean add, final String pubIP,
- final String nicname, final String gateway, final String netmask, final String subnet) throws Exception {
- try {
- String args = "";
+ final String nicname, final String gateway, final String netmask, final String subnet) throws InternalErrorException {
+ String args = "";
- if (add) {
- args += " -A ";
- } else {
- args += " -D ";
- }
+ if (add) {
+ args += " -A ";
+ } else {
+ args += " -D ";
+ }
- args += " -l ";
- args += pubIP;
- args += " -c ";
- args += nicname;
- args += " -g ";
- args += gateway;
- args += " -m ";
- args += netmask;
- args += " -n ";
- args += subnet;
+ args += " -l ";
+ args += pubIP;
+ args += " -c ";
+ args += nicname;
+ args += " -g ";
+ args += gateway;
+ args += " -m ";
+ args += netmask;
+ args += " -n ";
+ args += subnet;
- String result = routerProxy("vpc_ipassoc.sh", routerIP, args);
- if (result != null) {
- throw new InternalErrorException("KVM plugin \"vpc_ipassoc\" failed:"+result);
- }
- } catch (Exception e) {
- String msg = "Unable to assign public IP address due to " + e.toString();
- s_logger.warn(msg, e);
- throw new Exception(msg);
+ String result = routerProxy("vpc_ipassoc.sh", routerIP, args);
+ if (result != null) {
+ throw new InternalErrorException("KVM plugin \"vpc_ipassoc\" failed:"+result);
}
}
diff --git a/core/src/com/cloud/alert/AlertVO.java b/core/src/com/cloud/alert/AlertVO.java
index f6089d65043..3f014aa2b1f 100755
--- a/core/src/com/cloud/alert/AlertVO.java
+++ b/core/src/com/cloud/alert/AlertVO.java
@@ -28,9 +28,7 @@ import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
-import org.apache.cloudstack.api.Identity;
import com.cloud.utils.db.GenericDao;
-import org.apache.cloudstack.api.InternalIdentity;
@Entity
@Table(name="alert")
@@ -68,16 +66,19 @@ public class AlertVO implements Alert {
@Temporal(TemporalType.TIMESTAMP)
@Column(name="resolved", updatable=true, nullable=true)
private Date resolved;
-
+
@Column(name="uuid")
private String uuid;
+ @Column(name="archived")
+ private boolean archived;
+
public AlertVO() {
- this.uuid = UUID.randomUUID().toString();
+ this.uuid = UUID.randomUUID().toString();
}
public AlertVO(Long id) {
this.id = id;
- this.uuid = UUID.randomUUID().toString();
+ this.uuid = UUID.randomUUID().toString();
}
@Override
@@ -103,12 +104,12 @@ public class AlertVO implements Alert {
}
public Long getClusterId() {
- return clusterId;
- }
- public void setClusterId(Long clusterId) {
- this.clusterId = clusterId;
- }
- @Override
+ return clusterId;
+ }
+ public void setClusterId(Long clusterId) {
+ this.clusterId = clusterId;
+ }
+ @Override
public Long getPodId() {
return podId;
}
@@ -164,10 +165,19 @@ public class AlertVO implements Alert {
@Override
public String getUuid() {
- return this.uuid;
+ return this.uuid;
}
-
+
public void setUuid(String uuid) {
- this.uuid = uuid;
+ this.uuid = uuid;
+ }
+
+ @Override
+ public boolean getArchived() {
+ return archived;
+ }
+
+ public void setArchived(Boolean archived) {
+ this.archived = archived;
}
}
diff --git a/core/src/com/cloud/event/EventVO.java b/core/src/com/cloud/event/EventVO.java
index ac46f24b2ee..2c30eadebdc 100644
--- a/core/src/com/cloud/event/EventVO.java
+++ b/core/src/com/cloud/event/EventVO.java
@@ -29,74 +29,75 @@ import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient;
-import org.apache.cloudstack.api.Identity;
import com.cloud.utils.db.GenericDao;
-import org.apache.cloudstack.api.InternalIdentity;
@Entity
@Table(name="event")
public class EventVO implements Event {
- @Id
+ @Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
- private long id = -1;
+ private long id = -1;
- @Column(name="type")
- private String type;
-
- @Enumerated(value=EnumType.STRING)
- @Column(name="state")
+ @Column(name="type")
+ private String type;
+
+ @Enumerated(value=EnumType.STRING)
+ @Column(name="state")
private State state = State.Completed;
- @Column(name="description", length=1024)
- private String description;
+ @Column(name="description", length=1024)
+ private String description;
- @Column(name=GenericDao.CREATED_COLUMN)
- private Date createDate;
+ @Column(name=GenericDao.CREATED_COLUMN)
+ private Date createDate;
@Column(name="user_id")
private long userId;
- @Column(name="account_id")
- private long accountId;
+ @Column(name="account_id")
+ private long accountId;
@Column(name="domain_id")
private long domainId;
- @Column(name="level")
- private String level = LEVEL_INFO;
-
- @Column(name="start_id")
+ @Column(name="level")
+ private String level = LEVEL_INFO;
+
+ @Column(name="start_id")
private long startId;
- @Column(name="parameters", length=1024)
- private String parameters;
-
- @Column(name="uuid")
- private String uuid;
+ @Column(name="parameters", length=1024)
+ private String parameters;
- @Transient
- private int totalSize;
+ @Column(name="uuid")
+ private String uuid;
- public static final String LEVEL_INFO = "INFO";
- public static final String LEVEL_WARN = "WARN";
- public static final String LEVEL_ERROR = "ERROR";
-
- public EventVO() {
- this.uuid = UUID.randomUUID().toString();
- }
-
- public long getId() {
- return id;
- }
- @Override
+ @Column(name="archived")
+ private boolean archived;
+
+ @Transient
+ private int totalSize;
+
+ public static final String LEVEL_INFO = "INFO";
+ public static final String LEVEL_WARN = "WARN";
+ public static final String LEVEL_ERROR = "ERROR";
+
+ public EventVO() {
+ this.uuid = UUID.randomUUID().toString();
+ }
+
+ public long getId() {
+ return id;
+ }
+ @Override
public String getType() {
- return type;
- }
- public void setType(String type) {
- this.type = type;
- }
- @Override
+ return type;
+ }
+ public void setType(String type) {
+ this.type = type;
+ }
+ @Override
public State getState() {
return state;
}
@@ -105,27 +106,27 @@ public class EventVO implements Event {
this.state = state;
}
- @Override
+ @Override
public String getDescription() {
- return description;
- }
- public void setDescription(String description) {
- this.description = description;
- }
- @Override
+ return description;
+ }
+ public void setDescription(String description) {
+ this.description = description;
+ }
+ @Override
public Date getCreateDate() {
- return createDate;
- }
- public void setCreatedDate(Date createdDate) {
- createDate = createdDate;
- }
- @Override
+ return createDate;
+ }
+ public void setCreatedDate(Date createdDate) {
+ createDate = createdDate;
+ }
+ @Override
public long getUserId() {
- return userId;
- }
- public void setUserId(long userId) {
- this.userId = userId;
- }
+ return userId;
+ }
+ public void setUserId(long userId) {
+ this.userId = userId;
+ }
@Override
public long getAccountId() {
return accountId;
@@ -165,21 +166,29 @@ public class EventVO implements Event {
this.startId = startId;
}
- @Override
+ @Override
public String getParameters() {
- return parameters;
- }
- public void setParameters(String parameters) {
- this.parameters = parameters;
- }
-
- @Override
- public String getUuid() {
- return this.uuid;
- }
-
- public void setUuid(String uuid) {
- this.uuid = uuid;
- }
+ return parameters;
+ }
+ public void setParameters(String parameters) {
+ this.parameters = parameters;
+ }
+ @Override
+ public String getUuid() {
+ return this.uuid;
+ }
+
+ public void setUuid(String uuid) {
+ this.uuid = uuid;
+ }
+
+ @Override
+ public boolean getArchived() {
+ return archived;
+ }
+
+ public void setArchived(Boolean archived) {
+ this.archived = archived;
+ }
}
diff --git a/core/src/com/cloud/event/dao/EventDao.java b/core/src/com/cloud/event/dao/EventDao.java
index bfcb818f20f..da5f47a90b4 100644
--- a/core/src/com/cloud/event/dao/EventDao.java
+++ b/core/src/com/cloud/event/dao/EventDao.java
@@ -30,4 +30,9 @@ public interface EventDao extends GenericDao {
public List listOlderEvents(Date oldTime);
EventVO findCompletedEvent(long startId);
+
+ public List listToArchiveOrDeleteEvents(List ids, String type, Date olderThan, Long accountId);
+
+ public void archiveEvents(List events);
+
}
diff --git a/core/src/com/cloud/event/dao/EventDaoImpl.java b/core/src/com/cloud/event/dao/EventDaoImpl.java
index 44fbb030dcc..6ba59c56b0a 100644
--- a/core/src/com/cloud/event/dao/EventDaoImpl.java
+++ b/core/src/com/cloud/event/dao/EventDaoImpl.java
@@ -30,24 +30,34 @@ import com.cloud.utils.db.Filter;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.SearchCriteria.Op;
@Component
@Local(value={EventDao.class})
public class EventDaoImpl extends GenericDaoBase implements EventDao {
- public static final Logger s_logger = Logger.getLogger(EventDaoImpl.class.getName());
- protected final SearchBuilder CompletedEventSearch;
-
- public EventDaoImpl () {
- CompletedEventSearch = createSearchBuilder();
- CompletedEventSearch.and("state",CompletedEventSearch.entity().getState(),SearchCriteria.Op.EQ);
- CompletedEventSearch.and("startId", CompletedEventSearch.entity().getStartId(), SearchCriteria.Op.EQ);
- CompletedEventSearch.done();
- }
+ public static final Logger s_logger = Logger.getLogger(EventDaoImpl.class.getName());
+ protected final SearchBuilder CompletedEventSearch;
+ protected final SearchBuilder ToArchiveOrDeleteEventSearch;
- @Override
- public List searchAllEvents(SearchCriteria sc, Filter filter) {
- return listIncludingRemovedBy(sc, filter);
- }
+ public EventDaoImpl () {
+ CompletedEventSearch = createSearchBuilder();
+ CompletedEventSearch.and("state",CompletedEventSearch.entity().getState(),SearchCriteria.Op.EQ);
+ CompletedEventSearch.and("startId", CompletedEventSearch.entity().getStartId(), SearchCriteria.Op.EQ);
+ CompletedEventSearch.done();
+
+ ToArchiveOrDeleteEventSearch = createSearchBuilder();
+ ToArchiveOrDeleteEventSearch.and("id", ToArchiveOrDeleteEventSearch.entity().getId(), Op.IN);
+ ToArchiveOrDeleteEventSearch.and("type", ToArchiveOrDeleteEventSearch.entity().getType(), Op.EQ);
+ ToArchiveOrDeleteEventSearch.and("accountId", ToArchiveOrDeleteEventSearch.entity().getAccountId(), Op.EQ);
+ ToArchiveOrDeleteEventSearch.and("createDateL", ToArchiveOrDeleteEventSearch.entity().getCreateDate(), Op.LT);
+ ToArchiveOrDeleteEventSearch.done();
+ }
+
+ @Override
+ public List searchAllEvents(SearchCriteria sc, Filter filter) {
+ return listIncludingRemovedBy(sc, filter);
+ }
@Override
public List listOlderEvents(Date oldTime) {
@@ -55,9 +65,8 @@ public class EventDaoImpl extends GenericDaoBase implements Event
SearchCriteria sc = createSearchCriteria();
sc.addAnd("createDate", SearchCriteria.Op.LT, oldTime);
return listIncludingRemovedBy(sc, null);
-
}
-
+
@Override
public EventVO findCompletedEvent(long startId) {
SearchCriteria sc = CompletedEventSearch.create();
@@ -65,4 +74,36 @@ public class EventDaoImpl extends GenericDaoBase implements Event
sc.setParameters("startId", startId);
return findOneIncludingRemovedBy(sc);
}
+
+ @Override
+ public List listToArchiveOrDeleteEvents(List ids, String type, Date olderThan, Long accountId) {
+ SearchCriteria sc = ToArchiveOrDeleteEventSearch.create();
+ if (ids != null) {
+ sc.setParameters("id", ids.toArray(new Object[ids.size()]));
+ }
+ if (type != null) {
+ sc.setParameters("type", type);
+ }
+ if (olderThan != null) {
+ sc.setParameters("createDateL", olderThan);
+ }
+ if (accountId != null) {
+ sc.setParameters("accountId", accountId);
+ }
+ return search(sc, null);
+ }
+
+ @Override
+ public void archiveEvents(List events) {
+
+ Transaction txn = Transaction.currentTxn();
+ txn.start();
+ for (EventVO event : events) {
+ event = lockRow(event.getId(), true);
+ event.setArchived(true);
+ update(event.getId(), event);
+ txn.commit();
+ }
+ txn.close();
+ }
}
diff --git a/core/src/com/cloud/hypervisor/HypervisorCapabilitiesVO.java b/core/src/com/cloud/hypervisor/HypervisorCapabilitiesVO.java
index 56e8e0a734d..b525a2d05d5 100644
--- a/core/src/com/cloud/hypervisor/HypervisorCapabilitiesVO.java
+++ b/core/src/com/cloud/hypervisor/HypervisorCapabilitiesVO.java
@@ -59,6 +59,9 @@ public class HypervisorCapabilitiesVO implements HypervisorCapabilities {
@Column(name="max_data_volumes_limit")
private Integer maxDataVolumesLimit;
+ @Column(name="max_hosts_per_cluster")
+ private Integer maxHostsPerCluster;
+
protected HypervisorCapabilitiesVO() {
this.uuid = UUID.randomUUID().toString();
}
@@ -157,6 +160,15 @@ public class HypervisorCapabilitiesVO implements HypervisorCapabilities {
this.maxDataVolumesLimit = maxDataVolumesLimit;
}
+ @Override
+ public Integer getMaxHostsPerCluster() {
+ return maxHostsPerCluster;
+ }
+
+ public void setMaxHostsPerCluster(Integer maxHostsPerCluster) {
+ this.maxHostsPerCluster = maxHostsPerCluster;
+ }
+
@Override
public boolean equals(Object obj) {
if (obj instanceof HypervisorCapabilitiesVO) {
diff --git a/core/src/com/cloud/resource/storage/PrimaryStorageHeadResource.java b/core/src/com/cloud/resource/storage/PrimaryStorageHeadResource.java
deleted file mode 100644
index 65297a39b96..00000000000
--- a/core/src/com/cloud/resource/storage/PrimaryStorageHeadResource.java
+++ /dev/null
@@ -1,52 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License. You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied. See the License for the
-// specific language governing permissions and limitations
-// under the License.
-package com.cloud.resource.storage;
-
-import com.cloud.agent.api.storage.CreateAnswer;
-import com.cloud.agent.api.storage.CreateCommand;
-import com.cloud.agent.api.storage.DestroyAnswer;
-import com.cloud.agent.api.storage.DestroyCommand;
-import com.cloud.agent.api.storage.DownloadAnswer;
-import com.cloud.agent.api.storage.PrimaryStorageDownloadCommand;
-import com.cloud.resource.ServerResource;
-
-/**
- * a primary storage.
- *
- */
-public interface PrimaryStorageHeadResource extends ServerResource {
- /**
- * Downloads the template to the primary storage.
- * @param cmd
- * @return
- */
- DownloadAnswer execute(PrimaryStorageDownloadCommand cmd);
-
- /**
- * Creates volumes for the VM.
- * @param cmd
- * @return
- */
- CreateAnswer execute(CreateCommand cmd);
-
- /**
- * Destroys volumes for the VM.
- * @param cmd
- * @return
- */
- DestroyAnswer execute(DestroyCommand cmd);
-}
diff --git a/core/src/com/cloud/storage/DiskOfferingVO.java b/core/src/com/cloud/storage/DiskOfferingVO.java
index 5f4f18bcd34..e4fc21c7c13 100755
--- a/core/src/com/cloud/storage/DiskOfferingVO.java
+++ b/core/src/com/cloud/storage/DiskOfferingVO.java
@@ -311,4 +311,8 @@ public class DiskOfferingVO implements DiskOffering {
public int getSortKey() {
return sortKey;
}
+
+ public void setRecreatable(boolean recreatable) {
+ this.recreatable = recreatable;
+ }
}
diff --git a/core/src/com/cloud/storage/SnapshotVO.java b/core/src/com/cloud/storage/SnapshotVO.java
index 68336cb97ec..78b96ec9779 100644
--- a/core/src/com/cloud/storage/SnapshotVO.java
+++ b/core/src/com/cloud/storage/SnapshotVO.java
@@ -117,7 +117,7 @@ public class SnapshotVO implements Snapshot {
this.snapshotType = snapshotType;
this.typeDescription = typeDescription;
this.size = size;
- this.state = State.Creating;
+ this.state = State.Allocated;
this.prevSnapshotId = 0;
this.hypervisorType = hypervisorType;
this.version = "2.2";
@@ -175,7 +175,7 @@ public class SnapshotVO implements Snapshot {
}
@Override
- public Type getType() {
+ public Type getRecurringType() {
if (snapshotType < 0 || snapshotType >= Type.values().length) {
return null;
}
@@ -248,6 +248,7 @@ public class SnapshotVO implements Snapshot {
return state;
}
+
public void setState(State state) {
this.state = state;
}
diff --git a/core/src/com/cloud/storage/StoragePoolDiscoverer.java b/core/src/com/cloud/storage/StoragePoolDiscoverer.java
index 816e899f941..c7dd362a5c3 100644
--- a/core/src/com/cloud/storage/StoragePoolDiscoverer.java
+++ b/core/src/com/cloud/storage/StoragePoolDiscoverer.java
@@ -19,6 +19,8 @@ package com.cloud.storage;
import java.net.URI;
import java.util.Map;
+import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
+
import com.cloud.exception.DiscoveryException;
import com.cloud.utils.component.Adapter;
diff --git a/core/src/com/cloud/storage/StoragePoolVO.java b/core/src/com/cloud/storage/StoragePoolVO.java
deleted file mode 100644
index af6e4e2905c..00000000000
--- a/core/src/com/cloud/storage/StoragePoolVO.java
+++ /dev/null
@@ -1,346 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License. You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied. See the License for the
-// specific language governing permissions and limitations
-// under the License.
-package com.cloud.storage;
-
-import java.util.Date;
-import java.util.UUID;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-import javax.persistence.Transient;
-
-import com.cloud.storage.Storage.StoragePoolType;
-import com.cloud.utils.db.GenericDao;
-
-@Entity
-@Table(name="storage_pool")
-public class StoragePoolVO implements StoragePool {
- @Id
- @TableGenerator(name="storage_pool_sq", table="sequence", pkColumnName="name", valueColumnName="value", pkColumnValue="storage_pool_seq", allocationSize=1)
- @Column(name="id", updatable=false, nullable = false)
- private long id;
-
- @Column(name="name", updatable=false, nullable=false, length=255)
- private String name = null;
-
- @Column(name="uuid", length=255)
- private String uuid = null;
-
- @Column(name="pool_type", updatable=false, nullable=false, length=32)
- @Enumerated(value=EnumType.STRING)
- private StoragePoolType poolType;
-
- @Column(name=GenericDao.CREATED_COLUMN)
- Date created;
-
- @Column(name=GenericDao.REMOVED_COLUMN)
- private Date removed;
-
- @Column(name="update_time", updatable=true)
- @Temporal(value=TemporalType.TIMESTAMP)
- private Date updateTime;
-
- @Column(name="data_center_id", updatable=true, nullable=false)
- private long dataCenterId;
-
- @Column(name="pod_id", updatable=true)
- private Long podId;
-
- @Column(name="available_bytes", updatable=true, nullable=true)
- private long availableBytes;
-
- @Column(name="capacity_bytes", updatable=true, nullable=true)
- private long capacityBytes;
-
- @Column(name="status", updatable=true, nullable=false)
- @Enumerated(value=EnumType.STRING)
- private StoragePoolStatus status;
-
- // TODO, disable persisency of storageProvider and storageType, javelin new code not
- // sync with the schema!
-
- // @Column(name="storage_provider", updatable=true, nullable=false)
- @Transient private String storageProvider;
-
- // Column(name="storage_type", nullable=false)
- @Transient private String storageType;
-
- @Override
- public long getId() {
- return id;
- }
-
- @Override
- public StoragePoolStatus getStatus() {
- return status;
- }
-
- public StoragePoolVO() {
- // TODO Auto-generated constructor stub
- }
-
- @Override
- public String getName() {
- return name;
- }
-
- @Override
- public String getUuid() {
- return uuid;
- }
-
- @Override
- public StoragePoolType getPoolType() {
- return poolType;
- }
-
- @Override
- public Date getCreated() {
- return created;
- }
-
- public Date getRemoved() {
- return removed;
- }
-
- @Override
- public Date getUpdateTime() {
- return updateTime;
- }
-
- @Override
- public long getDataCenterId() {
- return dataCenterId;
- }
-
- @Override
- public long getAvailableBytes() {
- return availableBytes;
- }
-
- @Override
- public String getStorageProvider() {
- return storageProvider;
- }
-
- public void setStorageProvider(String provider) {
- storageProvider = provider;
- }
-
- @Override
- public String getStorageType() {
- return storageType;
- }
-
- public void setStorageType(String type) {
- storageType = type;
- }
-
- @Override
- public long getCapacityBytes() {
- return capacityBytes;
- }
-
- public void setAvailableBytes(long available) {
- availableBytes = available;
- }
-
- public void setCapacityBytes(long capacity) {
- capacityBytes = capacity;
- }
-
- @Column(name="host_address")
- private String hostAddress;
-
- @Column(name="path")
- private String path;
-
- @Column(name="port")
- private int port;
-
- @Column(name="user_info")
- private String userInfo;
-
- @Column(name="cluster_id")
- private Long clusterId;
-
-
- @Override
- public Long getClusterId() {
- return clusterId;
- }
-
- public void setClusterId(Long clusterId) {
- this.clusterId = clusterId;
- }
-
- @Override
- public String getHostAddress() {
- return hostAddress;
- }
-
- @Override
- public String getPath() {
- return path;
- }
-
- @Override
- public String getUserInfo() {
- return userInfo;
- }
-
- public StoragePoolVO(long poolId, String name, String uuid, StoragePoolType type,
- long dataCenterId, Long podId, long availableBytes, long capacityBytes, String hostAddress, int port, String hostPath) {
- this.name = name;
- this.id = poolId;
- this.uuid = uuid;
- this.poolType = type;
- this.dataCenterId = dataCenterId;
- this.availableBytes = availableBytes;
- this.capacityBytes = capacityBytes;
- this.hostAddress = hostAddress;
- this.path = hostPath;
- this.port = port;
- this.podId = podId;
- this.setStatus(StoragePoolStatus.Creating);
- }
-
- public StoragePoolVO(StoragePoolVO that) {
- this(that.id, that.name, that.uuid, that.poolType, that.dataCenterId, that.podId, that.availableBytes, that.capacityBytes, that.hostAddress, that.port, that.path);
- }
-
- public StoragePoolVO(StoragePoolType type, String hostAddress, int port, String path) {
- this.poolType = type;
- this.hostAddress = hostAddress;
- this.port = port;
- this.path = path;
- this.setStatus(StoragePoolStatus.Creating);
- this.uuid = UUID.randomUUID().toString();
- }
-
- public StoragePoolVO(StoragePoolType type, String hostAddress, int port, String path, String userInfo) {
- this.poolType = type;
- this.hostAddress = hostAddress;
- this.port = port;
- this.path = path;
- this.userInfo = userInfo;
- this.setStatus(StoragePoolStatus.Creating);
- this.uuid = UUID.randomUUID().toString();
- }
-
- public void setStatus(StoragePoolStatus status)
- {
- this.status = status;
- }
-
- public void setId(long id) {
- this.id = id;
- }
-
- public void setDataCenterId(long dcId) {
- this.dataCenterId = dcId;
- }
-
- public void setPodId(Long podId) {
- this.podId = podId;
- }
-
- public void setUuid(String uuid) {
- this.uuid = uuid;
- }
-
- public void setPath(String path) {
- this.path = path;
- }
-
- public void setUserInfo(String userInfo) {
- this.userInfo = userInfo;
- }
-
- @Override
- public int getPort() {
- return port;
- }
-
- @Override
- public boolean isShared() {
- return poolType.isShared();
- }
-
- @Override
- public boolean isLocal() {
- return !poolType.isShared();
- }
-
- @Transient
- public String toUri() {
- /*
- URI uri = new URI();
- try {
- if (type == StoragePoolType.Filesystem) {
- uri.setScheme("file");
- } else if (type == StoragePoolType.NetworkFilesystem) {
- uri.setScheme("nfs");
- } else if (type == StoragePoolType.IscsiLUN) {
- }
- } catch (MalformedURIException e) {
- throw new VmopsRuntimeException("Unable to form the uri " + id);
- }
- return uri.toString();
- */
- return null;
- }
-
- @Override
- public Long getPodId() {
- return podId;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public boolean isInMaintenance() {
- return status == StoragePoolStatus.PrepareForMaintenance || status == StoragePoolStatus.Maintenance || status == StoragePoolStatus.ErrorInMaintenance || removed != null;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (!(obj instanceof StoragePoolVO) || obj == null) {
- return false;
- }
- StoragePoolVO that = (StoragePoolVO)obj;
- return this.id == that.id;
- }
-
- @Override
- public int hashCode() {
- return new Long(id).hashCode();
- }
-
- @Override
- public String toString() {
- return new StringBuilder("Pool[").append(id).append("|").append(poolType).append("]").toString();
- }
-}
diff --git a/core/src/com/cloud/storage/VMTemplateHostVO.java b/core/src/com/cloud/storage/VMTemplateHostVO.java
index 9eae1a00303..b8dfc41d51b 100755
--- a/core/src/com/cloud/storage/VMTemplateHostVO.java
+++ b/core/src/com/cloud/storage/VMTemplateHostVO.java
@@ -29,8 +29,10 @@ import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore;
+import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
+
import com.cloud.utils.db.GenericDaoBase;
-import org.apache.cloudstack.api.InternalIdentity;
/**
* Join table for storage hosts and templates
@@ -38,7 +40,7 @@ import org.apache.cloudstack.api.InternalIdentity;
*/
@Entity
@Table(name="template_host_ref")
-public class VMTemplateHostVO implements VMTemplateStorageResourceAssoc {
+public class VMTemplateHostVO implements VMTemplateStorageResourceAssoc, DataObjectInStore {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
Long id;
@@ -90,6 +92,18 @@ public class VMTemplateHostVO implements VMTemplateStorageResourceAssoc {
@Column(name="destroyed")
boolean destroyed = false;
+ @Column(name="update_count", updatable = true, nullable=false)
+ protected long updatedCount;
+
+ @Column(name = "updated")
+ @Temporal(value = TemporalType.TIMESTAMP)
+ Date updated;
+
+ @Column(name = "state")
+ @Enumerated(EnumType.STRING)
+ ObjectInDataStoreStateMachine.State state;
+
+
@Override
public String getInstallPath() {
return installPath;
@@ -162,6 +176,7 @@ public class VMTemplateHostVO implements VMTemplateStorageResourceAssoc {
super();
this.hostId = hostId;
this.templateId = templateId;
+ this.state = ObjectInDataStoreStateMachine.State.Allocated;
}
public VMTemplateHostVO(long hostId, long templateId, Date lastUpdated,
@@ -282,4 +297,26 @@ public class VMTemplateHostVO implements VMTemplateStorageResourceAssoc {
return new StringBuilder("TmplHost[").append(id).append("-").append(templateId).append("-").append(hostId).append(installPath).append("]").toString();
}
+ @Override
+ public ObjectInDataStoreStateMachine.State getState() {
+ // TODO Auto-generated method stub
+ return this.state;
+ }
+
+ public long getUpdatedCount() {
+ return this.updatedCount;
+ }
+
+ public void incrUpdatedCount() {
+ this.updatedCount++;
+ }
+
+ public void decrUpdatedCount() {
+ this.updatedCount--;
+ }
+
+ public Date getUpdated() {
+ return updated;
+ }
+
}
diff --git a/core/src/com/cloud/storage/VMTemplateStoragePoolVO.java b/core/src/com/cloud/storage/VMTemplateStoragePoolVO.java
index 32c9dd2ece5..9b761764359 100644
--- a/core/src/com/cloud/storage/VMTemplateStoragePoolVO.java
+++ b/core/src/com/cloud/storage/VMTemplateStoragePoolVO.java
@@ -29,8 +29,11 @@ import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore;
+import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
+import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State;
+
import com.cloud.utils.db.GenericDaoBase;
-import org.apache.cloudstack.api.InternalIdentity;
/**
* Join table for storage pools and templates
@@ -38,7 +41,7 @@ import org.apache.cloudstack.api.InternalIdentity;
*/
@Entity
@Table(name="template_spool_ref")
-public class VMTemplateStoragePoolVO implements VMTemplateStorageResourceAssoc {
+public class VMTemplateStoragePoolVO implements VMTemplateStorageResourceAssoc, DataObjectInStore {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
long id;
@@ -69,7 +72,18 @@ public class VMTemplateStoragePoolVO implements VMTemplateStorageResourceAssoc {
@Column (name="template_size") long templateSize;
@Column (name="marked_for_gc") boolean markedForGC;
-
+
+ @Column(name="update_count", updatable = true, nullable=false)
+ protected long updatedCount;
+
+ @Column(name = "updated")
+ @Temporal(value = TemporalType.TIMESTAMP)
+ Date updated;
+
+ @Column(name = "state")
+ @Enumerated(EnumType.STRING)
+ ObjectInDataStoreStateMachine.State state;
+
@Override
public String getInstallPath() {
return installPath;
@@ -148,6 +162,7 @@ public class VMTemplateStoragePoolVO implements VMTemplateStorageResourceAssoc {
this.poolId = poolId;
this.templateId = templateId;
this.downloadState = Status.NOT_DOWNLOADED;
+ this.state = ObjectInDataStoreStateMachine.State.Allocated;
this.markedForGC = false;
}
@@ -235,4 +250,26 @@ public class VMTemplateStoragePoolVO implements VMTemplateStorageResourceAssoc {
return new StringBuilder("TmplPool[").append(id).append("-").append(templateId).append("-").append("poolId").append("-").append(installPath).append("]").toString();
}
+ @Override
+ public State getState() {
+ return this.state;
+ }
+
+ public long getUpdatedCount() {
+ return this.updatedCount;
+ }
+
+ public void incrUpdatedCount() {
+ this.updatedCount++;
+ }
+
+ public void decrUpdatedCount() {
+ this.updatedCount--;
+ }
+
+ public Date getUpdated() {
+ return updated;
+ }
+
+
}
diff --git a/core/src/com/cloud/storage/VMTemplateVO.java b/core/src/com/cloud/storage/VMTemplateVO.java
index fcfdd0067e1..e643d75bf1e 100755
--- a/core/src/com/cloud/storage/VMTemplateVO.java
+++ b/core/src/com/cloud/storage/VMTemplateVO.java
@@ -31,17 +31,18 @@ import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
-import org.apache.cloudstack.api.Identity;
+import org.apache.cloudstack.engine.subsystem.api.storage.TemplateState;
+
import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.storage.Storage.ImageFormat;
import com.cloud.storage.Storage.TemplateType;
import com.cloud.template.VirtualMachineTemplate;
import com.cloud.utils.db.GenericDao;
-import org.apache.cloudstack.api.InternalIdentity;
+import com.cloud.utils.fsm.StateObject;
@Entity
@Table(name="vm_template")
-public class VMTemplateVO implements VirtualMachineTemplate {
+public class VMTemplateVO implements VirtualMachineTemplate, StateObject {
@Id
@TableGenerator(name="vm_template_sq", table="sequence", pkColumnName="name", valueColumnName="value", pkColumnValue="vm_template_seq", allocationSize=1)
@Column(name="id", nullable = false)
@@ -127,6 +128,22 @@ public class VMTemplateVO implements VirtualMachineTemplate {
@Column(name="enable_sshkey")
private boolean enableSshKey;
+
+ @Column(name = "image_data_store_id")
+ private long imageDataStoreId;
+
+ @Column(name = "size")
+ private Long size;
+
+ @Column(name = "state")
+ private TemplateState state;
+
+ @Column(name="update_count", updatable = true)
+ protected long updatedCount;
+
+ @Column(name = "updated")
+ @Temporal(value = TemporalType.TIMESTAMP)
+ Date updated;
@Transient
Map details;
@@ -140,8 +157,9 @@ public class VMTemplateVO implements VirtualMachineTemplate {
this.uniqueName = uniqueName;
}
- protected VMTemplateVO() {
+ public VMTemplateVO() {
this.uuid = UUID.randomUUID().toString();
+ this.state = TemplateState.Allocated;
}
/**
@@ -150,12 +168,14 @@ public class VMTemplateVO implements VirtualMachineTemplate {
public VMTemplateVO(long id, String name, ImageFormat format, boolean isPublic, boolean featured, boolean isExtractable, TemplateType type, String url, boolean requiresHvm, int bits, long accountId, String cksum, String displayText, boolean enablePassword, long guestOSId, boolean bootable, HypervisorType hyperType, Map details) {
this(id, generateUniqueName(id, accountId, name), name, format, isPublic, featured, isExtractable, type, url, null, requiresHvm, bits, accountId, cksum, displayText, enablePassword, guestOSId, bootable, hyperType, details);
this.uuid = UUID.randomUUID().toString();
+ this.state = TemplateState.Allocated;
}
public VMTemplateVO(long id, String name, ImageFormat format, boolean isPublic, boolean featured, boolean isExtractable, TemplateType type, String url, boolean requiresHvm, int bits, long accountId, String cksum, String displayText, boolean enablePassword, long guestOSId, boolean bootable, HypervisorType hyperType, String templateTag, Map details, boolean sshKeyEnabled) {
this(id, name, format, isPublic, featured, isExtractable, type, url, requiresHvm, bits, accountId, cksum, displayText, enablePassword, guestOSId, bootable, hyperType, details);
this.templateTag = templateTag;
this.uuid = UUID.randomUUID().toString();
+ this.state = TemplateState.Allocated;
this.enableSshKey = sshKeyEnabled;
}
@@ -179,6 +199,7 @@ public class VMTemplateVO implements VirtualMachineTemplate {
this.bootable = bootable;
this.hypervisorType = hyperType;
this.uuid = UUID.randomUUID().toString();
+ this.state = TemplateState.Allocated;
}
// Has an extra attribute - isExtractable
@@ -468,5 +489,46 @@ public class VMTemplateVO implements VirtualMachineTemplate {
public void setEnableSshKey(boolean enable) {
enableSshKey = enable;
}
+
+ public Long getImageDataStoreId() {
+ return this.imageDataStoreId;
+ }
+
+ public void setImageDataStoreId(long dataStoreId) {
+ this.imageDataStoreId = dataStoreId;
+ }
+
+ public void setSize(Long size) {
+ this.size = size;
+ }
+
+ public Long getSize() {
+ return this.size;
+ }
+
+ public TemplateState getState() {
+ return this.state;
+ }
+
+ public long getUpdatedCount() {
+ return this.updatedCount;
+ }
+
+ public void incrUpdatedCount() {
+ this.updatedCount++;
+ }
+
+ public void decrUpdatedCount() {
+ this.updatedCount--;
+ }
+
+ public Date getUpdated() {
+ return updated;
+ }
+
+ public void setUpdated(Date updated) {
+ this.updated = updated;
+ }
+
}
diff --git a/core/src/com/cloud/storage/VolumeHostVO.java b/core/src/com/cloud/storage/VolumeHostVO.java
index f4fc7abc4ee..40bae499122 100755
--- a/core/src/com/cloud/storage/VolumeHostVO.java
+++ b/core/src/com/cloud/storage/VolumeHostVO.java
@@ -29,11 +29,13 @@ import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
-//import com.cloud.storage.VMVolumeStorageResourceAssoc.Status;
+import org.apache.cloudstack.api.InternalIdentity;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore;
+import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
+
import com.cloud.storage.Storage.ImageFormat;
import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
import com.cloud.utils.db.GenericDaoBase;
-import org.apache.cloudstack.api.InternalIdentity;
/**
* Join table for storage hosts and volumes
@@ -41,7 +43,7 @@ import org.apache.cloudstack.api.InternalIdentity;
*/
@Entity
@Table(name="volume_host_ref")
-public class VolumeHostVO implements InternalIdentity {
+public class VolumeHostVO implements InternalIdentity, DataObjectInStore {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
Long id;
@@ -99,6 +101,16 @@ public class VolumeHostVO implements InternalIdentity {
@Column(name="destroyed")
boolean destroyed = false;
+ @Column(name="update_count", updatable = true, nullable=false)
+ protected long updatedCount;
+
+ @Column(name = "updated")
+ @Temporal(value = TemporalType.TIMESTAMP)
+ Date updated;
+
+ @Column(name = "state")
+ @Enumerated(EnumType.STRING)
+ ObjectInDataStoreStateMachine.State state;
public String getInstallPath() {
return installPath;
@@ -187,6 +199,7 @@ public class VolumeHostVO implements InternalIdentity {
super();
this.hostId = hostId;
this.volumeId = volumeId;
+ this.state = ObjectInDataStoreStateMachine.State.Allocated;
}
public VolumeHostVO(long hostId, long volumeId, long zoneId, Date lastUpdated,
@@ -308,5 +321,27 @@ public class VolumeHostVO implements InternalIdentity {
public String toString() {
return new StringBuilder("VolumeHost[").append(id).append("-").append(volumeId).append("-").append(hostId).append(installPath).append("]").toString();
}
+
+ public long getUpdatedCount() {
+ return this.updatedCount;
+ }
+
+ public void incrUpdatedCount() {
+ this.updatedCount++;
+ }
+
+ public void decrUpdatedCount() {
+ this.updatedCount--;
+ }
+
+ public Date getUpdated() {
+ return updated;
+ }
+
+ @Override
+ public ObjectInDataStoreStateMachine.State getState() {
+ // TODO Auto-generated method stub
+ return this.state;
+ }
}
diff --git a/core/src/com/cloud/storage/VolumeVO.java b/core/src/com/cloud/storage/VolumeVO.java
index defc841e1e3..a287c26348b 100755
--- a/core/src/com/cloud/storage/VolumeVO.java
+++ b/core/src/com/cloud/storage/VolumeVO.java
@@ -32,11 +32,9 @@ import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
-import org.apache.cloudstack.api.Identity;
import com.cloud.storage.Storage.StoragePoolType;
import com.cloud.utils.NumbersUtil;
import com.cloud.utils.db.GenericDao;
-import org.apache.cloudstack.api.InternalIdentity;
@Entity
@Table(name = "volumes")
@@ -69,7 +67,7 @@ public class VolumeVO implements Volume {
Long deviceId = null;
@Column(name = "size")
- long size;
+ Long size;
@Column(name = "folder")
String folder;
@@ -257,11 +255,11 @@ public class VolumeVO implements Volume {
}
@Override
- public long getSize() {
+ public Long getSize() {
return size;
}
- public void setSize(long size) {
+ public void setSize(Long size) {
this.size = size;
}
diff --git a/core/src/com/cloud/storage/template/RawImageProcessor.java b/core/src/com/cloud/storage/template/RawImageProcessor.java
index 7833eabcabf..a002df5c9b2 100644
--- a/core/src/com/cloud/storage/template/RawImageProcessor.java
+++ b/core/src/com/cloud/storage/template/RawImageProcessor.java
@@ -57,6 +57,7 @@ public class RawImageProcessor extends AdapterBase implements Processor {
String imgPath = templatePath + File.separator + templateName + "." + ImageFormat.RAW.getFileExtension();
if (!_storage.exists(imgPath)) {
s_logger.debug("Unable to find raw image:" + imgPath);
+ return null;
}
FormatInfo info = new FormatInfo();
info.format = ImageFormat.RAW;
diff --git a/server/src/com/cloud/baremetal/DhcpServerResponse.java b/core/src/com/cloud/vm/UserVmCloneSettingVO.java
similarity index 57%
rename from server/src/com/cloud/baremetal/DhcpServerResponse.java
rename to core/src/com/cloud/vm/UserVmCloneSettingVO.java
index db46ccd1a1d..24bb1e87c3b 100644
--- a/server/src/com/cloud/baremetal/DhcpServerResponse.java
+++ b/core/src/com/cloud/vm/UserVmCloneSettingVO.java
@@ -14,22 +14,37 @@
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
-package com.cloud.baremetal;
+package com.cloud.vm;
-import org.apache.cloudstack.api.ApiConstants;
-import org.apache.cloudstack.api.BaseResponse;
-import com.cloud.serializer.Param;
-import com.google.gson.annotations.SerializedName;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Table;
-public class DhcpServerResponse extends BaseResponse {
- @SerializedName(ApiConstants.ID) @Param(description="the ID of the Dhcp server")
- private String id;
+@Entity
+@Table(name="user_vm_clone_setting")
+public class UserVmCloneSettingVO {
+
+ @Column(name="vm_id")
+ private Long vmId;
+
+ @Column(name="clone_type")
+ private String cloneType;
+
+ public UserVmCloneSettingVO() {
- public String getId() {
- return id;
}
- public void setId(String id) {
- this.id = id;
+ public UserVmCloneSettingVO(long id,
+ String cloneType) {
+ this.vmId = id;
+ this.cloneType = cloneType;
+ }
+
+ public long getVmId() {
+ return this.vmId;
+ }
+
+ public String getCloneType() {
+ return this.cloneType;
}
}
diff --git a/core/src/com/cloud/vm/VirtualNetwork.java b/core/src/com/cloud/vm/VirtualNetwork.java
deleted file mode 100644
index ace3b80769f..00000000000
--- a/core/src/com/cloud/vm/VirtualNetwork.java
+++ /dev/null
@@ -1,72 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License. You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied. See the License for the
-// specific language governing permissions and limitations
-// under the License.
-package com.cloud.vm;
-
-import com.cloud.network.Networks.IsolationType;
-import com.cloud.network.Networks.Mode;
-
-/**
- * VirtualNetwork describes from a management level the
- * machine.
- */
-public class VirtualNetwork {
- /**
- * The gateway for this network.
- */
- public String gateway;
-
- /**
- * Netmask
- */
- public String netmask;
-
- /**
- * ip address. null if mode is DHCP.
- */
- public String ip;
-
- /**
- * Mac Address.
- */
- public String mac;
-
- /**
- * rate limit on this network. -1 if no limit.
- */
- public long rate;
-
- /**
- * tag for virtualization.
- */
- public String tag;
-
- /**
- * mode to acquire ip address.
- */
- public Mode mode;
-
- /**
- * Isolation method for networking.
- */
- public IsolationType method;
-
- public boolean firewalled;
-
- public int[] openPorts;
-
- public int[] closedPorts;
-}
diff --git a/core/src/com/cloud/vm/snapshot/VMSnapshotVO.java b/core/src/com/cloud/vm/snapshot/VMSnapshotVO.java
new file mode 100644
index 00000000000..03d4945fda0
--- /dev/null
+++ b/core/src/com/cloud/vm/snapshot/VMSnapshotVO.java
@@ -0,0 +1,224 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package com.cloud.vm.snapshot;
+
+import java.util.Date;
+import java.util.UUID;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+import com.cloud.utils.db.GenericDao;
+
+@Entity
+@Table(name = "vm_snapshots")
+public class VMSnapshotVO implements VMSnapshot {
+ @Id
+ @TableGenerator(name = "vm_snapshots_sq", table = "sequence", pkColumnName = "name", valueColumnName = "value", pkColumnValue = "vm_snapshots_seq", allocationSize = 1)
+ @GeneratedValue(strategy = GenerationType.TABLE)
+ @Column(name = "id")
+ long id;
+
+ @Column(name = "uuid")
+ String uuid = UUID.randomUUID().toString();
+
+ @Column(name = "name")
+ String name;
+
+ @Column(name = "display_name")
+ String displayName;
+
+ @Column(name = "description")
+ String description;
+
+ @Column(name = "vm_id")
+ long vmId;
+
+ @Column(name = "account_id")
+ long accountId;
+
+ @Column(name = "domain_id")
+ long domainId;
+
+ @Column(name = "vm_snapshot_type")
+ @Enumerated(EnumType.STRING)
+ VMSnapshot.Type type;
+
+ @Column(name = "state", updatable = true, nullable = false)
+ @Enumerated(value = EnumType.STRING)
+ private State state;
+
+ @Column(name = GenericDao.CREATED_COLUMN)
+ Date created;
+
+ @Column(name = GenericDao.REMOVED_COLUMN)
+ Date removed;
+
+ @Column(name = "current")
+ Boolean current;
+
+ @Column(name = "parent")
+ Long parent;
+
+ @Column(name = "updated")
+ @Temporal(value = TemporalType.TIMESTAMP)
+ Date updated;
+
+ @Column(name="update_count", updatable = true, nullable=false)
+ protected long updatedCount;
+
+ public Long getParent() {
+ return parent;
+ }
+
+ public void setParent(Long parent) {
+ this.parent = parent;
+ }
+
+ public VMSnapshotVO() {
+
+ }
+
+ public Date getRemoved() {
+ return removed;
+ }
+
+ public VMSnapshotVO(Long accountId, Long domainId, Long vmId,
+ String description, String vmSnapshotName, String vsDisplayName,
+ Long serviceOfferingId, Type type, Boolean current) {
+ this.accountId = accountId;
+ this.domainId = domainId;
+ this.vmId = vmId;
+ this.state = State.Allocated;
+ this.description = description;
+ this.name = vmSnapshotName;
+ this.displayName = vsDisplayName;
+ this.type = type;
+ this.current = current;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ @Override
+ public Date getCreated() {
+ return created;
+ }
+
+ public void setCreated(Date created) {
+ this.created = created;
+ }
+
+ @Override
+ public long getId() {
+ return id;
+ }
+
+ @Override
+ public Long getVmId() {
+ return vmId;
+ }
+
+ public void setVmId(Long vmId) {
+ this.vmId = vmId;
+ }
+
+ @Override
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public State getState() {
+ return state;
+ }
+
+ public void setState(State state) {
+ this.state = state;
+ }
+
+ @Override
+ public String getUuid() {
+ return uuid;
+ }
+
+ @Override
+ public long getAccountId() {
+ return accountId;
+ }
+
+ @Override
+ public long getDomainId() {
+ return domainId;
+ }
+
+ @Override
+ public String getDisplayName() {
+ return displayName;
+ }
+
+ public void setDisplayName(String displayName) {
+ this.displayName = displayName;
+ }
+
+ public Boolean getCurrent() {
+ return current;
+ }
+
+ public void setCurrent(Boolean current) {
+ this.current = current;
+ }
+
+ @Override
+ public long getUpdatedCount() {
+ return updatedCount;
+ }
+
+ @Override
+ public void incrUpdatedCount() {
+ this.updatedCount++;
+ }
+
+ @Override
+ public Date getUpdated() {
+ return updated;
+ }
+
+ @Override
+ public Type getType() {
+ return type;
+ }
+
+ public void setRemoved(Date removed) {
+ this.removed = removed;
+ }
+}
diff --git a/debian/README b/debian/README
deleted file mode 100644
index cbfbf1bb9d9..00000000000
--- a/debian/README
+++ /dev/null
@@ -1,6 +0,0 @@
-The Debian Package
-----------------------------
-
-This is part of the Cloud Stack collection of packages.
-
- -- Manuel Amador (Rudd-O) Thu, 25 Mar 2010 15:12:06 -0700
diff --git a/debian/changelog b/debian/changelog
index c3243aad5e3..cbbaad32cad 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+cloudstack (4.1.0-incubating-0.0.snapshot) unstable; urgency=low
+
+ * Incorporate incubating into version, remove epoch
+
+ -- Noa Resare Tue, 05 Feb 2013 18:05:28 +0000
+
cloud (1:4.0.0-1) unstable; urgency=low
* Bumping the version to 4.0.0
diff --git a/debian/cloud-agent.config b/debian/cloud-agent.config
deleted file mode 100644
index 00ae6c00d2e..00000000000
--- a/debian/cloud-agent.config
+++ /dev/null
@@ -1,17 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
diff --git a/debian/cloud-cli.install b/debian/cloud-cli.install
deleted file mode 100644
index ce178461150..00000000000
--- a/debian/cloud-cli.install
+++ /dev/null
@@ -1,21 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-/etc/cloud/cli/commands.xml
-/usr/bin/cloud-grab-dependent-library-versions
-/usr/bin/cloud-tool
-/usr/bin/cloudvoladm
diff --git a/debian/cloud-client.install b/debian/cloud-client.install
deleted file mode 100644
index aadb145ae1c..00000000000
--- a/debian/cloud-client.install
+++ /dev/null
@@ -1,58 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-/etc/cloud/management/catalina.policy
-/etc/cloud/management/catalina.properties
-/etc/cloud/management/commands.properties
-/etc/cloud/management/components.xml
-/etc/cloud/management/context.xml
-/etc/cloud/management/db.properties
-/etc/cloud/management/environment.properties
-/etc/cloud/management/ehcache.xml
-/etc/cloud/management/log4j-cloud.xml
-/etc/cloud/management/logging.properties
-/etc/cloud/management/server.xml
-/etc/cloud/management/tomcat6.conf
-/etc/cloud/management/classpath.conf
-/etc/cloud/management/tomcat-users.xml
-/etc/cloud/management/web.xml
-/etc/cloud/management/server-nonssl.xml
-/etc/cloud/management/tomcat6-nonssl.conf
-/etc/cloud/management/virtualrouter_commands.properties
-/etc/cloud/management/f5bigip_commands.properties
-/etc/cloud/management/junipersrx_commands.properties
-/etc/cloud/management/netscalerloadbalancer_commands.properties
-/etc/cloud/management/cisconexusvsm_commands.properties
-/etc/cloud/management/Catalina
-/etc/cloud/management/Catalina/localhost
-/etc/cloud/management/Catalina/localhost/client
-/etc/init.d/cloud-management
-/usr/share/cloud/management/bin
-/usr/share/cloud/management/conf
-/usr/share/cloud/management/lib
-/usr/share/cloud/management/logs
-/usr/share/cloud/management/temp
-/usr/share/cloud/management/work
-/var/cache/cloud/management
-/var/cache/cloud/management/work
-/var/cache/cloud/management/temp
-/var/log/cloud/management
-/var/lib/cloud/mnt
-/var/lib/cloud/management
-/usr/bin/cloud-setup-management
-/usr/bin/cloud-update-xenserver-licenses
-/etc/cloud/management/commands-ext.properties
diff --git a/debian/cloud-client.postinst b/debian/cloud-client.postinst
deleted file mode 100644
index 87c7610320c..00000000000
--- a/debian/cloud-client.postinst
+++ /dev/null
@@ -1,49 +0,0 @@
-#!/bin/sh -e
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-case "$1" in
- configure)
- if ! id cloud > /dev/null 2>&1 ; then
- adduser --system --home /var/lib/cloud/management --no-create-home \
- --group --disabled-password --shell /bin/sh cloud
- # update me in all the .postinst that you can find me in, as well
- fi
-
- for i in /var/lib/cloud/mnt /var/cache/cloud/management \
- /var/cache/cloud/management/work /var/cache/cloud/management/temp \
- /var/log/cloud/management /etc/cloud/management/Catalina \
- /etc/cloud/management/Catalina/localhost /var/lib/cloud/management /etc/cloud/management/Catalina/localhost/client
- do
- chmod 0770 $i
- chgrp cloud $i
- done
-
- for i in /etc/cloud/management/db.properties
- do
- chmod 0640 $i
- chgrp cloud $i
- done
-
- if [ "$2" = "" ] ; then # no recently configured version, this is a first install
- /usr/sbin/update-rc.d cloud-management defaults || true
- fi
-
- ;;
-esac
-
-#DEBHELPER#
diff --git a/debian/cloud-core.install b/debian/cloud-core.install
deleted file mode 100644
index 00a43d48259..00000000000
--- a/debian/cloud-core.install
+++ /dev/null
@@ -1,19 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-/usr/share/java/cloud-core.jar
-
diff --git a/debian/cloud-deps.install b/debian/cloud-deps.install
deleted file mode 100644
index 74aade12543..00000000000
--- a/debian/cloud-deps.install
+++ /dev/null
@@ -1,34 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-/usr/share/java/ehcache-1.5.0.jar
-/usr/share/java/mail-1.4.jar
-/usr/share/java/httpcore-4.0.jar
-/usr/share/java/log4j-*.jar
-/usr/share/java/apache-log4j-extras-1.1.jar
-/usr/share/java/trilead-ssh2-build213-svnkit-1.3-patch.jar
-/usr/share/java/xmlrpc-common-3.*.jar
-/usr/share/java/xmlrpc-client-3.*.jar
-/usr/share/java/jstl-1.2.jar
-/usr/share/java/axis2-1.5.1.jar
-/usr/share/java/wsdl4j-1.6.2.jar
-/usr/share/java/bcprov-*.jar
-/usr/share/java/jasypt-1.*.jar
-/usr/share/java/ejb-api-3.0.jar
-/usr/share/java/javax.persistence-2.0.0.jar
-/usr/share/java/gson-1.7.1.jar
-/usr/share/java/xapi-5.6.100-1-SNAPSHOT.jar
diff --git a/debian/cloud-python.install b/debian/cloud-python.install
deleted file mode 100644
index b8eac722a6d..00000000000
--- a/debian/cloud-python.install
+++ /dev/null
@@ -1,18 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-/usr/lib/python*/dist-packages/cloud*
diff --git a/debian/cloud-scripts.install b/debian/cloud-scripts.install
deleted file mode 100644
index 5e8896d43a3..00000000000
--- a/debian/cloud-scripts.install
+++ /dev/null
@@ -1,27 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-/usr/lib/cloud/common/scripts/installer/*
-/usr/lib/cloud/common/scripts/network/*
-/usr/lib/cloud/common/scripts/storage/*
-/usr/lib/cloud/common/scripts/util/*
-/usr/lib/cloud/common/scripts/vm/network/*
-/usr/lib/cloud/common/scripts/vm/systemvm/*
-/usr/lib/cloud/common/scripts/vm/pingtest.sh
-/usr/lib/cloud/common/scripts/vm/hypervisor/kvm/*
-/usr/lib/cloud/common/scripts/vm/hypervisor/versions.sh
-/usr/lib/cloud/common/scripts/vm/hypervisor/xenserver/*
diff --git a/debian/cloud-server.install b/debian/cloud-server.install
deleted file mode 100644
index f792cc2f7cd..00000000000
--- a/debian/cloud-server.install
+++ /dev/null
@@ -1,32 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-/usr/share/java/cloud-server.jar
-/usr/share/java/cloud-ovm.jar
-/etc/cloud/server/*
-/usr/share/java/cloud-dp-user-concentrated-pod.jar
-/usr/share/java/cloud-dp-user-dispersing.jar
-/usr/share/java/cloud-host-allocator-random.jar
-/usr/share/java/cloud-plugin-elb.jar
-/usr/share/java/cloud-plugin-ovs.jar
-/usr/share/java/cloud-plugin-nicira-nvp.jar
-/usr/share/java/cloud-plugin-bigswitch-vns.jar
-/usr/share/java/cloud-storage-allocator-random.jar
-/usr/share/java/cloud-user-authenticator-ldap.jar
-/usr/share/java/cloud-user-authenticator-md5.jar
-/usr/share/java/cloud-user-authenticator-plaintext.jar
-/usr/share/java/cloud-plugin-hypervisor-xen.jar
diff --git a/debian/cloud-system-iso.install b/debian/cloud-system-iso.install
deleted file mode 100644
index 5a0b6364f4c..00000000000
--- a/debian/cloud-system-iso.install
+++ /dev/null
@@ -1,18 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-/usr/lib/cloud/common/vms/systemvm.iso
diff --git a/debian/cloud-usage.install b/debian/cloud-usage.install
deleted file mode 100644
index 22f58344102..00000000000
--- a/debian/cloud-usage.install
+++ /dev/null
@@ -1,23 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-/usr/share/java/cloud-usage.jar
-/etc/init.d/cloud-usage
-/var/log/cloud/usage
-/etc/cloud/usage/usage-components.xml
-/etc/cloud/usage/log4j-cloud_usage.xml
-/etc/cloud/usage/db.properties
diff --git a/debian/cloud-utils.install b/debian/cloud-utils.install
deleted file mode 100644
index 39c357a1fa6..00000000000
--- a/debian/cloud-utils.install
+++ /dev/null
@@ -1,22 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-/usr/share/java/cloud-utils.jar
-/usr/share/java/cloud-api.jar
-/usr/share/doc/cloud/version-info
-/usr/bin/cloud-sccs
-/usr/bin/cloud-gitrevs
diff --git a/debian/cloud-agent.install b/debian/cloudstack-agent.install
similarity index 77%
rename from debian/cloud-agent.install
rename to debian/cloudstack-agent.install
index c67e90ab492..b1425717584 100644
--- a/debian/cloud-agent.install
+++ b/debian/cloudstack-agent.install
@@ -15,11 +15,12 @@
# specific language governing permissions and limitations
# under the License.
-/etc/cloud/agent/agent.properties
-/etc/cloud/agent/developer.properties.template
-/etc/cloud/agent/environment.properties
-/etc/cloud/agent/log4j-cloud.xml
-/etc/init.d/cloud-agent
+/etc/cloudstack/agent/agent.properties
+/etc/cloudstack/agent/environment.properties
+/etc/cloudstack/agent/log4j-cloud.xml
+/etc/init.d/cloudstack-agent
/usr/bin/cloud-setup-agent
/usr/bin/cloud-ssh
-/var/log/cloud/agent
+/var/log/cloudstack/agent
+/usr/share/cloudstack-agent/lib/*
+/usr/share/cloudstack-agent/plugins
\ No newline at end of file
diff --git a/debian/cloud-usage.postinst b/debian/cloudstack-agent.postinst
similarity index 58%
rename from debian/cloud-usage.postinst
rename to debian/cloudstack-agent.postinst
index 56f895df6e0..499ae6a695a 100644
--- a/debian/cloud-usage.postinst
+++ b/debian/cloudstack-agent.postinst
@@ -1,4 +1,5 @@
-#!/bin/sh -e
+#!/bin/bash
+
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
@@ -6,9 +7,9 @@
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
-#
+#
# http://www.apache.org/licenses/LICENSE-2.0
-#
+#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -16,32 +17,24 @@
# specific language governing permissions and limitations
# under the License.
+set -e
+
case "$1" in
configure)
+ OLDCONFDIR="/etc/cloud/agent"
+ NEWCONFDIR="/etc/cloudstack/agent"
+ CONFFILES="agent.properties log4j.xml log4j-cloud.xml"
- if ! id cloud > /dev/null 2>&1 ; then
- adduser --system --home /var/lib/cloud/management --no-create-home \
- --group --disabled-password --shell /bin/sh cloud
- # update me in cloud-client.postinst as well
+ # Copy old configuration so the admin doesn't have to do that
+ # Only do so when we are installing for the first time
+ if [ -z "$2" ]; then
+ for FILE in $CONFFILES; do
+ if [ -f "$OLDCONFDIR/${FILE}" ]; then
+ cp -a $OLDCONFDIR/$FILE $NEWCONFDIR/$FILE
+ fi
+ done
fi
-
- for i in /var/log/cloud/usage
- do
- chmod 0770 $i
- chgrp cloud $i
- done
-
- for i in /etc/cloud/usage/db.properties
- do
- chmod 0640 $i
- chgrp cloud $i
- done
-
- if [ "$2" = "" ] ; then # no recently configured version, this is a first install
- /usr/sbin/update-rc.d cloud-usage defaults || true
- fi
-
- ;;
+ ;;
esac
-#DEBHELPER#
+exit 0
\ No newline at end of file
diff --git a/debian/cloud-cli.config b/debian/cloudstack-awsapi.install
similarity index 96%
rename from debian/cloud-cli.config
rename to debian/cloudstack-awsapi.install
index 00ae6c00d2e..02ba66829ef 100644
--- a/debian/cloud-cli.config
+++ b/debian/cloudstack-awsapi.install
@@ -15,3 +15,4 @@
# specific language governing permissions and limitations
# under the License.
+/var/log/cloudstack/awsapi
\ No newline at end of file
diff --git a/debian/cloud-management.config b/debian/cloudstack-cli.install
similarity index 97%
rename from debian/cloud-management.config
rename to debian/cloudstack-cli.install
index 00ae6c00d2e..287f9b1f651 100644
--- a/debian/cloud-management.config
+++ b/debian/cloudstack-cli.install
@@ -13,5 +13,4 @@
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
-# under the License.
-
+# under the License.
\ No newline at end of file
diff --git a/debian/cloud-agent-libs.install b/debian/cloudstack-common.install
similarity index 54%
rename from debian/cloud-agent-libs.install
rename to debian/cloudstack-common.install
index ba25935588c..9677f871cf0 100644
--- a/debian/cloud-agent-libs.install
+++ b/debian/cloudstack-common.install
@@ -15,5 +15,17 @@
# specific language governing permissions and limitations
# under the License.
-/usr/share/java/cloud-agent.jar
-/usr/share/java/cloud-plugin-hypervisor-kvm.jar
+/usr/share/cloudstack-common/vms/systemvm.iso
+/usr/share/cloudstack-common/scripts/installer/*
+/usr/share/cloudstack-common/scripts/network/*
+/usr/share/cloudstack-common/scripts/storage/*
+/usr/share/cloudstack-common/scripts/util/*
+/usr/share/cloudstack-common/scripts/vm/network/*
+/usr/share/cloudstack-common/scripts/vm/systemvm/*
+/usr/share/cloudstack-common/scripts/vm/pingtest.sh
+/usr/share/cloudstack-common/scripts/vm/hypervisor/kvm/*
+/usr/share/cloudstack-common/scripts/vm/hypervisor/versions.sh
+/usr/share/cloudstack-common/scripts/vm/hypervisor/xenserver/*
+/usr/bin/cloud-set-guest-password
+/usr/bin/cloud-set-guest-sshkey
+/usr/lib/python2.?/*-packages/*
diff --git a/debian/cloud-client.config b/debian/cloudstack-docs.install
similarity index 97%
rename from debian/cloud-client.config
rename to debian/cloudstack-docs.install
index 00ae6c00d2e..287f9b1f651 100644
--- a/debian/cloud-client.config
+++ b/debian/cloudstack-docs.install
@@ -13,5 +13,4 @@
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
-# under the License.
-
+# under the License.
\ No newline at end of file
diff --git a/debian/cloud-setup.install b/debian/cloudstack-management.install
similarity index 68%
rename from debian/cloud-setup.install
rename to debian/cloudstack-management.install
index 5c37c64920d..12478e132a1 100644
--- a/debian/cloud-setup.install
+++ b/debian/cloudstack-management.install
@@ -15,11 +15,17 @@
# specific language governing permissions and limitations
# under the License.
+/etc/cloudstack/server/*
+/etc/cloudstack/management/*
+/etc/init.d/cloudstack-management
+/var/cache/cloudstack/management
+/var/cache/cloudstack/management/work
+/var/cache/cloudstack/management/temp
+/var/log/cloudstack/management
+/var/lib/cloudstack/mnt
+/var/lib/cloudstack/management
+/usr/bin/cloud-update-xenserver-licenses
+/usr/bin/cloud-setup-management
/usr/bin/cloud-setup-databases
/usr/bin/cloud-migrate-databases
-/usr/bin/cloud-set-guest-password
-/usr/bin/cloud-set-guest-sshkey
-/usr/share/cloud/setup/*.sql
-/usr/share/cloud/setup/*.sh
-/usr/share/cloud/setup/server-setup.xml
-/usr/share/cloud/setup/db/*.sql
+/usr/share/cloudstack-management/*
diff --git a/debian/cloud-agent.postinst b/debian/cloudstack-management.postinst
similarity index 72%
rename from debian/cloud-agent.postinst
rename to debian/cloudstack-management.postinst
index f022f6d16bc..7b6a1ed6d71 100644
--- a/debian/cloud-agent.postinst
+++ b/debian/cloudstack-management.postinst
@@ -16,19 +16,11 @@
# specific language governing permissions and limitations
# under the License.
-case "$1" in
- configure)
-
- for i in /var/log/cloud/agent
- do
- chmod 0770 $i
- done
-
- if [ "$2" = "" ] ; then # no recently configured version, this is a first install
- /usr/sbin/update-rc.d cloud-agent defaults || true
- fi
-
- ;;
-esac
-
-#DEBHELPER#
+if [ "$1" = configure ]; then
+ if ! getent passwd cloud >/dev/null; then
+ adduser --quiet --system --group --no-create-home --home /var/lib/cloudstack/management cloud
+ else
+ usermod -m -d /var/lib/cloudstack/management cloud
+ fi
+ chown cloud /var/log/cloudstack/management
+fi
\ No newline at end of file
diff --git a/debian/cloud-agent-deps.install b/debian/cloudstack-usage.install
similarity index 83%
rename from debian/cloud-agent-deps.install
rename to debian/cloudstack-usage.install
index b05b7d1d9d4..4722e688dcd 100644
--- a/debian/cloud-agent-deps.install
+++ b/debian/cloudstack-usage.install
@@ -5,9 +5,9 @@
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
-#
+#
# http://www.apache.org/licenses/LICENSE-2.0
-#
+#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -15,4 +15,8 @@
# specific language governing permissions and limitations
# under the License.
-/usr/share/java/libvirt-0.4.9.jar
+/usr/share/cloudstack-usage/lib/*
+/usr/share/cloudstack-usage/plugins
+/etc/init.d/cloudstack-usage
+/var/log/cloudstack/usage
+/etc/cloudstack/usage/*
diff --git a/debian/control b/debian/control
index 380b2e4a78d..8f82fc3ab2f 100644
--- a/debian/control
+++ b/debian/control
@@ -1,118 +1,51 @@
-Source: cloud
+Source: cloudstack
Section: libs
Priority: extra
Maintainer: Wido den Hollander
-Build-Depends: debhelper (>= 7), openjdk-6-jdk, tomcat6, libws-commons-util-java, libcommons-codec-java (>= 1.5), libcommons-httpclient-java (>= 3.1), libservlet2.5-java, genisoimage, python-mysqldb, maven3 | maven (>= 3), liblog4j1.2-java (>= 1.2.16)
+Build-Depends: debhelper (>= 7), openjdk-6-jdk | openjdk-7-jdk, tomcat6, genisoimage,
+ python-mysqldb, maven3 | maven (>= 3), python (>= 2.6.6-3~)
Standards-Version: 3.8.1
Homepage: http://www.cloudstack.org/
-Package: cloud-deps
-Architecture: any
-Depends: openjdk-6-jre, libcommons-codec-java (>= 1.5), libcommons-httpclient-java (>= 3.1)
-Description: CloudStack library dependencies
- This package contains a number of third-party dependencies
- not shipped by distributions, required to run the CloudStack
- Management Server.
+Package: cloudstack-common
+Architecture: all
+Depends: bash, genisoimage
+Conflicts: cloud-scripts, cloud-utils, cloud-system-iso, cloud-console-proxy, cloud-daemonize, cloud-deps, cloud-python, cloud-setup
+Description: A common package which contains files which are shared by several CloudStack packages
-Package: cloud-agent-deps
-Architecture: any
-Depends: openjdk-6-jre, cloud-deps (= ${source:Version})
-Description: CloudStack agent library dependencies
- This package contains a number of third-party dependencies
- not shipped by distributions, required to run the CloudStack
- Agent.
-
-Package: cloud-utils
-Architecture: any
-Depends: openjdk-6-jre, python, libcglib-java (>= 2.2.2), libjsch-java (>= 0.1.42), libbackport-util-concurrent-java (>= 3.1), libcommons-dbcp-java (>= 1.4), libcommons-pool-java (>= 1.5.6)
-Description: CloudStack utility library
- The CloudStack utility libraries provide a set of Java classes used
- in the CloudStack environment.
-
-Package: cloud-client-ui
-Architecture: any
-Depends: openjdk-6-jre, cloud-client (= ${source:Version})
-Description: CloudStack management server UI
- The CloudStack management server is the central point of coordination,
- management, and intelligence in the CloudStack Cloud Stack. This package
- is a requirement of the cloud-client package, which installs the
- CloudStack management server.
-
-Package: cloud-server
-Architecture: any
-Depends: openjdk-6-jre, cloud-utils (= ${source:Version}), cloud-core (= ${source:Version}), cloud-deps (= ${source:Version}), cloud-scripts (= ${source:Version}), libservlet2.5-java
+Package: cloudstack-management
+Architecture: all
+Depends: cloudstack-common (= ${source:Version}), tomcat6, sysvinit-utils, chkconfig, sudo, jsvc, python-mysqldb, python-paramiko, augeas-tools
+Conflicts: cloud-server, cloud-client, cloud-client-ui
Description: CloudStack server library
- The CloudStack server libraries provide a set of Java classes used
- in the CloudStack management server.
+ The CloudStack management server
-Package: cloud-scripts
-Replaces: cloud-agent-scripts
-Architecture: any
-Depends: openjdk-6-jre, python, bash, bzip2, gzip, unzip, nfs-common, openssh-client
-Description: CloudStack scripts
- This package contains a number of scripts needed for the CloudStack Agent and Management Server.
- Both the CloudStack Agent and Management server depend on this package
-
-Package: cloud-core
-Architecture: any
-Depends: openjdk-6-jre, cloud-utils (= ${source:Version})
-Description: CloudStack core library
- The CloudStack core libraries provide a set of Java classes used
- in the CloudStack Cloud Stack.
-
-
-Package: cloud-client
-Architecture: any
-Depends: openjdk-6-jre, cloud-deps (= ${source:Version}), cloud-utils (= ${source:Version}), cloud-server (= ${source:Version}), cloud-client-ui (= ${source:Version}), cloud-setup (= ${source:Version}), cloud-python (= ${source:Version}), tomcat6, libws-commons-util-java, sysvinit-utils, chkconfig, sudo, jsvc, python-mysqldb, python-paramiko, augeas-tools, genisoimage, cloud-system-iso, libmysql-java (>= 5.1)
-Description: CloudStack client
- The CloudStack management server is the central point of coordination,
- management, and intelligence in the CloudStack Cloud Stack. This package
- is required for the management server to work.
-
-Package: cloud-setup
-Architecture: any
-Depends: openjdk-6-jre, python, cloud-utils (= ${source:Version}), cloud-deps (= ${source:Version}), cloud-server (= ${source:Version}), cloud-python (= ${source:Version}), python-mysqldb
-Description: CloudStack client
- The CloudStack setup tools let you set up your Management Server and Usage Server.
-
-Package: cloud-python
-Architecture: any
-Depends: python
-Description: CloudStack Python library
- The CloudStack Python library contains a few Python modules that the
- CloudStack uses.
-
-Package: cloud-agent-libs
-Architecture: any
-Depends: openjdk-6-jre, cloud-utils (= ${source:Version}), cloud-core (= ${source:Version}), cloud-agent-deps (= ${source:Version})
-Description: CloudStack agent libraries
- The CloudStack agent libraries are used by the Cloud Agent.
-
-Package: cloud-agent
-Architecture: any
-Depends: openjdk-6-jre, cloud-utils (= ${source:Version}), cloud-core (= ${source:Version}), cloud-agent-deps (= ${source:Version}), cloud-python (= ${source:Version}), cloud-agent-libs (= ${source:Version}), cloud-scripts (= ${source:Version}), cloud-system-iso (= ${source:Version}), libvirt0, sysvinit-utils, chkconfig, qemu-kvm, libvirt-bin, uuid-runtime, rsync, grep, iproute, ebtables, vlan, liblog4j1.2-java (>= 1.2.16), libjna-java, wget, jsvc, lsb-base (>= 3.2)
+Package: cloudstack-agent
+Architecture: all
+Depends: openjdk-6-jre | openjdk-7-jre, cloudstack-common (= ${source:Version}), lsb-base (>= 3.2), libcommons-daemon-java, libjna-java, openssh-client, libvirt0, sysvinit-utils, chkconfig, qemu-kvm, libvirt-bin, uuid-runtime, rsync, grep, iproute, perl-base, perl-modules, ebtables, vlan, wget, jsvc
+Conflicts: cloud-agent, cloud-agent-libs, cloud-agent-deps, cloud-agent-scripts
Description: CloudStack agent
The CloudStack agent is in charge of managing shared computing resources in
a CloudStack powered cloud. Install this package if this computer
will participate in your cloud as a KVM HyperVisor.
-Package: cloud-system-iso
-Architecture: any
-Description: CloudStack system iso
- The CloudStack agent is in charge of managing shared computing resources in
- a CloudStack powered cloud. Install this package if this computer
- will participate in your cloud.
-
-Package: cloud-usage
-Architecture: any
-Depends: openjdk-6-jre, cloud-utils (= ${source:Version}), cloud-core (= ${source:Version}), cloud-deps (= ${source:Version}), cloud-server (= ${source:Version}), cloud-setup (= ${source:Version}), cloud-client (= ${source:Version}), jsvc
+Package: cloudstack-usage
+Architecture: all
+Depends: openjdk-6-jre | openjdk-7-jre, cloudstack-common (= ${source:Version}), jsvc
Description: CloudStack usage monitor
The CloudStack usage monitor provides usage accounting across the entire cloud for
cloud operators to charge based on usage parameters.
-Package: cloud-cli
-Provides: cloud-cli
-Architecture: any
-Depends: openjdk-6-jre, cloud-utils (= ${source:Version}), cloud-core (= ${source:Version}), cloud-deps (= ${source:Version}), cloud-server (= ${source:Version}), cloud-setup (= ${source:Version}), cloud-client (= ${source:Version})
-Description: CloudStack commandline tool
- The CloudStack commandline tool for invoking APi
+Package: cloudstack-awsapi
+Architecture: all
+Depends: cloudstack-common (= ${source:Version}), cloudstack-management (= ${source:Version})
+Description: CloudStack Amazon EC2 API
+
+Package: cloudstack-cli
+Architecture: all
+Depends: cloudstack-common (= ${source:Version})
+Description: The CloudStack CLI called CloudMonkey
+
+Package: cloudstack-docs
+Architecture: all
+Description: The CloudStack documentation
diff --git a/debian/rules b/debian/rules
index 36b611ddc04..7fc6425b34f 100755
--- a/debian/rules
+++ b/debian/rules
@@ -10,6 +10,12 @@
# Modified to make a template file for a multi-binary package with separated
# build-arch and build-indep targets by Bill Allombert 2001
+DEBVERS := $(shell dpkg-parsechangelog | sed -n -e 's/^Version: //p')
+VERSION := $(shell echo '$(DEBVERS)' | sed -e 's/^[[:digit:]]*://' -e 's/[~-].*//')
+PACKAGE = $(shell dh_listpackages|head -n 1|cut -d '-' -f 1)
+SYSCONFDIR = "/etc"
+DESTDIR = "debian/tmp"
+
# Uncomment this to turn on verbose mode.
export DH_VERBOSE=1
@@ -19,55 +25,122 @@ export DH_OPTIONS
configure: configure-stamp
configure-stamp:
dh_testdir
- cp packaging/debian/replace.properties build/replace.properties
- echo VERSION=$VERSION >> build/replace.properties
+ cp packaging/debian/replace.properties replace.properties.tmp
+ echo VERSION=${VERSION} >> replace.properties.tmp
touch configure-stamp
-build: build-arch
+build: build-indep
-build-arch: build-arch-stamp
-build-arch-stamp: configure-stamp
- mvn package -Dsystemvm
+build-indep: build-indep-stamp
+
+build-indep-stamp: configure
+ mvn package -DskipTests -Dsystemvm \
+ -Dcs.replace.properties=replace.properties.tmp
touch $@
clean:
dh_testdir
dh_testroot
rm -f build-arch-stamp build-indep-stamp configure-stamp
+ rm -f replace.properties.tmp
dh_clean
install:
dh_testdir
dh_testroot
dh_prep -s
- mkdir -p debian/tmp/usr/bin
- mkdir -p debian/tmp/usr/share/cloud/management
- mkdir -p debian/tmp/var/log/cloud
- mkdir debian/tmp/var/log/cloud/managament
- mkdir debian/tmp/var/log/cloud/awsapi
- mkdir debian/tmp/var/log/cloud/agent
- mkdir debian/tmp/var/log/cloud/ipallocator
- mkdir debian/tmp/var/log/cloud/usage
- mkdir -p debian/tmp/etc/cloud
- mkdir debian/tmp/etc/cloud/agent
- mkdir debian/tmp/etc/cloud/server
- mkdir debian/tmp/etc/cloud/management
- mkdir debian/tmp/etc/cloud/usage
- mkdir -p debian/tmp/var/cache/cloud
- mkdir debian/tmp/var/cache/cloud/management
- mkdir -p debian/tmp/usr/share/cloud
- mkdir debian/tmp/usr/share/cloud/setup
- mkdir -p debian/tmp/usr/share/cloud/management/webapps/client
-
- cp -r client/target/utilities/scripts/db/* debian/tmp/usr/share/cloud/setup/
- cp -r client/target/cloud-client-ui-4.1.0-SNAPSHOT/* debian/tmp/usr/share/cloud/management/webapps/client/
- dh_installdirs -s
- dh_install -s
-binary: binary-common
-binary-common:
- dh_testdir
- dh_testroot
+ # Common packages
+ mkdir -p $(DESTDIR)/$(SYSCONFDIR)/$(PACKAGE)
+ mkdir -p $(DESTDIR)/$(SYSCONFDIR)/init.d
+ mkdir -p $(DESTDIR)/var/cache/$(PACKAGE)
+ mkdir -p $(DESTDIR)/var/log/$(PACKAGE)
+ mkdir -p $(DESTDIR)/var/lib/$(PACKAGE)
+ mkdir -p $(DESTDIR)/usr/bin
+ mkdir -p $(DESTDIR)/usr/share
+
+ # cloudstack-agent
+ mkdir $(DESTDIR)/$(SYSCONFDIR)/$(PACKAGE)/agent
+ mkdir $(DESTDIR)/var/log/$(PACKAGE)/agent
+ mkdir $(DESTDIR)/usr/share/$(PACKAGE)-agent
+ mkdir $(DESTDIR)/usr/share/$(PACKAGE)-agent/plugins
+ install -D agent/target/cloud-agent-$(VERSION)-SNAPSHOT.jar $(DESTDIR)/usr/share/$(PACKAGE)-agent/lib/$(PACKAGE)-agent.jar
+ install -D plugins/hypervisors/kvm/target/cloud-plugin-hypervisor-kvm-$(VERSION)-SNAPSHOT.jar $(DESTDIR)/usr/share/$(PACKAGE)-agent/lib/
+ install -D plugins/hypervisors/kvm/target/dependencies/* $(DESTDIR)/usr/share/$(PACKAGE)-agent/lib/
+ install -D packaging/debian/init/cloud-agent $(DESTDIR)/$(SYSCONFDIR)/init.d/$(PACKAGE)-agent
+ install -D agent/bindir/cloud-setup-agent.in $(DESTDIR)/usr/bin/cloud-setup-agent
+ install -D agent/bindir/cloud-ssh.in $(DESTDIR)/usr/bin/cloud-ssh
+ install -D agent/target/transformed/* $(DESTDIR)/$(SYSCONFDIR)/$(PACKAGE)/agent
+
+ # cloudstack-management
+ mkdir $(DESTDIR)/$(SYSCONFDIR)/$(PACKAGE)/server
+ mkdir $(DESTDIR)/$(SYSCONFDIR)/$(PACKAGE)/management
+ mkdir -p $(DESTDIR)/usr/share/$(PACKAGE)-management
+ mkdir -p $(DESTDIR)/usr/share/$(PACKAGE)-management/webapps/client
+ mkdir $(DESTDIR)/usr/share/$(PACKAGE)-management/setup
+ mkdir $(DESTDIR)/var/log/$(PACKAGE)/management
+ mkdir $(DESTDIR)/var/cache/$(PACKAGE)/management
+ mkdir $(DESTDIR)/var/cache/$(PACKAGE)/management/work
+ mkdir $(DESTDIR)/var/cache/$(PACKAGE)/management/temp
+ mkdir $(DESTDIR)/var/log/$(PACKAGE)/ipallocator
+ mkdir $(DESTDIR)/var/lib/$(PACKAGE)/management
+ mkdir $(DESTDIR)/var/lib/$(PACKAGE)/mnt
+ cp -r client/target/utilities/scripts/db/* $(DESTDIR)/usr/share/$(PACKAGE)-management/setup/
+ cp -r client/target/cloud-client-ui-$(VERSION)-SNAPSHOT/* $(DESTDIR)/usr/share/$(PACKAGE)-management/webapps/client/
+ cp server/target/conf/* $(DESTDIR)/$(SYSCONFDIR)/$(PACKAGE)/server/
+ cp client/target/conf/* $(DESTDIR)/$(SYSCONFDIR)/$(PACKAGE)/management/
+ ln -s tomcat6-nonssl.conf $(DESTDIR)/$(SYSCONFDIR)/$(PACKAGE)/management/tomcat6.conf
+ mkdir -p $(DESTDIR)/$(SYSCONFDIR)/$(PACKAGE)/management/Catalina/localhost/client
+ install -D packaging/debian/init/cloud-management $(DESTDIR)/$(SYSCONFDIR)/init.d/$(PACKAGE)-management
+ install -D client/bindir/cloud-update-xenserver-licenses.in $(DESTDIR)/usr/bin/cloud-update-xenserver-licenses
+ install -D server/target/cloud-server-$(VERSION)-SNAPSHOT.jar $(DESTDIR)/usr/share/$(PACKAGE)-management/lib/$(PACKAGE)-server.jar
+ ln -s /usr/share/tomcat6/bin $(DESTDIR)/usr/share/$(PACKAGE)-management/bin
+ ln -s ../../..$(SYSCONFDIR)/$(PACKAGE)/management $(DESTDIR)/usr/share/$(PACKAGE)-management/conf
+ ln -s /usr/share/tomcat6/lib $(DESTDIR)/usr/share/$(PACKAGE)-management/lib
+ ln -s ../../../var/log/$(PACKAGE)/management $(DESTDIR)/usr/share/$(PACKAGE)-management/logs
+ ln -s ../../../var/cache/$(PACKAGE)/management/temp $(DESTDIR)/usr/share/$(PACKAGE)-management/temp
+ ln -s ../../../var/cache/$(PACKAGE)/management/work $(DESTDIR)/usr/share/$(PACKAGE)-management/work
+
+ # cloudstack-common
+ mkdir -p $(DESTDIR)/usr/share/$(PACKAGE)-common
+ mkdir $(DESTDIR)/usr/share/$(PACKAGE)-common/scripts
+ mkdir $(DESTDIR)/usr/share/$(PACKAGE)-common/setup
+ cp -r scripts/installer $(DESTDIR)/usr/share/$(PACKAGE)-common/scripts
+ cp -r scripts/network $(DESTDIR)/usr/share/$(PACKAGE)-common/scripts
+ cp -r scripts/storage $(DESTDIR)/usr/share/$(PACKAGE)-common/scripts
+ cp -r scripts/util $(DESTDIR)/usr/share/$(PACKAGE)-common/scripts
+ cp -r scripts/vm $(DESTDIR)/usr/share/$(PACKAGE)-common/scripts
+ install -D client/target/utilities/bin/cloud-migrate-databases $(DESTDIR)/usr/bin
+ install -D client/target/utilities/bin/cloud-set-guest-password $(DESTDIR)/usr/bin
+ install -D client/target/utilities/bin/cloud-set-guest-sshkey $(DESTDIR)/usr/bin
+ install -D client/target/utilities/bin/cloud-setup-databases $(DESTDIR)/usr/bin
+ install -D client/target/utilities/bin/cloud-setup-management $(DESTDIR)/usr/bin
+ install -D client/target/cloud-client-ui-$(VERSION)-SNAPSHOT/WEB-INF/classes/vms/systemvm.iso $(DESTDIR)/usr/share/$(PACKAGE)-common/vms/systemvm.iso
+
+ # cloudstack-python
+ mkdir -p $(DESTDIR)/usr/lib/python2.7/dist-packages
+ cp -r python/lib/cloud* $(DESTDIR)/usr/lib/python2.7/dist-packages
+
+ # cloudstack-usage
+ mkdir $(DESTDIR)/$(SYSCONFDIR)/$(PACKAGE)/usage
+ mkdir $(DESTDIR)/var/log/$(PACKAGE)/usage
+ mkdir $(DESTDIR)/usr/share/$(PACKAGE)-usage
+ mkdir $(DESTDIR)/usr/share/$(PACKAGE)-usage/plugins
+ install -D usage/target/cloud-usage-$(VERSION)-SNAPSHOT.jar $(DESTDIR)/usr/share/$(PACKAGE)-usage/lib/$(PACKAGE)-usage.jar
+ install -D usage/target/dependencies/* $(DESTDIR)/usr/share/$(PACKAGE)-usage/lib/
+ cp usage/target/transformed/* $(DESTDIR)/$(SYSCONFDIR)/$(PACKAGE)/usage/
+ ln -s ../management/db.properties $(DESTDIR)/$(SYSCONFDIR)/$(PACKAGE)/usage/db.properties
+ install -D packaging/debian/init/cloud-usage $(DESTDIR)/$(SYSCONFDIR)/init.d/$(PACKAGE)-usage
+
+ # cloudstack-awsapi
+ mkdir $(DESTDIR)/var/log/$(PACKAGE)/awsapi
+
+ dh_installdirs
+ dh_install
+ dh_python2
+
+binary: install
+ dh_install
dh_installchangelogs
dh_installdocs LICENSE
dh_installdocs DISCLAIMER
diff --git a/deps/XenServerJava/pom.xml b/deps/XenServerJava/pom.xml
index 18ba54f56a3..0f2cdf427c8 100644
--- a/deps/XenServerJava/pom.xml
+++ b/deps/XenServerJava/pom.xml
@@ -21,7 +21,7 @@
org.apache.cloudstack
cloudstack
- 4.1.0-SNAPSHOT
+ 4.2.0-SNAPSHOT
../../pom.xml
xapi
diff --git a/deps/install-non-oss.sh b/deps/install-non-oss.sh
index af495e7cc21..74575a8dbd1 100755
--- a/deps/install-non-oss.sh
+++ b/deps/install-non-oss.sh
@@ -8,7 +8,7 @@
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
-#
+#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -26,10 +26,17 @@ if [ -e cloud-manageontap.jar ]; then mv cloud-manageontap.jar manageontap.jar;
mvn install:install-file -Dfile=manageontap.jar -DgroupId=com.cloud.com.netapp -DartifactId=manageontap -Dversion=4.0 -Dpackaging=jar
# From https://my.vmware.com/group/vmware/get-download?downloadGroup=VSDK41
-# Version: 4.1, Release-date: 2010-07-13, Build: 257238
+# Version: 4.1, Release-date: 2010-07-13, Build: 257238
if [ -e vmware-apputils.jar ]; then mv vmware-apputils.jar apputils.jar; fi
if [ -e vmware-vim.jar ]; then mv vmware-vim.jar vim.jar; fi
if [ -e vmware-vim25.jar ]; then mv vmware-vim25.jar vim25.jar; fi
mvn install:install-file -Dfile=vim25.jar -DgroupId=com.cloud.com.vmware -DartifactId=vmware-vim25 -Dversion=4.1 -Dpackaging=jar
mvn install:install-file -Dfile=apputils.jar -DgroupId=com.cloud.com.vmware -DartifactId=vmware-apputils -Dversion=4.1 -Dpackaging=jar
mvn install:install-file -Dfile=vim.jar -DgroupId=com.cloud.com.vmware -DartifactId=vmware-vim -Dversion=4.1 -Dpackaging=jar
+
+#
+# From https://my.vmware.com/group/vmware/get-download?downloadGroup=VSP510-WEBSDK-510
+# Version: 5.1, Release-date: 2012-09-10, Build: 774886
+mvn install:install-file -Dfile=vim25_51.jar -DgroupId=com.cloud.com.vmware -DartifactId=vmware-vim25 -Dversion=5.1 -Dpackaging=jar
+
+
diff --git a/developer/developer-prefill.sql b/developer/developer-prefill.sql
index 8713d731645..6300d35df64 100644
--- a/developer/developer-prefill.sql
+++ b/developer/developer-prefill.sql
@@ -18,25 +18,25 @@
-- Add a default ROOT domain
use cloud;
-INSERT INTO `cloud`.`domain` (id, uuid, name, parent, path, owner, region_id) VALUES
- (1, UUID(), 'ROOT', NULL, '/', 2, 1);
+INSERT INTO `cloud`.`domain` (id, uuid, name, parent, path, owner) VALUES
+ (1, UUID(), 'ROOT', NULL, '/', 2);
-- Add system and admin accounts
-INSERT INTO `cloud`.`account` (id, uuid, account_name, type, domain_id, state, region_id) VALUES
- (1, UUID(), 'system', 1, 1, 'enabled', 1);
+INSERT INTO `cloud`.`account` (id, uuid, account_name, type, domain_id, state) VALUES
+ (1, UUID(), 'system', 1, 1, 'enabled');
-INSERT INTO `cloud`.`account` (id, uuid, account_name, type, domain_id, state, region_id) VALUES
- (2, UUID(), 'admin', 1, 1, 'enabled', 1);
+INSERT INTO `cloud`.`account` (id, uuid, account_name, type, domain_id, state) VALUES
+ (2, UUID(), 'admin', 1, 1, 'enabled');
-- Add system user
INSERT INTO `cloud`.`user` (id, uuid, username, password, account_id, firstname,
- lastname, email, state, created, region_id) VALUES (1, UUID(), 'system', RAND(),
- '1', 'system', 'cloud', NULL, 'enabled', NOW(), 1);
+ lastname, email, state, created) VALUES (1, UUID(), 'system', RAND(),
+ '1', 'system', 'cloud', NULL, 'enabled', NOW());
-- Add system user with encrypted password=password
INSERT INTO `cloud`.`user` (id, uuid, username, password, account_id, firstname,
- lastname, email, state, created, region_id) VALUES (2, UUID(), 'admin', '5f4dcc3b5aa765d61d8327deb882cf99',
- '2', 'Admin', 'User', 'admin@mailprovider.com', 'enabled', NOW(), 1);
+ lastname, email, state, created) VALUES (2, UUID(), 'admin', '5f4dcc3b5aa765d61d8327deb882cf99',
+ '2', 'Admin', 'User', 'admin@mailprovider.com', 'enabled', NOW());
-- Add configurations
INSERT INTO `cloud`.`configuration` (category, instance, component, name, value)
diff --git a/developer/pom.xml b/developer/pom.xml
index 79b24665542..ff47b143093 100644
--- a/developer/pom.xml
+++ b/developer/pom.xml
@@ -18,7 +18,7 @@
org.apache.cloudstack
cloudstack
- 4.1.0-SNAPSHOT
+ 4.2.0-SNAPSHOT
@@ -27,7 +27,12 @@
5.1.21
runtime
-
+
+ org.apache.cloudstack
+ cloud-plugin-hypervisor-simulator
+ ${project.version}
+ compile
+
install
@@ -152,10 +157,6 @@
${basedir}/target/db/create-schema.sql
${basedir}/target/db/create-schema-premium.sql
-
- ${basedir}/target/db/create-schema-view.sql
-
- ${basedir}/target/db/4.1-new-db-schema.sql
${basedir}/target/db/templates.sql
@@ -182,115 +183,9 @@
catalina.home
${project.parent.basedir}/utils
-
-
-
-
-
-
-
-
-
- simulator
-
-
- deploydb-simulator
-
-
-
-
-
- org.codehaus.mojo
- properties-maven-plugin
- 1.0-alpha-2
-
-
- initialize
-
- read-project-properties
-
-
-
- ${project.parent.basedir}/utils/conf/db.properties
- ${project.parent.basedir}/utils/conf/db.properties.override
-
- true
-
-
-
-
-
-
- org.codehaus.mojo
- exec-maven-plugin
- 1.2.1
-
-
-
- mysql
- mysql-connector-java
- ${cs.mysql.version}
-
-
- commons-dbcp
- commons-dbcp
- ${cs.dbcp.version}
-
-
- commons-pool
- commons-pool
- ${cs.pool.version}
-
-
- org.jasypt
- jasypt
- ${cs.jasypt.version}
-
-
- org.apache.cloudstack
- cloud-utils
- ${project.version}
-
-
- org.apache.cloudstack
- cloud-server
- ${project.version}
-
-
-
-
- process-resources
- create-schema
-
- java
-
-
-
-
- false
- true
-
- org.apache.cloudstack
- cloud-server
-
- com.cloud.upgrade.DatabaseCreator
-
-
- ${project.parent.basedir}/utils/conf/db.properties
- ${project.parent.basedir}/utils/conf/db.properties.override
-
- ${basedir}/target/db/create-schema-simulator.sql
- ${basedir}/target/db/templates.simulator.sql
-
- com.cloud.upgrade.DatabaseUpgradeChecker
- --database=simulator
- --rootpassword=${db.root.password}
-
-
-
- catalina.home
- ${project.parent.basedir}/utils
+ paths.script
+ ${basedir}/target/db
diff --git a/docs/en-US/Developers_Guide.xml b/docs/en-US/Developers_Guide.xml
index e753f9bcb33..c86208b3271 100644
--- a/docs/en-US/Developers_Guide.xml
+++ b/docs/en-US/Developers_Guide.xml
@@ -26,7 +26,7 @@
&PRODUCT; Developer's Guide
Apache CloudStack
- 4.0.0-incubating
+ 4.1.0-incubating
diff --git a/docs/en-US/accessing-vms.xml b/docs/en-US/accessing-vms.xml
index ce780cff080..67d9d774172 100644
--- a/docs/en-US/accessing-vms.xml
+++ b/docs/en-US/accessing-vms.xml
@@ -32,9 +32,9 @@
To access a VM directly over the network:
- The VM must have some port open to incoming traffic. For example, in a basic zone, a new VM might be assigned to a security group which allows incoming traffic. This depends on what security group you picked when creating the VM. In other cases, you can open a port by setting up a port forwarding policy. See IP Forwarding and Firewalling.
+ The VM must have some port open to incoming traffic. For example, in a basic zone, a new VM might be assigned to a security group which allows incoming traffic. This depends on what security group you picked when creating the VM. In other cases, you can open a port by setting up a port forwarding policy. See .
If a port is open but you can not access the VM using ssh, it’s possible that ssh is not already enabled on the VM. This will depend on whether ssh is enabled in the template you picked when creating the VM. Access the VM through the &PRODUCT; UI and enable ssh on the machine using the commands for the VM’s operating system.
- If the network has an external firewall device, you will need to create a firewall rule to allow access. See IP Forwarding and Firewalling.
+ If the network has an external firewall device, you will need to create a firewall rule to allow access. See .
diff --git a/docs/en-US/add-clusters-ovm.xml b/docs/en-US/add-clusters-ovm.xml
index aa07dfa6506..d0b0688e6a3 100644
--- a/docs/en-US/add-clusters-ovm.xml
+++ b/docs/en-US/add-clusters-ovm.xml
@@ -28,12 +28,12 @@
Add a companion non-OVM cluster to the Pod. This cluster provides an environment where the &PRODUCT; System VMs can run. You should have already installed a non-OVM hypervisor on at least one Host to prepare for this step. Depending on which hypervisor you used:
- For VMWare, follow the steps in Add Cluster: vSphere. When finished, return here and continue with the next step.
+ For VMWare, follow the steps in . When finished, return here and continue with the next step.
For KVM or XenServer, follow the steps in . When finished, return here and continue with the next step
- In the left navigation, choose Infrastructure. In Zones, click View More, then click the zone in which you want to add the cluster.
- Click the Compute tab. In the Pods node, click View All. Select the same pod you used in step 1.
+ In the left navigation, choose Infrastructure. In Zones, click View All, then click the zone in which you want to add the cluster.
+ Click the Compute and Storage tab. In the Pods node, click View All.
Click View Clusters, then click Add Cluster.
The Add Cluster dialog is displayed.
In Hypervisor, choose OVM.
diff --git a/docs/en-US/add-remove-nic.xml b/docs/en-US/add-remove-nic.xml
new file mode 100644
index 00000000000..15dc66c2b83
--- /dev/null
+++ b/docs/en-US/add-remove-nic.xml
@@ -0,0 +1,127 @@
+
+
+%BOOK_ENTITIES;
+]>
+
+
+ Reconfiguring Physical Networks in VMs
+ &PRODUCT; provides you the ability to move VMs between networks and reconfigure a VM's
+ network. You can remove a VM from a physical network and add to a new physical network. You can
+ also change the default physical network of a virtual machine. With this functionality, hybrid
+ or traditional server loads can be accommodated with ease.
+ This feature is supported on XenServer and KVM hypervisors.
+ The following APIs have been added to support this feature. These API calls can function
+ only while the VM is in running or stopped state.
+
+ addNicToVirtualMachine
+ The addNicToVirtualMachine API adds a new NIC to the specified VM on a selected
+ network.
+
+
+
+
+ parameter
+ description
+ Value
+
+
+
+
+ virtualmachineid
+ The unique ID of the VM to which the NIC is to be added.
+ true
+
+
+ networkid
+ The unique ID of the network the NIC that you add should apply
+ to.
+ true
+
+
+ ipaddress
+ The IP address of the VM on the network.
+ false
+
+
+
+
+ The network and VM must reside in the same zone. Two VMs with the same name cannot reside
+ in the same network. Therefore, adding a second VM that duplicates a name on a network will
+ fail.
+
+
+ removeNicFromVirtualMachine
+ The removeNicFromVirtualMachine API removes a NIC from the specified VM on a selected
+ network.
+
+
+
+
+ parameter
+ description
+ Value
+
+
+
+
+ virtualmachineid
+ The unique ID of the VM from which the NIC is to be removed.
+
+ true
+
+
+ nicid
+ The unique ID of the NIC that you want to remove.
+ true
+
+
+
+
+ Removing the default NIC is not allowed.
+
+
+ updateDefaultNicForVirtualMachine
+ The updateDefaultNicForVirtualMachine API updates the specified NIC to be the default one
+ for a selected VM.
+
+
+
+
+ parameter
+ description
+ Value
+
+
+
+
+ virtualmachineid
+ The unique ID of the VM for which you want to specify the default NIC.
+
+ true
+
+
+ nicid
+ The unique ID of the NIC that you want to set as the default
+ one.
+ true
+
+
+
+
+
+
diff --git a/docs/en-US/added-API-commands-4-1.xml b/docs/en-US/added-API-commands-4-1.xml
new file mode 100644
index 00000000000..aa5529e41ff
--- /dev/null
+++ b/docs/en-US/added-API-commands-4-1.xml
@@ -0,0 +1,69 @@
+
+
+%BOOK_ENTITIES;
+]>
+
+
+ Added API Commands in 4.1-incubating
+
+
+ createEgressFirewallRules (creates an egress firewall rule on the guest network.)
+
+
+ deleteEgressFirewallRules (deletes a egress firewall rule on the guest network.)
+
+
+ listEgressFirewallRules (lists the egress firewall rules configured for a guest
+ network.)
+
+
+ resetSSHKeyForVirtualMachine (Resets the SSHkey for virtual machine.)
+
+
+ addBaremetalHost (Adds a new host.)
+
+
+ addNicToVirtualMachine (Adds a new NIC to the specified VM on a selected
+ network.)
+
+
+ removeNicFromVirtualMachine (Removes the specified NIC from a selected VM.)
+
+
+ updateDefaultNicForVirtualMachine (Updates the specified NIC to be the default one for a
+ selected VM.)
+
+
+ addRegion (Registers a Region into another Region.)
+
+
+ updateRegion (Updates Region details: ID, Name, Endpoint, User API Key, and User Secret
+ Key.)
+
+
+ removeRegion (Removes a Region from current Region.)
+
+
+ listRegions (Get all the Regions. They can be filtered by using the ID or Name.)
+
+
+ getUser (This API can only be used by the Admin. Get user details by using the API Key.)
+
+
+
+
diff --git a/docs/en-US/added-error-codes.xml b/docs/en-US/added-error-codes.xml
index dbfea263598..ae7389122f9 100644
--- a/docs/en-US/added-error-codes.xml
+++ b/docs/en-US/added-error-codes.xml
@@ -24,7 +24,7 @@
Added &PRODUCT; Error Codes
- You can now find the &PRODUCT;-specific error code in the exception response for each type of exception. The following list of error codes is added to the new class named CSExceptionErrorCode. These codes are applicable in &PRODUCT; 3.0.3 and later versions.
+ You can now find the &PRODUCT;-specific error code in the exception response for each type of exception. The following list of error codes is added to the new class named CSExceptionErrorCode.
diff --git a/docs/en-US/advanced-zone-guest-ip-addresses.xml b/docs/en-US/advanced-zone-guest-ip-addresses.xml
index fbc6144bec1..66bc0826683 100644
--- a/docs/en-US/advanced-zone-guest-ip-addresses.xml
+++ b/docs/en-US/advanced-zone-guest-ip-addresses.xml
@@ -11,9 +11,7 @@
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
-
http://www.apache.org/licenses/LICENSE-2.0
-
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -22,6 +20,12 @@
under the License.
-->
- Advanced Zone Guest IP Addresses
- When advanced networking is used, the administrator can create additional networks for use by the guests. These networks can span the zone and be available to all accounts, or they can be scoped to a single account, in which case only the named account may create guests that attach to these networks. The networks are defined by a VLAN ID, IP range, and gateway. The administrator may provision thousands of these networks if desired.
+ Advanced Zone Guest IP Addresses
+ When advanced networking is used, the administrator can create additional networks for use
+ by the guests. These networks can span the zone and be available to all accounts, or they can be
+ scoped to a single account, in which case only the named account may create guests that attach
+ to these networks. The networks are defined by a VLAN ID, IP range, and gateway. The
+ administrator may provision thousands of these networks if desired. Additionally, the
+ administrator can reserve a part of the IP address space for non-&PRODUCT; VMs and
+ servers.
diff --git a/docs/en-US/aws-ec2-configuration.xml b/docs/en-US/aws-ec2-configuration.xml
index 7d26027ba35..dd7732ebced 100644
--- a/docs/en-US/aws-ec2-configuration.xml
+++ b/docs/en-US/aws-ec2-configuration.xml
@@ -28,14 +28,13 @@
The software that provides AWS API compatibility is installed along with &PRODUCT;. You must enable the services and perform some setup steps prior to using it.
- Set the global configuration parameters for each service to true.
+ Set the global configuration parameters for each service to true.
See .
Create a set of &PRODUCT; service offerings with names that match the Amazon service offerings.
You can do this through the &PRODUCT; UI as described in the Administration Guide.
Be sure you have included the Amazon default service offering, m1.small. As well as any EC2 instance types that you will use.
- If you did not already do so when you set the configuration parameter in step 1,
- restart the Management Server.
+ If you did not already do so when you set the configuration parameter in step , restart the Management Server.
# service cloud-management restart
diff --git a/docs/en-US/aws-ec2-user-setup.xml b/docs/en-US/aws-ec2-user-setup.xml
index edc371ef376..f41eaa158d7 100644
--- a/docs/en-US/aws-ec2-user-setup.xml
+++ b/docs/en-US/aws-ec2-user-setup.xml
@@ -45,7 +45,7 @@
AWS API User Registration
Each user must perform a one-time registration. The user follows these steps:
-
+
Obtain the following by looking in the &PRODUCT; UI, using the API, or asking the cloud administrator:
@@ -69,7 +69,7 @@
wget -O cloudstack-aws-api-register "https://git-wip-us.apache.org/repos/asf?p=incubator-cloudstack.git;a=blob_plain;f=awsapi-setup/setup/cloudstack-aws-api-register;hb=HEAD"
- Then execute it, using the parameter values that were obtained in step 1. An example is shown below.
+ Then execute it, using the access and secret keys that were obtained in step . An example is shown below.
$ cloudstack-aws-api-register --apikey=User’s &PRODUCT; API key --secretkey=User’s &PRODUCT; Secret key --cert=/path/to/cert.pem --url=http://&PRODUCT;.server:7080/awsapi
diff --git a/docs/en-US/build-deb.xml b/docs/en-US/build-deb.xml
index 37e5a7d7474..dca31d23a28 100644
--- a/docs/en-US/build-deb.xml
+++ b/docs/en-US/build-deb.xml
@@ -51,7 +51,7 @@
and packaging them into DEBs by issuing the following command.
-$ dpkg-buildpackge -uc -us
+$ dpkg-buildpackage -uc -us
diff --git a/docs/en-US/build-rpm.xml b/docs/en-US/build-rpm.xml
index e983aba8fe5..ba32ef568ab 100644
--- a/docs/en-US/build-rpm.xml
+++ b/docs/en-US/build-rpm.xml
@@ -5,78 +5,82 @@
]>
- Building RPMs
-
- While we have defined, and you have presumably already installed the
- bootstrap prerequisites, there are a number of build time prerequisites
- that need to be resolved. &PRODUCT; uses maven for dependency resolution.
- You can resolve the buildtime depdencies for CloudStack by running the
- following command:
- $ mvn -P deps
-
-
- Now that we have resolved the dependencies we can move on to building &PRODUCT;
- and packaging them into RPMs by issuing the following command.
- $ ./waf rpm
-
-
- Once this completes, you should find assembled RPMs in
- artifacts/rpmbuild/RPMS/x86_64
-
-
- Creating a yum repo
-
- While RPMs is an ideal packaging format - it's most easily consumed from
- yum repositories over a network. We'll move into the directory with the
- newly created RPMs by issuing the following command:
- $ cd artifacts/rpmbuild/RPMS/x86_64
-
-
- Next we'll issue a command to create the repository metadata by
- issuing the following command:
- $ createrepo ./
-
-
- The files and directories within our current working directory can now
- be uploaded to a web server and serve as a yum repository
-
+ Building RPMs from Source
+ As mentioned previously in , you will need to install several prerequisites before you can build packages for &PRODUCT;. Here we'll assume you're working with a 64-bit build of CentOS or Red Hat Enterprise Linux.
+ # yum groupinstall "Development Tools"
+ # yum install java-1.6.0-openjdk-devel.x86_64 genisoimage mysql mysql-server ws-common-utils MySQL-python tomcat6 createrepo
+ Next, you'll need to install build-time dependencies for CloudStack with
+ Maven. We're using Maven 3, so you'll want to
+ grab a Maven 3 tarball
+ and uncompress it in your home directory (or whatever location you prefer):
+ $ tar zxvf apache-maven-3.0.4-bin.tar.gz
+ $ export PATH=/usr/local/apache-maven-3.0.4//bin:$PATH
+ Maven also needs to know where Java is, and expects the JAVA_HOME environment
+ variable to be set:
+ $ export JAVA_HOME=/usr/lib/jvm/jre-1.6.0-openjdk.x86_64/
+ Verify that Maven is installed correctly:
+ $ mvn --version
+ You probably want to ensure that your environment variables will survive a logout/reboot.
+ Be sure to update ~/.bashrc with the PATH and JAVA_HOME variables.
+
+ Building RPMs for $PRODUCT; is fairly simple. Assuming you already have the source downloaded and have uncompressed the tarball into a local directory, you're going to be able to generate packages in just a few minutes.
+ Packaging has Changed
+ If you've created packages for $PRODUCT; previously, you should be aware that the process has changed considerably since the project has moved to using Apache Maven. Please be sure to follow the steps in this section closely.
+
+
+ Generating RPMS
+ Now that we have the prerequisites and source, you will cd to the packaging/centos63/ directory.
+ Generating RPMs is done using the package.sh script:
+ $./package.sh
+
+ That will run for a bit and then place the finished packages in dist/rpmbuild/RPMS/x86_64/.
+ You should see seven RPMs in that directory: cloudstack-agent-4.1.0-SNAPSHOT.el6.x86_64.rpm, cloudstack-awsapi-4.1.0-SNAPSHOT.el6.x86_64.rpm, cloudstack-cli-4.1.0-SNAPSHOT.el6.x86_64.rpm, cloudstack-common-4.1.0-SNAPSHOT.el6.x86_64.rpm, cloudstack-docs-4.1.0-SNAPSHOT.el6.x86_64.rpm, cloudstack-management-4.1.0-SNAPSHOT.el6.x86_64.rpm, and cloudstack-usage-4.1.0-SNAPSHOT.el6.x86_64.rpm.
+
+ Creating a yum repo
+
+ While RPMs is a useful packaging format - it's most easily consumed from Yum repositories over a network. The next step is to create a Yum Repo with the finished packages:
+ $ mkdir -p ~/tmp/repo
+ $ cp dist/rpmbuild/RPMS/x86_64/*rpm ~/tmp/repo/
+ $ createrepo ~/tmp/repo
+
+
+ The files and directories within ~/tmp/repo can now be uploaded to a web server and serve as a yum repository.
+
+
+
+ Configuring your systems to use your new yum repository
+
+ Now that your yum repository is populated with RPMs and metadata
+ we need to configure the machines that need to install $PRODUCT;.
+ Create a file named /etc/yum.repos.d/cloudstack.repo with this information:
+
+ [apache-cloudstack]
+ name=Apache CloudStack
+ baseurl=http://webserver.tld/path/to/repo
+ enabled=1
+ gpgcheck=0
+
+
+ Completing this step will allow you to easily install $PRODUCT; on a number of machines across the network.
+
+
+
-
- Configuring your systems to use your new yum repository
-
- Now that your yum repository is populated with RPMs and metadata
- we need to configure our machines that need to install CloudStack.
- We will create a file at /etc/yum.repos.d/cloudstack.repo
- with the following content:
-
-[apache-cloudstack]
-name=Apache CloudStack
-baseurl=http://webserver.tld/path/to/repo
-enabled=1
-gpgcheck=0
-
-
-
- Completing this step will allow you to easily install CloudStack on a number of
- machines across the network.
-
-
-
diff --git a/docs/en-US/building-marvin.xml b/docs/en-US/building-marvin.xml
index 3dac9d65d60..3332b16d9b1 100644
--- a/docs/en-US/building-marvin.xml
+++ b/docs/en-US/building-marvin.xml
@@ -25,8 +25,8 @@
Building and Installing Marvin
Marvin is built with Maven and is dependent on APIdoc. To build it do the following in the root tree of &PRODUCT;:
- mvn -P developer -l :cloud-apidoc
- mvn -P developer -l :cloud-marvin
+ mvn -P developer -pl :cloud-apidoc
+ mvn -P developer -pl :cloud-marvin
If successfull the build will have created the cloudstackAPI Python package under tools/marvin/marvin/cloudstackAPI as well as a gziped Marvin package under tools/marvin dist. To install the Python Marvin module do the following in tools/marvin:
sudo python ./setup.py install
The dependencies will be downloaded the Python module installed and you should be able to use Marvin in Python. Check that you can import the module before starting to use it.
diff --git a/docs/en-US/change-console-proxy-ssl-certificate-domain.xml b/docs/en-US/change-console-proxy-ssl-certificate-domain.xml
index 46ceaae1a19..89796a22c23 100644
--- a/docs/en-US/change-console-proxy-ssl-certificate-domain.xml
+++ b/docs/en-US/change-console-proxy-ssl-certificate-domain.xml
@@ -38,8 +38,8 @@
In the Update SSL Certificate screen of the &PRODUCT; UI, paste the following
- Certificate from step 1(c).
- Private key from step 1(e).
+ The Certificate you generated in the previous steps.
+ The Private key you generated in the previous steps.
The desired new domain name; for example, company.com
diff --git a/docs/en-US/changed-apicommands-4.1.xml b/docs/en-US/changed-apicommands-4.1.xml
new file mode 100644
index 00000000000..42bd088afb3
--- /dev/null
+++ b/docs/en-US/changed-apicommands-4.1.xml
@@ -0,0 +1,106 @@
+
+
+%BOOK_ENTITIES;
+]>
+
+
+ Changed API Commands in 4.1-incubating
+
+
+
+
+
+
+ API Commands
+ Description
+
+
+
+
+
+ createNetworkOffering
+ listNetworkOfferings
+ listNetworks
+
+
+ The following request parameters is added: isPersistent.
+ This parameter determines if the network or network offering created or listed by
+ using this offering are persistent or not.
+
+
+
+
+ addF5LoadBalancer
+ configureNetscalerLoadBalancer
+ addNetscalerLoadBalancer
+ listF5LoadBalancers
+ configureF5LoadBalancer
+ listNetscalerLoadBalancers
+
+
+ The following response parameter is removed: inline.
+
+
+
+ listFirewallRules
+ createFirewallRule
+
+ The following request parameter is added: traffictype (optional).
+
+
+
+ listUsageRecords
+ The following response parameter is added: virtualsize.
+
+
+
+
+ deleteIso
+
+
+ The following request parameter is added: forced (optional).
+
+
+
+
+ createStoragePool
+
+
+ The following request parameters are made mandatory:
+
+
+ podid
+
+
+ clusterid
+
+
+
+
+
+
+ listZones
+
+
+ The following request parameters is added: securitygroupenabled
+
+
+
+
+
+
diff --git a/docs/en-US/citrix-xenserver-installation.xml b/docs/en-US/citrix-xenserver-installation.xml
index 867d36e1b10..40538658078 100644
--- a/docs/en-US/citrix-xenserver-installation.xml
+++ b/docs/en-US/citrix-xenserver-installation.xml
@@ -261,15 +261,15 @@ server 3.xenserver.pool.ntp.org
Connect FiberChannel cable to all hosts in the cluster and to the FiberChannel storage
host.
-
+
Rescan the SCSI bus. Either use the following command or use XenCenter to perform an
HBA rescan.
# scsi-rescan
- Repeat step 2 on every host.
+ Repeat step on every host.
-
+
Check to be sure you see the new SCSI disk.
# ls /dev/disk/by-id/scsi-360a98000503365344e6f6177615a516b -l
The output should look like this, although the specific file name will be different
@@ -279,7 +279,7 @@ server 3.xenserver.pool.ntp.org
- Repeat step 4 on every host.
+ Repeat step on every host.
On the storage server, run this command to get a unique ID for the new SR.
diff --git a/docs/en-US/cloudmonkey.xml b/docs/en-US/cloudmonkey.xml
new file mode 100644
index 00000000000..0057562cca2
--- /dev/null
+++ b/docs/en-US/cloudmonkey.xml
@@ -0,0 +1,224 @@
+
+
+%BOOK_ENTITIES;
+]>
+
+
+
+
+ CloudMonkey
+ CloudMonkey is the &PRODUCT; Command Line Interface (CLI). It is written in Python and leverages Marvin. CloudMonkey can be used both as an interactive shell and as a command line tool which simplifies &PRODUCT; configuration and management.
+
+ CloudMonkey is still under development and should be considered a Work In Progress (WIP), the wiki is the most up to date documentation:
+ https://cwiki.apache.org/CLOUDSTACK/cloudstack-cloudmonkey-cli.html
+
+
+
+ Installing CloudMonkey
+ There are two ways to get CloudMonkey:
+
+
+ Via the official Apache &PRODUCT; releases (starting with 4.1).
+
+
+
+
+
+ Via a community maintained package on Cheese Shop
+ pip install cloudmonkey
+
+
+
+
+
+
+ Configuration
+ To configure CloudMonkey you can edit the .cloudmonkey_config file in the user's home directory as shown below. The values can also be set interactively at the cloudmonkey prompt
+
+$ cat .cloudmonkey_config
+[CLI]
+protocol = http
+asyncblock = true
+color = true
+prompt = cloudmonkey>
+history_file = /Users/sebastiengoasguen/.cloudmonkey_history
+host = localhost
+path = /client/api
+port = 8080
+apikey = plgWJfZK4gyS3mOMTVmjUVg-X-jlWlnfaUJ9GAbBbf9EdM-kAYMmAiLqzzq1ElZLYq_u38zCm0bewzGUdP66mg
+secretkey = VDaACYb0LV9eNjTetIOElcVQkvJck_J_QljX_FcHRj87ZKiy0z0ty0ZsYBkoXkY9b7eq1EhwJaw7FF3akA3KBQ
+timeout = 600
+log_file = /Users/sebastiengoasguen/.cloudmonkey_log
+
+ The values can also be set at the cloudmonkey prompt. The API and secret keys are obtained via the &PRODUCT; UI or via a raw api call.
+
+ set prompt myprompt>
+myprompt> set host localhost
+myprompt> set port 8080
+myprompt> set apikey
+myprompt> set secretkey
+]]>
+
+ You can use cloudmonkey to interact with a local cloud, and even with a remote public cloud. You just need to set the host value properly and obtain the keys from the cloud administrator.
+
+
+
+ Interactive Shell Usage
+ To start learning cloudmonkey, the best is to use the interactive shell. Simply type cloudmonkey at the prompt and you should get the interactive shell.
+ At the cloudmonkey prompt press the tab key twice, you will see all potential verbs available. Pick on, enter a space and then press tab twice. You will see all actions available for that verb
+
+
+EOF assign cancel create detach extract ldap prepare reconnect restart shell update
+activate associate change delete disable generate list query register restore start upload
+add attach configure deploy enable get mark quit remove revoke stop
+api authorize copy destroy exit help migrate reboot reset set suspend
+cloudmonkey>create
+account diskoffering loadbalancerrule portforwardingrule snapshot tags vpc
+autoscalepolicy domain network privategateway snapshotpolicy template vpcoffering
+autoscalevmgroup firewallrule networkacl project sshkeypair user vpnconnection
+autoscalevmprofile instancegroup networkoffering remoteaccessvpn staticroute virtualrouterelement vpncustomergateway
+condition ipforwardingrule physicalnetwork securitygroup storagenetworkiprange vlaniprange vpngateway
+counter lbstickinesspolicy pod serviceoffering storagepool volume zone
+]]>
+
+ Picking one action and entering a space plus the tab key, you will obtain the list of parameters for that specific api call.
+
+create network
+account= domainid= isAsync= networkdomain= projectid= vlan=
+acltype= endip= name= networkofferingid= startip= vpcid=
+displaytext= gateway= netmask= physicalnetworkid= subdomainaccess= zoneid=
+]]>
+
+ To get additional help on that specific api call you can use the following:
+
+create network -h
+Creates a network
+Required args: displaytext name networkofferingid zoneid
+Args: account acltype displaytext domainid endip gateway isAsync name netmask networkdomain networkofferingid physicalnetworkid projectid startip subdomainaccess vlan vpcid zoneid
+
+cloudmonkey>create network -help
+Creates a network
+Required args: displaytext name networkofferingid zoneid
+Args: account acltype displaytext domainid endip gateway isAsync name netmask networkdomain networkofferingid physicalnetworkid projectid startip subdomainaccess vlan vpcid zoneid
+
+cloudmonkey>create network --help
+Creates a network
+Required args: displaytext name networkofferingid zoneid
+Args: account acltype displaytext domainid endip gateway isAsync name netmask networkdomain networkofferingid physicalnetworkid projectid startip subdomainaccess vlan vpcid zoneid
+cloudmonkey>
+]]>
+
+ Note the required arguments necessary for the calls.
+ To find out the required parameters value, using a debugger console on the &PRODUCT; UI might be very useful. For instance using Firebug on Firefox, you can navigate the UI and check the parameters values for each call you are making as you navigate the UI.
+
+
+
+ Starting a Virtual Machine instance with CloudMonkey
+ To start a virtual machine instance we will use the deploy virtualmachine call.
+
+deploy virtualmachine -h
+Creates and automatically starts a virtual machine based on a service offering, disk offering, and template.
+Required args: serviceofferingid templateid zoneid
+Args: account diskofferingid displayname domainid group hostid hypervisor ipaddress iptonetworklist isAsync keyboard keypair name networkids projectid securitygroupids securitygroupnames serviceofferingid size startvm templateid userdata zoneid
+]]>
+
+ The required arguments are serviceofferingid, templateid and zoneid
+ In order to specify the template that we want to use, we can list all available templates with the following call:
+
+list templates templatefilter=all
+count = 2
+template:
+========
+domain = ROOT
+domainid = 8a111e58-e155-4482-93ce-84efff3c7c77
+zoneid = e1bfdfaf-3d9b-43d4-9aea-2c9f173a1ae7
+displaytext = SystemVM Template (XenServer)
+ostypeid = 849d7d0a-9fbe-452a-85aa-70e0a0cbc688
+passwordenabled = False
+id = 6d360f79-4de9-468c-82f8-a348135d298e
+size = 2101252608
+isready = True
+templatetype = SYSTEM
+zonename = devcloud
+...
+]]>
+
+ In this snippet, I used DevCloud and only showed the beginning output of the first template, the SystemVM template
+ Similarly to get the serviceofferingid you would do:
+
+list serviceofferings | grep id
+id = ef2537ad-c70f-11e1-821b-0800277e749c
+id = c66c2557-12a7-4b32-94f4-48837da3fa84
+id = 3d8b82e5-d8e7-48d5-a554-cf853111bc50
+]]>
+
+ Note that we can use the linux pipe as well as standard linux commands within the interactive shell. Finally we would start an instance with the following call:
+
+deploy virtualmachine templateid=13ccff62-132b-4caf-b456-e8ef20cbff0e zoneid=e1bfdfaf-3d9b-43d4-9aea-2c9f173a1ae7 serviceofferingid=ef2537ad-c70f-11e1-821b-0800277e749c
+jobprocstatus = 0
+created = 2013-03-05T13:04:51-0800
+cmd = com.cloud.api.commands.DeployVMCmd
+userid = 7ed6d5da-93b2-4545-a502-23d20b48ef2a
+jobstatus = 1
+jobid = c441d894-e116-402d-aa36-fdb45adb16b7
+jobresultcode = 0
+jobresulttype = object
+jobresult:
+=========
+virtualmachine:
+==============
+domain = ROOT
+domainid = 8a111e58-e155-4482-93ce-84efff3c7c77
+haenable = False
+templatename = tiny Linux
+...
+]]>
+
+ The instance would be stopped with:
+
+cloudmonkey>stop virtualmachine id=7efe0377-4102-4193-bff8-c706909cc2d2
+
+ The ids that you will use will differ from this example. Make sure you use the ones that corresponds to your &PRODUCT; cloud.
+
+
+
+ Scripting with CloudMonkey
+ All previous examples use CloudMonkey via the interactive shell, however it can be used as a straightfoward CLI, passing the commands to the cloudmonkey command like shown below.
+ $cloudmonkey list users
+ As such it can be used in shell scripts, it can received commands via stdin and its output can be parsed like any other unix commands as mentioned before.
+
+
+
diff --git a/docs/en-US/console-proxy.xml b/docs/en-US/console-proxy.xml
index 3dd7b9fd692..64183b4bfc0 100644
--- a/docs/en-US/console-proxy.xml
+++ b/docs/en-US/console-proxy.xml
@@ -24,11 +24,11 @@
console view via the web UI. It connects the user’s browser to the VNC port made available via
the hypervisor for the console of the guest. Both the administrator and end user web UIs offer a
console connection.
- Clicking on a console icon brings up a new window. The AJAX code downloaded into that window
+ Clicking a console icon brings up a new window. The AJAX code downloaded into that window
refers to the public IP address of a console proxy VM. There is exactly one public IP address
allocated per console proxy VM. The AJAX application connects to this IP. The console proxy then
- proxies the connection to the VNC port for the requested VM on the Host hosting the guest.
- .
+ proxies the connection to the VNC port for the requested VM on the Host hosting the
+ guest.
The hypervisors will have many ports assigned to VNC usage so that multiple VNC sessions
can occur simultaneously.
@@ -108,10 +108,10 @@
In the Update SSL Certificate screen of the &PRODUCT; UI, paste the following:
- Certificate from step 1(c).
+ The certificate you've just generated.
- Private key from step 1(e).
+ The private key you've just generated.
The desired new domain name; for example, company.com
diff --git a/docs/en-US/create-bare-metal-template.xml b/docs/en-US/create-bare-metal-template.xml
index 19db2ed5f30..0ee4c11fead 100644
--- a/docs/en-US/create-bare-metal-template.xml
+++ b/docs/en-US/create-bare-metal-template.xml
@@ -24,7 +24,6 @@
The &PRODUCT; Management server can be installed using either RPM or DEB packages. These
packages will depend on everything you need to run the Management server.
-
- Downloading vhd-util
- This procedure is required only for installations where XenServer is installed on the hypervisor hosts.
- Before setting up the Management Server, download vhd-util from vhd-util.
- If the Management Server is RHEL or CentOS, copy vhd-util to
- /usr/lib64/cloud/common/scripts/vm/hypervisor/xenserver.
- If the Management Server is Ubuntu, copy vhd-util to
- /usr/lib/cloud/common/scripts/vm/hypervisor/xenserver/vhd-util.
-
Install on CentOS/RHEL
We start by installing the required packages:
@@ -50,4 +38,16 @@
Install on Ubuntu
apt-get install cloud-client
-
\ No newline at end of file
+
+
+ Downloading vhd-util
+ This procedure is required only for installations where XenServer is installed on the
+ hypervisor hosts.
+ Before setting up the Management Server, download vhd-util from vhd-util.
+ If the Management Server is RHEL or CentOS, copy vhd-util to
+ /usr/lib64/cloud/common/scripts/vm/hypervisor/xenserver.
+ If the Management Server is Ubuntu, copy vhd-util to
+ /usr/lib/cloud/common/scripts/vm/hypervisor/xenserver.
+
+
diff --git a/docs/en-US/management-server-install-db-local.xml b/docs/en-US/management-server-install-db-local.xml
index 242249040b1..918cdc0a265 100644
--- a/docs/en-US/management-server-install-db-local.xml
+++ b/docs/en-US/management-server-install-db-local.xml
@@ -11,9 +11,7 @@
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
-
http://www.apache.org/licenses/LICENSE-2.0
-
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -29,19 +27,23 @@
MySQL. See .
- Install MySQL from the package repository from your distribution:
+ Install MySQL from the package repository of your distribution:
On RHEL or CentOS:
yum install mysql-server
On Ubuntu:
apt-get install mysql-server
- Edit the MySQL configuration (/etc/my.cnf or /etc/mysql/my.cnf, depending on your OS)
- and insert the following lines in the [mysqld] section. You can put these lines below the
- datadir line. The max_connections parameter should be set to 350 multiplied by the number of
- Management Servers you are deploying. This example assumes one Management Server.
+ Open the MySQL configuration file. The configuration file is /etc/my.cnf or
+ /etc/mysql/my.cnf, depending on your OS.
+
+
+ Insert the following lines in the [mysqld] section.
+ You can put these lines below the datadir line. The max_connections parameter should be
+ set to 350 multiplied by the number of Management Servers you are deploying. This example
+ assumes one Management Server.
- On Ubuntu, you can also create a file /etc/mysql/conf.d/cloudstack.cnf and add these
+ On Ubuntu, you can also create a file /etc/mysql/conf.d/cloudstack.cnf and add these
directives there. Don't forget to add [mysqld] on the first line of the file.
innodb_rollback_on_timeout=1
@@ -68,6 +70,36 @@ binlog-format = 'ROW'
questions.
mysql_secure_installation
+
+ &PRODUCT; can be blocked by security mechanisms, such as SELinux. Disable SELinux to
+ ensure + that the Agent has all the required permissions.
+ Configure SELinux (RHEL and CentOS):
+
+
+ Check whether SELinux is installed on your machine. If not, you can skip this
+ section.
+ In RHEL or CentOS, SELinux is installed and enabled by default. You can verify this
+ with:
+ $ rpm -qa | grep selinux
+
+
+ Set the SELINUX variable in /etc/selinux/config to
+ "permissive". This ensures that the permissive setting will be maintained after a system
+ reboot.
+ In RHEL or CentOS:
+ vi /etc/selinux/config
+ Change the following line
+ SELINUX=enforcing
+ to this:
+ SELINUX=permissive
+
+
+ Set SELinux to permissive starting immediately, without requiring a system
+ reboot.
+ $ setenforce permissive
+
+
+
Set up the database. The following command creates the "cloud" user on the
database.
@@ -98,10 +130,10 @@ binlog-format = 'ROW'
recommended that you replace this with a more secure value. See .
-
- (Optional) For management_server_ip, you may explicitly specify cluster management
- server node IP. If not specified, the local IP address will be used.
-
+
+ (Optional) For management_server_ip, you may explicitly specify cluster management
+ server node IP. If not specified, the local IP address will be used.
+
cloud-setup-databases cloud:<dbpassword>@localhost \
--deploy-as=root:<password> \
@@ -116,9 +148,6 @@ binlog-format = 'ROW'
If you are running the KVM hypervisor on the same machine with the Management Server,
edit /etc/sudoers and add the following line:
Defaults:cloud !requiretty
-
- This type of single-machine setup is recommended only for a trial installation.
-
Now that the database is set up, you can finish configuring the OS for the Management
diff --git a/docs/en-US/management-server-install-nfs-shares.xml b/docs/en-US/management-server-install-nfs-shares.xml
index e917a8e0b6c..a12e09c3eca 100644
--- a/docs/en-US/management-server-install-nfs-shares.xml
+++ b/docs/en-US/management-server-install-nfs-shares.xml
@@ -26,7 +26,7 @@
Prepare NFS Shares
&PRODUCT; needs a place to keep primary and secondary storage (see Cloud Infrastructure Overview). Both of these can be NFS shares. This section tells how to set up the NFS shares before adding the storage to &PRODUCT;.
Alternative Storage
- NFS is not the only option for primary or secondary storage. For example, you may use a Ceph RDB cluster, GlusterFS, iSCSI, and otthers.
+ NFS is not the only option for primary or secondary storage. For example, you may use Ceph RBD, GlusterFS, iSCSI, and others. The choice of storage system will depend on the choice of hypervisor and whether you are dealing with primary or secondary storage.
The requirements for primary and secondary storage are described in:
diff --git a/docs/en-US/networks.xml b/docs/en-US/networks.xml
index a7b9ea12466..f877aa55584 100644
--- a/docs/en-US/networks.xml
+++ b/docs/en-US/networks.xml
@@ -31,6 +31,7 @@
+
@@ -45,4 +46,5 @@
-
\ No newline at end of file
+
+
diff --git a/docs/en-US/nfs-shares-on-management-server.xml b/docs/en-US/nfs-shares-on-management-server.xml
index c000ce4818d..881ca8d7600 100644
--- a/docs/en-US/nfs-shares-on-management-server.xml
+++ b/docs/en-US/nfs-shares-on-management-server.xml
@@ -27,9 +27,9 @@
This section tells how to set up NFS shares for primary and secondary storage on the same node with the Management Server. This is more typical of a trial installation, but is technically possible in a larger deployment. It is assumed that you will have less than 16TB of storage on the host.
The exact commands for the following steps may vary depending on your operating system version.
- On Ubuntu/Debian systems, you'll need to install the nfs-kernel-server package:
+ On RHEL/CentOS systems, you'll need to install the nfs-utils package:
-$ sudo apt-get install nfs-kernel-server
+$ sudo yum install nfs-utils
On the Management Server host, create two directories that you will use for primary and secondary storage. For example:
diff --git a/docs/en-US/persistent-network.xml b/docs/en-US/persistent-network.xml
new file mode 100644
index 00000000000..1ccc99c59a6
--- /dev/null
+++ b/docs/en-US/persistent-network.xml
@@ -0,0 +1,100 @@
+
+
+%BOOK_ENTITIES;
+]>
+
+
+
+ Persistent Networks
+ The network that you can provision without having to deploy any VMs on it is called a
+ persistent network. A persistent network can be part of a VPC or a non-VPC environment.
+ When you create other types of network, a network is only a database entry until the first
+ VM is created on that network. When the first VM is created, a VLAN ID is assigned and the
+ network is provisioned. Also, when the last VM is destroyed, the VLAN ID is released and the
+ network is no longer available. With the addition of persistent network, you will have the
+ ability to create a network in &PRODUCT; in which physical devices can be deployed without
+ having to run any VMs. Additionally, you can deploy physical devices on that network.
+ One of the advantages of having a persistent network is that you can create a VPC with a tier
+ consisting of only physical devices. For example, you might create a VPC for a three-tier
+ application, deploy VMs for Web and Application tier, and use physical machines for the
+ Database tier. Another use case is that if you are providing services by using physical
+ hardware, you can define the network as persistent and therefore even if all its VMs are
+ destroyed the services will not be discontinued.
+
+ Persistent Network Considerations
+
+
+ Persistent network is designed for isolated networks.
+
+
+ All default network offerings are non-persistent.
+
+
+ A network offering cannot be editable because changing it affects the behavior of the
+ existing networks that were created using this network offering.
+
+
+ When you create a guest network, the network offering that you select defines the
+ network persistence. This in turn depends on whether persistent network is enabled in the
+ selected network offering.
+
+
+ An existing network can be made persistent by changing its network offering to an
+ offering that has the Persistent option enabled. While setting this property, even if the
+ network has no running VMs, the network is provisioned.
+
+
+ An existing network can be made non-persistent by changing its network offering to an
+ offering that has the Persistent option disabled. If the network has no running VMs,
+ during the next network garbage collection run the network is shut down.
+
+
+ When the last VM on a network is destroyed, the network garbage collector checks if
+ the network offering associated with the network is persistent, and shuts down the network
+ only if it is non-persistent.
+
+
+
+
+ Creating a Persistent Guest Network
+ To create a persistent network, perform the following:
+
+
+ Create a network offering with the Persistent option enabled.
+ See .
+ See the Administration Guide.
+
+
+ Select Network from the left navigation pane.
+
+
+ Select the guest network that you want to offer this network service to.
+
+
+ Click the Edit button.
+
+
+ From the Network Offering drop-down, select the persistent network offering you have
+ just created.
+
+
+ Click OK.
+
+
+
+
diff --git a/docs/en-US/plugin-niciranvp-devicemanagement.xml b/docs/en-US/plugin-niciranvp-devicemanagement.xml
index 2423ce3925d..57b8eee9d7d 100644
--- a/docs/en-US/plugin-niciranvp-devicemanagement.xml
+++ b/docs/en-US/plugin-niciranvp-devicemanagement.xml
@@ -22,7 +22,7 @@
-->
Device-management
- In CloudStack 4.0.x each Nicira NVP setup is considered a "device" that can be added and removed from a physical network. To complete the configuration of the Nicira NVP plugin a device needs to be added to the physical network using the "addNiciraNVPDevice" API call. The plugin is now enabled on the physical network and any guest networks created on that network will be provisioned using the Nicra NVP Controller.
+ In &PRODUCT; 4.0.x each Nicira NVP setup is considered a "device" that can be added and removed from a physical network. To complete the configuration of the Nicira NVP plugin a device needs to be added to the physical network using the "addNiciraNVPDevice" API call. The plugin is now enabled on the physical network and any guest networks created on that network will be provisioned using the Nicira NVP Controller.
The plugin introduces a set of new API calls to manage the devices, see below or refer to the API reference.
addNiciraNvpDevice
@@ -44,4 +44,4 @@
listNiciraNVPDevices
-
\ No newline at end of file
+
diff --git a/docs/en-US/plugin-niciranvp-features.xml b/docs/en-US/plugin-niciranvp-features.xml
index b71e67f4199..c346bfb64e3 100644
--- a/docs/en-US/plugin-niciranvp-features.xml
+++ b/docs/en-US/plugin-niciranvp-features.xml
@@ -22,12 +22,12 @@
-->
Features of the Nicira NVP Plugin
- In CloudStack release 4.0.0-incubating this plugin supports the Connectivity service. This service is responsible for creating Layer 2 networks supporting the networks created by Guests. In other words when an tennant creates a new network, instead of the traditional VLAN a logical network will be created by sending the appropriate calls to the Nicira NVP Controller.
+ In &PRODUCT; release 4.0.0-incubating this plugin supports the Connectivity service. This service is responsible for creating Layer 2 networks supporting the networks created by Guests. In other words when an tenant creates a new network, instead of the traditional VLAN a logical network will be created by sending the appropriate calls to the Nicira NVP Controller.
The plugin has been tested with Nicira NVP versions 2.1.0, 2.2.0 and 2.2.1
- In CloudStack 4.0.0-incubating only the XenServer hypervisor is supported for use in
+ In &PRODUCT; 4.0.0-incubating only the XenServer hypervisor is supported for use in
combination with Nicira NVP.
- In CloudStack 4.1.0-incubating both KVM and XenServer hypervisors are
+ In &PRODUCT; 4.1.0-incubating both KVM and XenServer hypervisors are
supported.
- In CloudStack 4.0.0-incubating the UI components for this plugin are not complete,
+ In &PRODUCT; 4.0.0-incubating the UI components for this plugin are not complete,
configuration is done by sending commands to the API.
diff --git a/docs/en-US/plugin-niciranvp-preparations.xml b/docs/en-US/plugin-niciranvp-preparations.xml
index 86b795ccd0b..762c941fd13 100644
--- a/docs/en-US/plugin-niciranvp-preparations.xml
+++ b/docs/en-US/plugin-niciranvp-preparations.xml
@@ -23,7 +23,7 @@
Prerequisites
Before enabling the Nicira NVP plugin the NVP Controller needs to be configured. Please review the NVP User Guide on how to do that.
- CloudStack needs to have at least one physical network with the isolation method set to "STT". This network should be enabled for the Guest traffic type.
+ &PRODUCT; needs to have at least one physical network with the isolation method set to "STT". This network should be enabled for the Guest traffic type.
The Guest traffic type should be configured with the traffic label that matches the name of
the Integration Bridge on the hypervisor. See the Nicira NVP User Guide for more details
on how to set this up in XenServer or KVM.
@@ -33,6 +33,6 @@
The username to access the API
The password to access the API
The UUID of the Transport Zone that contains the hypervisors in this Zone
- The UUID of the Physical Network that will used for the Guest networks
+ The UUID of the Physical Network that will be used for the Guest networks
-
\ No newline at end of file
+
diff --git a/docs/en-US/plugin-niciranvp-uuidreferences.xml b/docs/en-US/plugin-niciranvp-uuidreferences.xml
index c912971736b..cb5f1cae834 100644
--- a/docs/en-US/plugin-niciranvp-uuidreferences.xml
+++ b/docs/en-US/plugin-niciranvp-uuidreferences.xml
@@ -22,9 +22,9 @@
-->
UUID References
- The plugin maintains several references in the CloudStack database to items created on the NVP Controller.
- Every guest network this is created will have its broadcast type set to Lswitch and if the network is in state "Implemented", the broadcast URI will have the UUID of the Logical Switch that was created for this network on the NVP Controller.
+ The plugin maintains several references in the &PRODUCT; database to items created on the NVP Controller.
+ Every guest network that is created will have its broadcast type set to Lswitch and if the network is in state "Implemented", the broadcast URI will have the UUID of the Logical Switch that was created for this network on the NVP Controller.
The Nics that are connected to one of the Logical Switches will have their Logical Switch Port UUID listed in the nicira_nvp_nic_map table
All devices created on the NVP Controller will have a tag set to domain-account of the owner of the network, this string can be used to search for items in the NVP Controller.
-
\ No newline at end of file
+
diff --git a/docs/en-US/reserved-ip-addresses-non-csvms.xml b/docs/en-US/reserved-ip-addresses-non-csvms.xml
new file mode 100644
index 00000000000..18ba3ca0e42
--- /dev/null
+++ b/docs/en-US/reserved-ip-addresses-non-csvms.xml
@@ -0,0 +1,163 @@
+
+
+%BOOK_ENTITIES;
+]>
+
+
+
+ IP Reservation in Isolated Guest Networks
+ In isolated guest networks, a part of the guest IP address space can be reserved for
+ non-&PRODUCT; VMs or physical servers. To do so, you configure a range of Reserved IP addresses
+ by specifying the CIDR when a guest network is in Implemented state. If your customers wish to
+ have non-&PRODUCT; controlled VMs or physical servers on the same network, they can share a part
+ of the IP address space that is primarily provided to the guest network.
+ In an Advanced zone, an IP address range or a CIDR is assigned to a network when the network
+ is defined. The &PRODUCT; virtual router acts as the DHCP server and uses CIDR for assigning IP
+ addresses to the guest VMs. If you decide to reserve IP ranges for non-&PRODUCT; purposes, you
+ can specify a part of the IP address range or the CIDR that should only be allocated by the DHCP
+ service of the virtual router to the guest VMs created in &PRODUCT;. The remaining IPs in that
+ network are called Reserved IP Range. When IP reservation is configured, the administrator can
+ add additional VMs or physical servers that are not part of &PRODUCT; to the same network and
+ assign them the Reserved IP addresses. &PRODUCT; guest VMs cannot acquire IPs from the Reserved
+ IP Range.
+
+ IP Reservation Considerations
+ Consider the following before you reserve an IP range for non-&PRODUCT; machines:
+
+
+ IP Reservation can be applied only when the network is in Implemented state.
+
+
+ No IP Reservation is done by default.
+
+
+ Guest VM CIDR you specify must be a subset of the network CIDR.
+
+
+ Specify a valid Guest VM CIDR. IP Reservation is applied only if no active IPs exist
+ outside the Guest VM CIDR.
+ You cannot apply IP Reservation if any VM is alloted with an IP address that is
+ outside the Guest VM CIDR.
+
+
+ To reset an existing IP Reservation, apply IP reservation by specifying the value of
+ network CIDR in the CIDR field.
+ For example, the following table describes three scenarios of guest network
+ creation:
+
+
+
+
+
+
+
+
+
+ Case
+ CIDR
+ Network CIDR
+ Reserved IP Range for Non-&PRODUCT; VMs
+ Description
+
+
+
+
+ 1
+ 10.1.1.0/24
+ None
+ None
+ No IP Reservation.
+
+
+ 2
+ 10.1.1.0/26
+ 10.1.1.0/24
+ 10.1.1.64 to 10.1.1.254
+ IP Reservation configured by the UpdateNetwork API with
+ guestvmcidr=10.1.1.0/26 or enter 10.1.1.0/26 in the CIDR field in the
+ UI.
+
+
+ 3
+ 10.1.1.0/24
+ None
+ None
+ Removing IP Reservation by the UpdateNetwork API with
+ guestvmcidr=10.1.1.0/24 or enter 10.1.1.0/24 in the CIDR field in the UI.
+
+
+
+
+
+
+
+
+
+ Limitations
+
+
+ The IP Reservation is not supported if active IPs that are found outside the Guest VM
+ CIDR.
+
+
+ Upgrading network offering which causes a change in CIDR (such as upgrading an
+ offering with no external devices to one with external devices) IP Reservation becomes
+ void if any. Reconfigure IP Reservation in the new re-implemeted network.
+
+
+
+
+ Best Practices
+ Apply IP Reservation to the guest network as soon as the network state changes to
+ Implemented. If you apply reservation soon after the first guest VM is deployed, lesser
+ conflicts occurs while applying reservation.
+
+
+ Reserving an IP Range
+
+
+ Log in to the &PRODUCT; UI as an administrator or end user.
+
+
+ In the left navigation, choose Network.
+
+
+ Click the name of the network you want to modify.
+
+
+ In the Details tab, click Edit.
+
+
+
+
+ edit-icon.png: button to edit a network
+
+
+ The CIDR field changes to editable one.
+
+
+ In CIDR, specify the Guest VM CIDR.
+
+
+ Click Apply.
+ Wait for the update to complete. The Network CIDR and the Reserved IP Range are
+ displayed on the Details page.
+
+
+
+
diff --git a/docs/en-US/reset-ssh-key-dev.xml b/docs/en-US/reset-ssh-key-dev.xml
new file mode 100644
index 00000000000..1a904e566ef
--- /dev/null
+++ b/docs/en-US/reset-ssh-key-dev.xml
@@ -0,0 +1,27 @@
+
+
+%BOOK_ENTITIES;
+]>
+
+
+ Resetting SSH Keys to Access VMs
+ Use the resetSSHKeyForVirtualMachine API to set or reset the SSH keypair assigned to a
+ virtual machine. With the addition of this feature, a lost or compromised SSH keypair can be
+ changed, and the user can access the VM by using the new keypair. Just create or register a new
+ keypair, then call resetSSHKeyForVirtualMachine.
+
diff --git a/docs/en-US/resizing-volumes.xml b/docs/en-US/resizing-volumes.xml
index 471411df5fe..42b584bf6c6 100644
--- a/docs/en-US/resizing-volumes.xml
+++ b/docs/en-US/resizing-volumes.xml
@@ -11,9 +11,7 @@
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
+ http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -21,18 +19,80 @@
specific language governing permissions and limitations
under the License.
-->
-
- Resizing Volumes
- &PRODUCT; does not provide the ability to resize root disks or data disks; the disk size is fixed based on the template used to create the VM. However, the tool VHD Resizer), while not officially supported by Cloud.com or Citrix, might provide a workaround. To increase disk size with VHD Resizer:
-
- Get the VHD from the secondary storage.
- Import it into VHD Resizer.
- Resize the VHD.
- Upload the new VHD.
- Create a new VM.
- Take a snapshot, then create a new template from that snapshot.
- For more information, see How to Resize a Provisioning Server 5 Virtual Disk at the Citrix Knowledge Center
-
+ Resizing Volumes
+ &PRODUCT; provides the ability to resize data disks; &PRODUCT; controls volume size by using
+ disk offerings. This provides &PRODUCT; administrators with the flexibility to choose how much
+ space they want to make available to the end users. Volumes within the disk offerings with the
+ same storage tag can be resized. For example, if you only want to offer 10, 50, and 100 GB
+ offerings, the allowed resize should stay within those limits. That implies if you define a 10
+ GB, a 50 GB and a 100 GB disk offerings, a user can upgrade from 10 GB to 50 GB, or 50 GB to 100
+ GB. If you create a custom-sized disk offering, then you have the option to resize the volume by
+ specifying a new, larger size.
+ Additionally, using the resizeVolume API, a data volume can be moved from a static disk
+ offering to a custom disk offering with the size specified. This functionality allows those who
+ might be billing by certain volume sizes or disk offerings to stick to that model, while
+ providing the flexibility to migrate to whatever custom size necessary.
+ This feature is supported on KVM, XenServer, and VMware hosts. However, shrinking volumes is
+ not supported on VMware hosts.
+ Before you try to resize a volume, consider the following:
+
+
+ The VMs associated with the volume are stopped.
+
+
+ The data disks associated with the volume are removed.
+
+
+ When a volume is shrunk, the disk associated with it is simply truncated, and doing so
+ would put its content at risk of data loss. Therefore, resize any partitions or file systems
+ before you shrink a data disk so that all the data is moved off from that disk.
+
+
+ To resize a volume:
+
+
+ Log in to the &PRODUCT; UI as a user or admin.
+
+
+ In the left navigation bar, click Storage.
+
+
+ In Select View, choose Volumes.
+
+
+ Select the volume name in the Volumes list, then click the Resize Volume button
+
+
+
+
+ resize-volume-icon.png: button to display the resize volume option.
+
+
+
+
+ In the Resize Volume pop-up, choose desired characteristics for the storage.
+
+
+
+
+
+ resize-volume.png: option to resize a volume.
+
+
+
+
+ If you select Custom Disk, specify a custom size.
+
+
+ Click Shrink OK to confirm that you are reducing the size of a volume.
+ This parameter protects against inadvertent shrinking of a disk, which might lead to
+ the risk of data loss. You must sign off that you know what you are doing.
+
+
+
+
+ Click OK.
+
+
-
diff --git a/docs/en-US/shared-networks.xml b/docs/en-US/shared-networks.xml
index d5a7ede9bdb..4c323208135 100644
--- a/docs/en-US/shared-networks.xml
+++ b/docs/en-US/shared-networks.xml
@@ -25,8 +25,7 @@
Shared Networks
A shared network can be accessed by virtual machines that belong to many different
accounts. Network Isolation on shared networks is accomplished using techniques such as
- security groups (supported only in basic zones in &PRODUCT; 3.0.3 and later
- versions).
+ security groups (supported only in basic zones).
Shared Networks are created by the administrator
Shared Networks can be designated to a certain domain
diff --git a/docs/en-US/site-to-site-vpn.xml b/docs/en-US/site-to-site-vpn.xml
index 6570aabe0bd..a5899eac4f1 100644
--- a/docs/en-US/site-to-site-vpn.xml
+++ b/docs/en-US/site-to-site-vpn.xml
@@ -55,6 +55,9 @@
Create VPN connection from the VPC VPN gateway to the customer VPN gateway.
+ Appropriate events are generated on the &PRODUCT; UI when status of a Site-to-Site VPN
+ connection changes from connected to disconnected, or vice versa. Currently no events are generated
+ when establishing a VPN connection fails or pending.
diff --git a/docs/en-US/source-prereqs.xml b/docs/en-US/source-prereqs.xml
index 6c2bc2a3cb8..2e40a58c59a 100644
--- a/docs/en-US/source-prereqs.xml
+++ b/docs/en-US/source-prereqs.xml
@@ -30,12 +30,15 @@
for package management.
- The minimum bootstrapped prerequisites for building &PRODUCT; includes
- the following:
+ You will need, at a minimum, the following to compile &PRODUCT;:
- ant
- maven (version 3)
- Java (Java 6/OpenJDK 1.6)
+ Maven (version 3)
+ Java (OpenJDK 1.6 or Java 7/OpenJDK 1.7)
+ Apache Web Services Common Utilities (ws-commons-util)
+ MySQL
+ MySQLdb (provides Python database API)
+ Tomcat 6 (not 6.0.35)
+ genisoimage
rpmbuild or dpkg-dev
diff --git a/docs/en-US/source.xml b/docs/en-US/source.xml
index 3cb4af2321f..5d911c23050 100644
--- a/docs/en-US/source.xml
+++ b/docs/en-US/source.xml
@@ -24,20 +24,10 @@
Building from Source
- The official &PRODUCT; release is always in source code form. While there may
- exist convenience binaries in various forms from a number of places, the
- source is the canonical release will be source. In this document we'll cover
- acquiring the source release, building that into binary, deployable packages.
-
-
- While building and deploying directly from source is certainly possible, the reality
- of Infrastructure-as-a-Service cloud computing implies a need to deploy packages on
- a potentially large number of systems, which RPMs and DEBs fill nicely.
-
-
- Building and deploying directly from source is thus outside the scope of this
- document, but is documented in the INSTALL.md file in the release.
-
+ The official &PRODUCT; release is always in source code form. You will likely be able to find "convenience binaries," the source is the canonical release. In this section, we'll cover acquiring the source release and building that so that you can deploy it using Maven or create Debian packages or RPMs.
+ Note that building and deploying directly from source is typically not the most efficient way to deploy an IaaS. However, we will cover that method as well as building RPMs or Debian packages for deploying &PRODUCT;.
+ The instructions here are likely version-specific. That is, the method for building from source for the 4.0.x series is different from the 4.1.x series.
+ If you are working with a unreleased version of &PRODUCT;, see the INSTALL.md file in the top-level directory of the release.
diff --git a/docs/en-US/tools.xml b/docs/en-US/tools.xml
index 66fe894e171..db6a510d593 100644
--- a/docs/en-US/tools.xml
+++ b/docs/en-US/tools.xml
@@ -26,4 +26,5 @@
Tools
+
diff --git a/docs/en-US/upload-existing-volume-to-vm.xml b/docs/en-US/upload-existing-volume-to-vm.xml
index 86dc8e54758..d2b657164c8 100644
--- a/docs/en-US/upload-existing-volume-to-vm.xml
+++ b/docs/en-US/upload-existing-volume-to-vm.xml
@@ -29,7 +29,7 @@
You cannot upload a volume if the preconfigured volume limit has already been reached. The default limit for the cloud is set in the global configuration parameter max.account.volumes, but administrators can also set per-domain limits that are different from the global default. See Setting Usage Limits
To upload a volume:
- (Optional) Create an MD5 hash (checksum) of the disk image file that you are going to upload. After uploading the data disk, &PRODUCT; will use this value to verify that no data corruption has occurred.
+ (Optional) Create an MD5 hash (checksum) of the disk image file that you are going to upload. After uploading the data disk, &PRODUCT; will use this value to verify that no data corruption has occurred.
Log in to the &PRODUCT; UI as an administrator or user
In the left navigation bar, click Storage.
Click Upload Volume.
@@ -68,9 +68,9 @@
URL. The secure HTTP or HTTPS URL that &PRODUCT; can use to access your disk. The type of file at the URL must match the value chosen in Format. For example, if Format is VHD, the URL might look like the following:
http://yourFileServerIP/userdata/myDataDisk.vhd
- MD5 checksum. (Optional) Use the hash that you created in step 1.
+ MD5 checksum. (Optional) Use the hash that you created in step .
- Wait until the status of the volume shows that the upload is complete. Click Instances - Volumes, find the name you specified in step 5, and make sure the status is Uploaded.
+ Wait until the status of the volume shows that the upload is complete. Click Instances - Volumes, find the name you specified in step , and make sure the status is Uploaded.
diff --git a/docs/en-US/using-vpn-with-mac.xml b/docs/en-US/using-vpn-with-mac.xml
index 718ebc777a9..a41dcab5e02 100644
--- a/docs/en-US/using-vpn-with-mac.xml
+++ b/docs/en-US/using-vpn-with-mac.xml
@@ -24,5 +24,18 @@
Using VPN with Mac OS X
- In Mac OS X, in Network Preferences - Advanced, make sure Send all traffic over VPN connection is not checked.
+ First, be sure you've configured the VPN settings in your &PRODUCT; install. This section is only concerned with connecting via Mac OS X to your VPN.
+ Note, these instructions were written on Mac OS X 10.7.5. They may differ slightly in older or newer releases of Mac OS X.
+
+ On your Mac, open System Preferences and click Network.
+ Make sure Send all traffic over VPN connection is not checked.
+ If your preferences are locked, you'll need to click the lock in the bottom left-hand corner to make any changes and provide your administrator credentials.
+ You will need to create a new network entry. Click the plus icon on the bottom left-hand side and you'll see a dialog that says "Select the interface and enter a name for the new service." Select VPN from the Interface drop-down menu, and "L2TP over IPSec" for the VPN Type. Enter whatever you like within the "Service Name" field.
+ You'll now have a new network interface with the name of whatever you put in the "Service Name" field. For the purposes of this example, we'll assume you've named it "CloudStack." Click on that interface and provide the IP address of the interface for your VPN under the Server Address field, and the user name for your VPN under Account Name.
+ Click Authentication Settings, and add the user's password under User Authentication and enter the pre-shared IPSec key in the Shared Secret field under Machine Authentication. Click OK.
+ You may also want to click the "Show VPN status in menu bar" but that's entirely optional.
+ Now click "Connect" and you will be connected to the CloudStack VPN.
+
+
+
diff --git a/docs/en-US/using-vpn-with-windows.xml b/docs/en-US/using-vpn-with-windows.xml
index e0e15692d35..c5d95ddd3e0 100644
--- a/docs/en-US/using-vpn-with-windows.xml
+++ b/docs/en-US/using-vpn-with-windows.xml
@@ -26,17 +26,17 @@
Using VPN with Windows
The procedure to use VPN varies by Windows version. Generally, the user must edit the VPN properties and make sure that the default route is not the VPN. The following steps are for Windows L2TP clients on Windows Vista. The commands should be similar for other Windows versions.
- Log in to the &PRODUCT; UI and click on the source NAT IP for the account. The VPN tab should display the IPsec preshared key. Make a note of this and the source NAT IP. The UI also lists one or more users and their passwords. Choose one of these users, or, if none exists, add a user and password.
+ Log in to the &PRODUCT; UI and click on the source NAT IP for the account. The VPN tab should display the IPsec preshared key. Make a note of this and the source NAT IP. The UI also lists one or more users and their passwords. Choose one of these users, or, if none exists, add a user and password.
On the Windows box, go to Control Panel, then select Network and Sharing center. Click Setup a connection or network.
In the next dialog, select No, create a new connection.
In the next dialog, select Use my Internet Connection (VPN).
- In the next dialog, enter the source NAT IP from step 1 and give the connection a name. Check Don't connect now.
- In the next dialog, enter the user name and password selected in step 1.
+ In the next dialog, enter the source NAT IP from step and give the connection a name. Check Don't connect now.
+ In the next dialog, enter the user name and password selected in step .
Click Create.
Go back to the Control Panel and click Network Connections to see the new connection. The connection is not active yet.
Right-click the new connection and select Properties. In the Properties dialog, select the Networking tab.
- In Type of VPN, choose L2TP IPsec VPN, then click IPsec settings. Select Use preshared key. Enter the preshared key from Step 1.
+ In Type of VPN, choose L2TP IPsec VPN, then click IPsec settings. Select Use preshared key. Enter the preshared key from step .
The connection is ready for activation. Go back to Control Panel -> Network Connections and double-click the created connection.
- Enter the user name and password from Step 1.
+ Enter the user name and password from step .
diff --git a/docs/en-US/verifying-source.xml b/docs/en-US/verifying-source.xml
index f8bd102379d..b20b9bbacf9 100644
--- a/docs/en-US/verifying-source.xml
+++ b/docs/en-US/verifying-source.xml
@@ -32,11 +32,11 @@
Getting the KEYS
To enable you to verify the GPG signature, you will need to download the
- KEYS
+ KEYS
file.
- You next need to import those keys, which you can do by running the following command:
+ You next need to import those keys, which you can do by running:
# gpg --import KEYS
diff --git a/docs/en-US/vlan-provisioning.xml b/docs/en-US/vlan-provisioning.xml
index 8abd5da0a75..9345647d47a 100644
--- a/docs/en-US/vlan-provisioning.xml
+++ b/docs/en-US/vlan-provisioning.xml
@@ -21,10 +21,23 @@
specific language governing permissions and limitations
under the License.
-->
-
- VLAN Provisioning
- &PRODUCT; automatically creates and destroys interfaces bridged to VLANs on the hosts. In general the administrator does not need to manage this process.
- &PRODUCT; manages VLANs differently based on hypervisor type. For XenServer or KVM, the VLANs are created on only the hosts where they will be used and then they are destroyed when all guests that require them have been terminated or moved to another host.
- For vSphere the VLANs are provisioned on all hosts in the cluster even if there is no guest running on a particular Host that requires the VLAN. This allows the administrator to perform live migration and other functions in vCenter without having to create the VLAN on the destination Host. Additionally, the VLANs are not removed from the Hosts when they are no longer needed.
+ VLAN Provisioning
+ &PRODUCT; automatically creates and destroys interfaces bridged to VLANs on the hosts. In
+ general the administrator does not need to manage this process.
+ &PRODUCT; manages VLANs differently based on hypervisor type. For XenServer or KVM, the
+ VLANs are created on only the hosts where they will be used and then they are destroyed when all
+ guests that require them have been terminated or moved to another host.
+ For vSphere the VLANs are provisioned on all hosts in the cluster even if there is no guest
+ running on a particular Host that requires the VLAN. This allows the administrator to perform
+ live migration and other functions in vCenter without having to create the VLAN on the
+ destination Host. Additionally, the VLANs are not removed from the Hosts when they are no longer
+ needed.
+ You can use the same VLANs on different physical networks provided that each physical
+ network has its own underlying layer-2 infrastructure, such as switches. For example, you can
+ specify VLAN range 500 to 1000 while deploying physical networks A and B in an Advanced zone
+ setup. This capability allows you to set up an additional layer-2 physical infrastructure on a
+ different physical NIC and use the same set of VLANs if you run out of VLANs. Another advantage
+ is that you can use the same set of IPs for different customers, each one with their own routers
+ and the guest networks on different physical NICs.
diff --git a/docs/en-US/vmx-settings-dev.xml b/docs/en-US/vmx-settings-dev.xml
new file mode 100644
index 00000000000..a0fdf7f7825
--- /dev/null
+++ b/docs/en-US/vmx-settings-dev.xml
@@ -0,0 +1,40 @@
+
+
+%BOOK_ENTITIES;
+]>
+
+
+ Additional VMX Settings
+ A VMX (.vmx) file is the primary configuration file for a virtual machine. When a new VM is
+ created, information on the operating system, disk sizes, and networking is stored in this file.
+ The VM actively writes to its .vmx file for all the configuration changes. The VMX file is
+ typically located in the directory where the VM is created. In Windows Vista / Windows 7 /
+ Windows Server 2008, the default location is C:\Users\<your_user_name>\My
+ Documents\Virtual Machines\<virtual_machine_name>.vmx. In Linux, vmware-cmd -l lists the
+ full path to all the registered VMX files. Any manual additions to the .vmx file from ESX/ESXi
+ are overwritten by the entries stored in the vCenter Server database. Therefore, before you edit
+ a .vmx file, first remove the VM from the vCenter server's inventory and register the VM again
+ after editing.
+ The CloudStack API that supports passing some of the VMX settings is registerTemplate. The
+ supported parameters are rootDiskController, nicAdapter, and keyboard. In addition to these
+ existing VMX parameters, you can now use the keyboard.typematicMinDelay parameter in the
+ registerTemplate API call. This parameter controls the amount of delay for the repeated key
+ strokes on remote consoles. For more information on keyboard.typematicMinDelay, see keyboard.typematicMinDelay.
+
diff --git a/docs/en-US/whats-new.xml b/docs/en-US/whats-new.xml
index 77b3ec3df22..761d7a2eb37 100644
--- a/docs/en-US/whats-new.xml
+++ b/docs/en-US/whats-new.xml
@@ -3,40 +3,46 @@
%BOOK_ENTITIES;
]>
-
-
- What's New in the API?
- The following describes any new major features of each &PRODUCT; version as it applies to API usage.
-
- What's New in the API for 4.0
-
-
-
-
- What's New in the API for 3.0
-
-
-
-
-
-
-
+ What's New in the API?
+ The following describes any new major features of each &PRODUCT; version as it applies to
+ API usage.
+
+ What's New in the API for 4.1
+
+
+
+
+
+
+
+ What's New in the API for 4.0
+
+
+
+
+ What's New in the API for 3.0
+
+
+
+
+
+
+
diff --git a/docs/en-US/working-with-snapshots.xml b/docs/en-US/working-with-snapshots.xml
index a381707e8f0..b984439203c 100644
--- a/docs/en-US/working-with-snapshots.xml
+++ b/docs/en-US/working-with-snapshots.xml
@@ -29,4 +29,8 @@
Users can create snapshots manually or by setting up automatic recurring snapshot policies. Users can also create disk volumes from snapshots, which may be attached to a VM like any other disk volume. Snapshots of both root disks and data disks are supported. However, &PRODUCT; does not currently support booting a VM from a recovered root disk. A disk recovered from snapshot of a root disk is treated as a regular data disk; the data on recovered disk can be accessed by attaching the disk to a VM.
A completed snapshot is copied from primary storage to secondary storage, where it is stored until deleted or purged by newer snapshot.
+
+
+
+
diff --git a/docs/en-US/working-with-system-vm.xml b/docs/en-US/working-with-system-vm.xml
index 97459f947bf..70f7dd1aa4e 100644
--- a/docs/en-US/working-with-system-vm.xml
+++ b/docs/en-US/working-with-system-vm.xml
@@ -1,33 +1,39 @@
-
%BOOK_ENTITIES;
]>
-
-
- Working with System Virtual Machines
- &PRODUCT; uses several types of system virtual machines to perform tasks in the cloud. In general &PRODUCT; manages these system VMs and creates, starts, and stops them as needed based on scale and immediate needs. However, the administrator should be aware of them and their roles to assist in debugging issues.
-
-
-
-
-
+ Working with System Virtual Machines
+ &PRODUCT; uses several types of system virtual machines to perform tasks in the cloud. In
+ general &PRODUCT; manages these system VMs and creates, starts, and stops them as needed based
+ on scale and immediate needs. However, the administrator should be aware of them and their roles
+ to assist in debugging issues.
+
+ You can configure the system.vm.random.password parameter to create a random system VM
+ password to ensure higher security. If you reset the value for system.vm.random.password to
+ true and restart the Management Server, a random password is generated and stored encrypted in
+ the database. You can view the decrypted password under the system.vm.password global
+ parameter on the &PRODUCT; UI or by calling the listConfigurations API.
+
+
+
+
+
+
diff --git a/docs/en-US/working-with-usage-data.xml b/docs/en-US/working-with-usage-data.xml
index 56a929fd6c1..5324617ab23 100644
--- a/docs/en-US/working-with-usage-data.xml
+++ b/docs/en-US/working-with-usage-data.xml
@@ -31,4 +31,5 @@
+
diff --git a/docs/en-US/zone-add.xml b/docs/en-US/zone-add.xml
index 2a85bb0b432..4f6606fce03 100644
--- a/docs/en-US/zone-add.xml
+++ b/docs/en-US/zone-add.xml
@@ -63,7 +63,7 @@
Basic. For AWS-style networking. Provides a single network where each VM instance is assigned an IP directly from the network. Guest isolation can be provided through layer-3 means such as security groups (IP address source filtering).
Advanced. For more sophisticated network topologies. This network model provides the most flexibility in defining guest networks and providing custom network offerings such as firewall, VPN, or load balancer support.
- For more information about the network types, see Network Setup.
+ For more information about the network types, see .
The rest of the steps differ depending on whether you chose Basic or Advanced. Continue with the steps that apply to you:
diff --git a/docs/pot/build-deb.pot b/docs/pot/build-deb.pot
index ca2bb9f54c0..995b086af5b 100644
--- a/docs/pot/build-deb.pot
+++ b/docs/pot/build-deb.pot
@@ -62,7 +62,7 @@ msgstr ""
#. Tag: screen
#, no-c-format
msgid "\n"
-"$ dpkg-buildpackge -uc -us\n"
+"$ dpkg-buildpackage -uc -us\n"
""
msgstr ""
diff --git a/docs/pot/verifying-source.pot b/docs/pot/verifying-source.pot
index 9c1effe6bf5..9b2d586aacf 100644
--- a/docs/pot/verifying-source.pot
+++ b/docs/pot/verifying-source.pot
@@ -40,7 +40,7 @@ msgstr ""
#. Tag: para
#, no-c-format
-msgid "To enable you to verify the GPG signature, you will need to download the KEYS file."
+msgid "To enable you to verify the GPG signature, you will need to download the KEYS file."
msgstr ""
#. Tag: para
diff --git a/docs/publican-cloudstack/defaults.cfg b/docs/publican-cloudstack/defaults.cfg
index 6aebaee5a83..9e27bdd309d 100644
--- a/docs/publican-cloudstack/defaults.cfg
+++ b/docs/publican-cloudstack/defaults.cfg
@@ -16,6 +16,6 @@
# specific language governing permissions and limitations
# under the License.
-doc_url: "http://docs.cloudstack.org"
+doc_url: "http://incubator.apache.org/cloudstack/docs"
prod_url: "http://cloudstack.org"
diff --git a/docs/publican-cloudstack/en-US/Legal_Notice.xml b/docs/publican-cloudstack/en-US/Legal_Notice.xml
index 0e4be5bf56a..5e30efb07c0 100644
--- a/docs/publican-cloudstack/en-US/Legal_Notice.xml
+++ b/docs/publican-cloudstack/en-US/Legal_Notice.xml
@@ -53,6 +53,15 @@
completeness or stability of the code, it does indicate that the project
has yet to be fully endorsed by the ASF.
+
+
+ CloudStack® is a registered trademark of the Apache Software Foundation.
+
+
+
+ Apache CloudStack, the CloudStack word design, the Apache CloudStack word design, and the cloud monkey logo are trademarks of the
+ Apache Software Foundation.
+
diff --git a/docs/publican-cloudstack/en-US/images/title_logo.svg b/docs/publican-cloudstack/en-US/images/title_logo.svg
index a5888de4cf4..1d2913bf50c 100644
--- a/docs/publican-cloudstack/en-US/images/title_logo.svg
+++ b/docs/publican-cloudstack/en-US/images/title_logo.svg
@@ -1,5 +1,6 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/engine/storage/integration-test/test/resource/component.xml b/engine/storage/integration-test/test/resource/component.xml
new file mode 100644
index 00000000000..0368ad41425
--- /dev/null
+++ b/engine/storage/integration-test/test/resource/component.xml
@@ -0,0 +1,201 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/engine/storage/integration-test/test/resource/storageContext.xml b/engine/storage/integration-test/test/resource/storageContext.xml
index 0127c96a734..7c5382d49f9 100644
--- a/engine/storage/integration-test/test/resource/storageContext.xml
+++ b/engine/storage/integration-test/test/resource/storageContext.xml
@@ -23,10 +23,8 @@
-
-
-
+
@@ -34,49 +32,12 @@
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
- org.apache.cloudstack.framework
-
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/engine/storage/pom.xml b/engine/storage/pom.xml
index e8a2eb75193..270fe47c743 100644
--- a/engine/storage/pom.xml
+++ b/engine/storage/pom.xml
@@ -16,7 +16,7 @@
org.apache.cloudstack
cloud-engine
- 4.1.0-SNAPSHOT
+ 4.2.0-SNAPSHOT
../pom.xml
diff --git a/engine/storage/snapshot/pom.xml b/engine/storage/snapshot/pom.xml
index 45439c4726a..211cdac574e 100644
--- a/engine/storage/snapshot/pom.xml
+++ b/engine/storage/snapshot/pom.xml
@@ -16,7 +16,7 @@
org.apache.cloudstack
cloud-engine
- 4.1.0-SNAPSHOT
+ 4.2.0-SNAPSHOT
../../pom.xml
@@ -44,7 +44,11 @@
install
- src
- test
+ ${project.basedir}/test
+
+
+ ${project.basedir}/test/resource
+
+
diff --git a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotDataFactoryImpl.java b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotDataFactoryImpl.java
index 487e2d53eff..fa7772a979d 100644
--- a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotDataFactoryImpl.java
+++ b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotDataFactoryImpl.java
@@ -20,28 +20,65 @@ package org.apache.cloudstack.storage.snapshot;
import javax.inject.Inject;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore;
import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectType;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
-import org.apache.cloudstack.storage.datastore.DataStoreManager;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreRole;
+import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotDataFactory;
+import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
+import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
+import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
import org.apache.cloudstack.storage.datastore.ObjectInDataStoreManager;
-import org.apache.cloudstack.storage.db.ObjectInDataStoreVO;
-import org.apache.cloudstack.storage.snapshot.db.SnapshotDao2;
-import org.apache.cloudstack.storage.snapshot.db.SnapshotVO;
import org.springframework.stereotype.Component;
+import com.cloud.storage.Snapshot;
+import com.cloud.storage.SnapshotVO;
+import com.cloud.storage.dao.SnapshotDao;
+import com.cloud.utils.exception.CloudRuntimeException;
+
@Component
public class SnapshotDataFactoryImpl implements SnapshotDataFactory {
@Inject
- SnapshotDao2 snapshotDao;
+ SnapshotDao snapshotDao;
@Inject
ObjectInDataStoreManager objMap;
@Inject
DataStoreManager storeMgr;
+ @Inject
+ VolumeDataFactory volumeFactory;
@Override
public SnapshotInfo getSnapshot(long snapshotId, DataStore store) {
- SnapshotVO snapshot = snapshotDao.findById(snapshotId);
- ObjectInDataStoreVO obj = objMap.findObject(snapshotId, DataObjectType.SNAPSHOT, store.getId(), store.getRole());
- SnapshotObject so = new SnapshotObject(snapshot, store);
+ SnapshotVO snapshot = snapshotDao.findByIdIncludingRemoved(snapshotId);
+ DataObjectInStore obj = objMap.findObject(snapshot.getUuid(), DataObjectType.SNAPSHOT, store.getUuid(), store.getRole());
+ if (obj == null) {
+ return null;
+ }
+ SnapshotObject so = SnapshotObject.getSnapshotObject(snapshot, store);
+ return so;
+ }
+ @Override
+ public SnapshotInfo getSnapshot(long snapshotId) {
+ SnapshotVO snapshot = snapshotDao.findByIdIncludingRemoved(snapshotId);
+ SnapshotObject so = null;
+ if (snapshot.getState() == Snapshot.State.BackedUp) {
+ DataStore store = objMap.findStore(snapshot.getUuid(), DataObjectType.SNAPSHOT, DataStoreRole.Image);
+ so = SnapshotObject.getSnapshotObject(snapshot, store);
+ } else {
+ VolumeInfo volume = this.volumeFactory.getVolume(snapshot.getVolumeId());
+ so = SnapshotObject.getSnapshotObject(snapshot, volume.getDataStore());
+ }
+ return so;
+ }
+
+ @Override
+ public SnapshotInfo getSnapshot(DataObject obj, DataStore store) {
+ SnapshotVO snapshot = snapshotDao.findByIdIncludingRemoved(obj.getId());
+ if (snapshot == null) {
+ throw new CloudRuntimeException("Can't find snapshot: " + obj.getId());
+ }
+ SnapshotObject so = SnapshotObject.getSnapshotObject(snapshot, store);
return so;
}
}
diff --git a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotObject.java b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotObject.java
index 6ce17973375..d10dc778092 100644
--- a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotObject.java
+++ b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotObject.java
@@ -18,19 +18,54 @@
*/
package org.apache.cloudstack.storage.snapshot;
+import java.util.Date;
+
+import javax.inject.Inject;
+
import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectType;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
+import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
+import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
+import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.disktype.DiskFormat;
-import org.apache.cloudstack.storage.snapshot.db.SnapshotVO;
+import org.apache.cloudstack.storage.datastore.ObjectInDataStoreManager;
+import org.apache.log4j.Logger;
+
+import com.cloud.hypervisor.Hypervisor.HypervisorType;
+import com.cloud.storage.Snapshot;
+import com.cloud.storage.SnapshotVO;
+import com.cloud.storage.dao.SnapshotDao;
+import com.cloud.storage.dao.VolumeDao;
+import com.cloud.utils.component.ComponentContext;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.fsm.NoTransitionException;
public class SnapshotObject implements SnapshotInfo {
+ private static final Logger s_logger = Logger.getLogger(SnapshotObject.class);
private SnapshotVO snapshot;
private DataStore store;
-
- public SnapshotObject(SnapshotVO snapshot, DataStore store) {
- this.snapshot = snapshot;
- this.store = store;
+ @Inject
+ protected SnapshotDao snapshotDao;
+ @Inject
+ protected VolumeDao volumeDao;
+ @Inject protected VolumeDataFactory volFactory;
+ @Inject protected SnapshotStateMachineManager stateMachineMgr;
+ @Inject
+ ObjectInDataStoreManager ojbectInStoreMgr;
+ public SnapshotObject() {
+
+ }
+
+ protected void configure(SnapshotVO snapshot, DataStore store) {
+ this.snapshot = snapshot;
+ this.store = store;
+ }
+
+ public static SnapshotObject getSnapshotObject(SnapshotVO snapshot, DataStore store) {
+ SnapshotObject snapObj = ComponentContext.inject(SnapshotObject.class);
+ snapObj.configure(snapshot, store);
+ return snapObj;
}
public DataStore getStore() {
@@ -51,50 +86,138 @@ public class SnapshotObject implements SnapshotInfo {
@Override
public VolumeInfo getBaseVolume() {
- // TODO Auto-generated method stub
- return null;
+ return volFactory.getVolume(this.snapshot.getVolumeId());
}
@Override
public long getId() {
- // TODO Auto-generated method stub
- return 0;
+ return this.snapshot.getId();
}
@Override
public String getUri() {
- // TODO Auto-generated method stub
- return null;
+ return this.snapshot.getUuid();
}
@Override
public DataStore getDataStore() {
- // TODO Auto-generated method stub
- return null;
+ return this.store;
}
@Override
public Long getSize() {
- // TODO Auto-generated method stub
- return 0L;
+ return this.getSize();
}
@Override
public DataObjectType getType() {
- // TODO Auto-generated method stub
- return null;
+ return DataObjectType.SNAPSHOT;
}
@Override
public DiskFormat getFormat() {
- // TODO Auto-generated method stub
return null;
}
@Override
public String getUuid() {
- // TODO Auto-generated method stub
- return null;
+ return this.snapshot.getUuid();
}
+ @Override
+ public void processEvent(
+ ObjectInDataStoreStateMachine.Event event) {
+ try {
+ ojbectInStoreMgr.update(this, event);
+ } catch (Exception e) {
+ s_logger.debug("Failed to update state:" + e.toString());
+ throw new CloudRuntimeException("Failed to update state: " + e.toString());
+ }
+ }
+
+ @Override
+ public long getAccountId() {
+ return this.snapshot.getAccountId();
+ }
+
+ @Override
+ public long getVolumeId() {
+ return this.snapshot.getVolumeId();
+ }
+
+ @Override
+ public String getPath() {
+ return this.snapshot.getPath();
+ }
+
+ public void setPath(String path) {
+ this.snapshot.setPath(path);
+ }
+
+ @Override
+ public String getName() {
+ return this.snapshot.getName();
+ }
+
+ @Override
+ public Date getCreated() {
+ return this.snapshot.getCreated();
+ }
+
+ @Override
+ public Type getRecurringType() {
+ return this.snapshot.getRecurringType();
+ }
+
+ @Override
+ public State getState() {
+ return this.snapshot.getState();
+ }
+
+ @Override
+ public HypervisorType getHypervisorType() {
+ return this.snapshot.getHypervisorType();
+ }
+
+ @Override
+ public boolean isRecursive() {
+ return this.snapshot.isRecursive();
+ }
+
+ @Override
+ public short getsnapshotType() {
+ return this.snapshot.getsnapshotType();
+ }
+
+ @Override
+ public long getDomainId() {
+ return this.snapshot.getDomainId();
+ }
+
+ public void setPrevSnapshotId(Long id) {
+ this.snapshot.setPrevSnapshotId(id);
+ }
+
+ @Override
+ public Long getDataCenterId() {
+ return this.snapshot.getDataCenterId();
+ }
+
+ public void processEvent(Snapshot.Event event)
+ throws NoTransitionException {
+ stateMachineMgr.processEvent(this.snapshot, event);
+ }
+
+ @Override
+ public Long getPrevSnapshotId() {
+ return this.snapshot.getPrevSnapshotId();
+ }
+
+ public void setBackupSnapshotId(String id) {
+ this.snapshot.setBackupSnapshotId(id);
+ }
+
+ public String getBackupSnapshotId() {
+ return this.snapshot.getBackupSnapshotId();
+ }
}
diff --git a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotServiceImpl.java b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotServiceImpl.java
index 80b1918665d..1b64fd0cae3 100644
--- a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotServiceImpl.java
+++ b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotServiceImpl.java
@@ -17,10 +17,15 @@
package org.apache.cloudstack.storage.snapshot;
import org.apache.cloudstack.engine.cloud.entity.api.SnapshotEntity;
+import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
import org.springframework.stereotype.Component;
@Component
public class SnapshotServiceImpl implements SnapshotService {
+
+ public SnapshotServiceImpl() {
+
+ }
@Override
public SnapshotEntity getSnapshotEntity(long snapshotId) {
@@ -45,5 +50,7 @@ public class SnapshotServiceImpl implements SnapshotService {
// TODO Auto-generated method stub
return false;
}
+
+
}
diff --git a/server/src/com/cloud/baremetal/HttpCallException.java b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotStateMachineManager.java
similarity index 72%
rename from server/src/com/cloud/baremetal/HttpCallException.java
rename to engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotStateMachineManager.java
index d21a37cbb74..c6057704cd8 100644
--- a/server/src/com/cloud/baremetal/HttpCallException.java
+++ b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotStateMachineManager.java
@@ -14,15 +14,13 @@
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
-package com.cloud.baremetal;
-import com.cloud.utils.SerialVersionUID;
+package org.apache.cloudstack.storage.snapshot;
-import com.cloud.exception.CloudException;
+import com.cloud.storage.Snapshot.Event;
+import com.cloud.storage.SnapshotVO;
+import com.cloud.utils.fsm.NoTransitionException;
-public class HttpCallException extends CloudException {
- private static final long serialVersionUID= SerialVersionUID.HttpCallException;
- public HttpCallException(String msg) {
- super(msg);
- }
+public interface SnapshotStateMachineManager {
+ public void processEvent(SnapshotVO snapshot, Event event) throws NoTransitionException;
}
diff --git a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotStateMachineManagerImpl.java b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotStateMachineManagerImpl.java
new file mode 100644
index 00000000000..aa1cf684d7a
--- /dev/null
+++ b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotStateMachineManagerImpl.java
@@ -0,0 +1,54 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.cloudstack.storage.snapshot;
+
+import javax.inject.Inject;
+
+import org.springframework.stereotype.Component;
+
+import com.cloud.storage.Snapshot;
+import com.cloud.storage.Snapshot.Event;
+import com.cloud.storage.Snapshot.State;
+import com.cloud.storage.SnapshotVO;
+import com.cloud.storage.dao.SnapshotDao;
+import com.cloud.storage.listener.SnapshotStateListener;
+import com.cloud.utils.fsm.NoTransitionException;
+import com.cloud.utils.fsm.StateMachine2;
+
+@Component
+public class SnapshotStateMachineManagerImpl implements
+SnapshotStateMachineManager {
+ private StateMachine2 stateMachine = new StateMachine2();
+ @Inject
+ protected SnapshotDao snapshotDao;
+ public SnapshotStateMachineManagerImpl() {
+ stateMachine.addTransition(Snapshot.State.Allocated, Event.CreateRequested, Snapshot.State.Creating);
+ stateMachine.addTransition(Snapshot.State.Creating, Event.OperationSucceeded, Snapshot.State.CreatedOnPrimary);
+ stateMachine.addTransition(Snapshot.State.Creating, Event.OperationNotPerformed, Snapshot.State.BackedUp);
+ stateMachine.addTransition(Snapshot.State.Creating, Event.OperationFailed, Snapshot.State.Error);
+ stateMachine.addTransition(Snapshot.State.CreatedOnPrimary, Event.BackupToSecondary, Snapshot.State.BackingUp);
+ stateMachine.addTransition(Snapshot.State.BackingUp, Event.OperationSucceeded, Snapshot.State.BackedUp);
+ stateMachine.addTransition(Snapshot.State.BackingUp, Event.OperationFailed, Snapshot.State.CreatedOnPrimary);
+
+ stateMachine.registerListener(new SnapshotStateListener());
+ }
+
+ public void processEvent(SnapshotVO snapshot, Event event) throws NoTransitionException {
+ stateMachine.transitTo(snapshot, event, null, snapshotDao);
+ }
+}
diff --git a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/strategy/AncientSnasphotStrategy.java b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/strategy/AncientSnasphotStrategy.java
new file mode 100644
index 00000000000..ea3b0afd09d
--- /dev/null
+++ b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/strategy/AncientSnasphotStrategy.java
@@ -0,0 +1,608 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.cloudstack.storage.snapshot.strategy;
+
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.CommandResult;
+import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
+import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectType;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreRole;
+import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
+import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event;
+import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreDriver;
+import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotDataFactory;
+import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
+import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotStrategy;
+import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
+import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
+import org.apache.cloudstack.framework.async.AsyncCallFuture;
+import org.apache.cloudstack.framework.async.AsyncCallbackDispatcher;
+import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
+import org.apache.cloudstack.framework.async.AsyncRpcConext;
+import org.apache.cloudstack.storage.datastore.ObjectInDataStoreManager;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
+import org.apache.cloudstack.storage.motion.DataMotionService;
+import org.apache.cloudstack.storage.snapshot.SnapshotObject;
+import org.apache.cloudstack.storage.snapshot.SnapshotStateMachineManager;
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.BackupSnapshotAnswer;
+import com.cloud.agent.api.DeleteSnapshotBackupCommand;
+import com.cloud.agent.api.to.S3TO;
+import com.cloud.agent.api.to.SwiftTO;
+import com.cloud.configuration.Resource.ResourceType;
+import com.cloud.configuration.dao.ConfigurationDao;
+import com.cloud.dc.ClusterVO;
+import com.cloud.dc.dao.ClusterDao;
+import com.cloud.event.EventTypes;
+import com.cloud.event.UsageEventUtils;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.host.HostVO;
+import com.cloud.hypervisor.Hypervisor.HypervisorType;
+import com.cloud.resource.ResourceManager;
+import com.cloud.storage.Snapshot;
+import com.cloud.storage.SnapshotVO;
+import com.cloud.storage.StoragePool;
+import com.cloud.storage.VolumeManager;
+import com.cloud.storage.VolumeVO;
+import com.cloud.storage.dao.SnapshotDao;
+import com.cloud.storage.dao.VolumeDao;
+import com.cloud.storage.s3.S3Manager;
+import com.cloud.storage.snapshot.SnapshotManager;
+import com.cloud.storage.swift.SwiftManager;
+import com.cloud.utils.NumbersUtil;
+import com.cloud.utils.db.DB;
+import com.cloud.utils.db.Transaction;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.fsm.NoTransitionException;
+import com.cloud.vm.UserVmVO;
+import com.cloud.vm.VirtualMachine.State;
+import com.cloud.vm.dao.UserVmDao;
+import com.cloud.vm.snapshot.VMSnapshot;
+import com.cloud.vm.snapshot.VMSnapshotVO;
+import com.cloud.vm.snapshot.dao.VMSnapshotDao;
+
+@Component
+public class AncientSnasphotStrategy implements SnapshotStrategy {
+ private static final Logger s_logger = Logger.getLogger(AncientSnasphotStrategy.class);
+ @Inject
+ protected VolumeDao _volsDao;
+ @Inject
+ protected UserVmDao _vmDao;
+ @Inject
+ protected PrimaryDataStoreDao _storagePoolDao;
+ @Inject
+ protected ClusterDao _clusterDao;
+ @Inject
+ protected SnapshotDao snapshotDao;
+ @Inject
+ private ResourceManager _resourceMgr;
+ @Inject
+ protected SnapshotDao _snapshotDao;
+ @Inject
+ protected SnapshotManager snapshotMgr;
+ @Inject
+ protected VolumeManager volumeMgr;
+ @Inject
+ private ConfigurationDao _configDao;
+ @Inject
+ protected SnapshotStateMachineManager stateMachineManager;
+ @Inject
+ private VolumeDao volumeDao;
+ @Inject
+ SnapshotDataFactory snapshotfactory;
+ @Inject
+ DataStoreManager dataStoreMgr;
+ @Inject
+ DataMotionService motionSrv;
+ @Inject
+ ObjectInDataStoreManager objInStoreMgr;
+ @Inject
+ VMSnapshotDao _vmSnapshotDao;
+
+
+ @Override
+ public boolean canHandle(SnapshotInfo snapshot) {
+ return true;
+ }
+
+ static private class CreateSnapshotContext extends AsyncRpcConext {
+ final VolumeInfo volume;
+ final SnapshotInfo snapshot;
+ final AsyncCallFuture future;
+ public CreateSnapshotContext(AsyncCompletionCallback callback, VolumeInfo volume,
+ SnapshotInfo snapshot,
+ AsyncCallFuture future) {
+ super(callback);
+ this.volume = volume;
+ this.snapshot = snapshot;
+ this.future = future;
+ }
+ }
+
+ static private class DeleteSnapshotContext extends AsyncRpcConext {
+ final SnapshotInfo snapshot;
+ final AsyncCallFuture future;
+ public DeleteSnapshotContext(AsyncCompletionCallback callback, SnapshotInfo snapshot,
+ AsyncCallFuture future) {
+ super(callback);
+ this.snapshot = snapshot;
+ this.future = future;
+ }
+
+ }
+
+ static private class CopySnapshotContext extends AsyncRpcConext {
+ final SnapshotInfo srcSnapshot;
+ final SnapshotInfo destSnapshot;
+ final AsyncCallFuture future;
+ public CopySnapshotContext(AsyncCompletionCallback callback,
+ SnapshotInfo srcSnapshot,
+ SnapshotInfo destSnapshot,
+ AsyncCallFuture future) {
+ super(callback);
+ this.srcSnapshot = srcSnapshot;
+ this.destSnapshot = destSnapshot;
+ this.future = future;
+ }
+
+ }
+
+ protected Void createSnapshotAsyncCallback(AsyncCallbackDispatcher callback,
+ CreateSnapshotContext context) {
+ CreateCmdResult result = callback.getResult();
+ SnapshotObject snapshot = (SnapshotObject)context.snapshot;
+ VolumeInfo volume = context.volume;
+ AsyncCallFuture future = context.future;
+ SnapshotResult snapResult = new SnapshotResult(snapshot);
+ if (result.isFailed()) {
+ s_logger.debug("create snapshot " + context.snapshot.getName() + " failed: " + result.getResult());
+ try {
+ snapshot.processEvent(Snapshot.Event.OperationFailed);
+ } catch (NoTransitionException nte) {
+ s_logger.debug("Failed to update snapshot state due to " + nte.getMessage());
+ }
+
+
+ snapResult.setResult(result.getResult());
+ future.complete(snapResult);
+ return null;
+ }
+
+ try {
+ SnapshotVO preSnapshotVO = this.snapshotMgr.getParentSnapshot(volume, snapshot);
+ String preSnapshotPath = null;
+ if (preSnapshotVO != null) {
+ preSnapshotPath = preSnapshotVO.getPath();
+ }
+ SnapshotVO snapshotVO = this.snapshotDao.findById(snapshot.getId());
+ // The snapshot was successfully created
+ if (preSnapshotPath != null && preSnapshotPath.equals(result.getPath())) {
+ // empty snapshot
+ s_logger.debug("CreateSnapshot: this is empty snapshot ");
+
+ snapshotVO.setPath(preSnapshotPath);
+ snapshotVO.setBackupSnapshotId(preSnapshotVO.getBackupSnapshotId());
+ snapshotVO.setSwiftId(preSnapshotVO.getSwiftId());
+ snapshotVO.setPrevSnapshotId(preSnapshotVO.getId());
+ snapshotVO.setSecHostId(preSnapshotVO.getSecHostId());
+ snapshot.processEvent(Snapshot.Event.OperationNotPerformed);
+ } else {
+ long preSnapshotId = 0;
+
+ if (preSnapshotVO != null && preSnapshotVO.getBackupSnapshotId() != null) {
+ preSnapshotId = preSnapshotVO.getId();
+ int _deltaSnapshotMax = NumbersUtil.parseInt(_configDao.getValue("snapshot.delta.max"), SnapshotManager.DELTAMAX);
+ int deltaSnap = _deltaSnapshotMax;
+
+ int i;
+ for (i = 1; i < deltaSnap; i++) {
+ String prevBackupUuid = preSnapshotVO.getBackupSnapshotId();
+ // previous snapshot doesn't have backup, create a full snapshot
+ if (prevBackupUuid == null) {
+ preSnapshotId = 0;
+ break;
+ }
+ long preSSId = preSnapshotVO.getPrevSnapshotId();
+ if (preSSId == 0) {
+ break;
+ }
+ preSnapshotVO = _snapshotDao.findByIdIncludingRemoved(preSSId);
+ }
+ if (i >= deltaSnap) {
+ preSnapshotId = 0;
+ }
+ }
+
+ //If the volume is moved around, backup a full snapshot to secondary storage
+ if (volume.getLastPoolId() != null && !volume.getLastPoolId().equals(volume.getPoolId())) {
+ preSnapshotId = 0;
+ //TODO: fix this hack
+ VolumeVO volumeVO = this.volumeDao.findById(volume.getId());
+ volumeVO.setLastPoolId(volume.getPoolId());
+ this.volumeDao.update(volume.getId(), volumeVO);
+ }
+
+ snapshot.setPath(result.getPath());
+ snapshot.setPrevSnapshotId(preSnapshotId);
+
+ snapshot.processEvent(Snapshot.Event.OperationSucceeded);
+ snapResult = new SnapshotResult(this.snapshotfactory.getSnapshot(snapshot.getId()));
+ }
+ } catch (Exception e) {
+ s_logger.debug("Failed to create snapshot: ", e);
+ snapResult.setResult(e.toString());
+ try {
+ snapshot.processEvent(Snapshot.Event.OperationFailed);
+ } catch (NoTransitionException e1) {
+ s_logger.debug("Failed to change snapshot state: " + e1.toString());
+ }
+ }
+
+ future.complete(snapResult);
+ return null;
+ }
+
+ class SnapshotResult extends CommandResult {
+ SnapshotInfo snashot;
+ public SnapshotResult(SnapshotInfo snapshot) {
+ this.snashot = snapshot;
+ }
+ }
+
+ protected SnapshotInfo createSnapshotOnPrimary(VolumeInfo volume, Long snapshotId) {
+ SnapshotObject snapshot = (SnapshotObject)this.snapshotfactory.getSnapshot(snapshotId);
+ if (snapshot == null) {
+ throw new CloudRuntimeException("Can not find snapshot " + snapshotId);
+ }
+
+ try {
+ snapshot.processEvent(Snapshot.Event.CreateRequested);
+ } catch (NoTransitionException nte) {
+ s_logger.debug("Failed to update snapshot state due to " + nte.getMessage());
+ throw new CloudRuntimeException("Failed to update snapshot state due to " + nte.getMessage());
+ }
+
+ AsyncCallFuture future = new AsyncCallFuture();
+ try {
+ CreateSnapshotContext context = new CreateSnapshotContext(
+ null, volume, snapshot, future);
+ AsyncCallbackDispatcher caller = AsyncCallbackDispatcher
+ .create(this);
+ caller.setCallback(
+ caller.getTarget().createSnapshotAsyncCallback(null, null))
+ .setContext(context);
+ PrimaryDataStoreDriver primaryStore = (PrimaryDataStoreDriver)volume.getDataStore().getDriver();
+ primaryStore.takeSnapshot(snapshot, caller);
+ } catch (Exception e) {
+ s_logger.debug("Failed to take snapshot: " + snapshot.getId(), e);
+ try {
+ snapshot.processEvent(Snapshot.Event.OperationFailed);
+ } catch (NoTransitionException e1) {
+ s_logger.debug("Failed to change state for event: OperationFailed" , e);
+ }
+ throw new CloudRuntimeException("Failed to take snapshot" + snapshot.getId());
+ }
+
+ SnapshotResult result;
+
+ try {
+ result = future.get();
+ if (result.isFailed()) {
+ s_logger.debug("Failed to create snapshot:" + result.getResult());
+ throw new CloudRuntimeException(result.getResult());
+ }
+ return result.snashot;
+ } catch (InterruptedException e) {
+ s_logger.debug("Failed to create snapshot", e);
+ throw new CloudRuntimeException("Failed to create snapshot", e);
+ } catch (ExecutionException e) {
+ s_logger.debug("Failed to create snapshot", e);
+ throw new CloudRuntimeException("Failed to create snapshot", e);
+ }
+
+ }
+
+ private boolean hostSupportSnapsthot(HostVO host) {
+ if (host.getHypervisorType() != HypervisorType.KVM) {
+ return true;
+ }
+ // Determine host capabilities
+ String caps = host.getCapabilities();
+
+ if (caps != null) {
+ String[] tokens = caps.split(",");
+ for (String token : tokens) {
+ if (token.contains("snapshot")) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ protected boolean supportedByHypervisor(VolumeInfo volume) {
+ if (volume.getHypervisorType().equals(HypervisorType.KVM)) {
+ StoragePool storagePool = (StoragePool)volume.getDataStore();
+ ClusterVO cluster = _clusterDao.findById(storagePool.getClusterId());
+ List hosts = _resourceMgr.listAllHostsInCluster(cluster.getId());
+ if (hosts != null && !hosts.isEmpty()) {
+ HostVO host = hosts.get(0);
+ if (!hostSupportSnapsthot(host)) {
+ throw new CloudRuntimeException("KVM Snapshot is not supported on cluster: " + host.getId());
+ }
+ }
+ }
+
+ // if volume is attached to a vm in destroyed or expunging state; disallow
+ if (volume.getInstanceId() != null) {
+ UserVmVO userVm = _vmDao.findById(volume.getInstanceId());
+ if (userVm != null) {
+ if (userVm.getState().equals(State.Destroyed) || userVm.getState().equals(State.Expunging)) {
+ throw new CloudRuntimeException("Creating snapshot failed due to volume:" + volume.getId() + " is associated with vm:" + userVm.getInstanceName() + " is in "
+ + userVm.getState().toString() + " state");
+ }
+
+ if(userVm.getHypervisorType() == HypervisorType.VMware || userVm.getHypervisorType() == HypervisorType.KVM) {
+ List activeSnapshots = _snapshotDao.listByInstanceId(volume.getInstanceId(), Snapshot.State.Creating, Snapshot.State.CreatedOnPrimary, Snapshot.State.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");
+ }
+
+ List activeVMSnapshots = _vmSnapshotDao.listByInstanceId(userVm.getId(),
+ VMSnapshot.State.Creating, VMSnapshot.State.Reverting, VMSnapshot.State.Expunging);
+ if (activeVMSnapshots.size() > 0) {
+ throw new CloudRuntimeException(
+ "There is other active vm snapshot tasks on the instance to which the volume is attached, please try again later");
+ }
+ }
+ }
+
+ return true;
+ }
+
+ @Override
+ public SnapshotInfo takeSnapshot(VolumeInfo volume, Long snapshotId) {
+
+ supportedByHypervisor(volume);
+
+ SnapshotInfo snapshot = createSnapshotOnPrimary(volume, snapshotId);
+ return snapshot;
+ }
+
+ @Override
+ public SnapshotInfo backupSnapshot(SnapshotInfo snapshot) {
+ SnapshotObject snapObj = (SnapshotObject)snapshot;
+ AsyncCallFuture future = new AsyncCallFuture();
+ SnapshotResult result = new SnapshotResult(snapshot);
+ try {
+
+ snapObj.processEvent(Snapshot.Event.BackupToSecondary);
+
+ ZoneScope scope = new ZoneScope(snapshot.getDataCenterId());
+ List stores = this.dataStoreMgr.getImageStores(scope);
+ if (stores.size() != 1) {
+ throw new CloudRuntimeException("find out more than one image stores");
+ }
+
+ DataStore imageStore = stores.get(0);
+ SnapshotInfo snapshotOnImageStore = (SnapshotInfo)imageStore.create(snapshot);
+
+ snapshotOnImageStore.processEvent(Event.CreateOnlyRequested);
+ CopySnapshotContext context = new CopySnapshotContext(null, snapshot,
+ snapshotOnImageStore, future);
+ AsyncCallbackDispatcher caller = AsyncCallbackDispatcher
+ .create(this);
+ caller.setCallback(
+ caller.getTarget().copySnapshotAsyncCallback(null, null))
+ .setContext(context);
+ this.motionSrv.copyAsync(snapshot, snapshotOnImageStore, caller);
+ } catch (Exception e) {
+ s_logger.debug("Failed to copy snapshot", e);
+ result.setResult("Failed to copy snapshot:" +e.toString());
+ try {
+ snapObj.processEvent(Snapshot.Event.OperationFailed);
+ } catch (NoTransitionException e1) {
+ s_logger.debug("Failed to change state: " + e1.toString());
+ }
+ future.complete(result);
+ }
+
+ try {
+ SnapshotResult res = future.get();
+ SnapshotInfo destSnapshot = res.snashot;
+ return destSnapshot;
+ } catch (InterruptedException e) {
+ s_logger.debug("failed copy snapshot", e);
+ throw new CloudRuntimeException("Failed to copy snapshot" , e);
+ } catch (ExecutionException e) {
+ s_logger.debug("Failed to copy snapshot", e);
+ throw new CloudRuntimeException("Failed to copy snapshot" , e);
+ }
+
+ }
+
+ protected Void copySnapshotAsyncCallback(AsyncCallbackDispatcher callback,
+ CopySnapshotContext context) {
+ CopyCommandResult result = callback.getResult();
+ SnapshotInfo destSnapshot = context.destSnapshot;
+ SnapshotObject srcSnapshot = (SnapshotObject)context.srcSnapshot;
+ AsyncCallFuture future = context.future;
+ SnapshotResult snapResult = new SnapshotResult(destSnapshot);
+ if (result.isFailed()) {
+ snapResult.setResult(result.getResult());
+ future.complete(snapResult);
+ return null;
+ }
+
+ try {
+ BackupSnapshotAnswer answer = (BackupSnapshotAnswer)result.getAnswer();
+
+ DataObjectInStore dataInStore = objInStoreMgr.findObject(destSnapshot, destSnapshot.getDataStore());
+ dataInStore.setInstallPath(answer.getBackupSnapshotName());
+ objInStoreMgr.update(destSnapshot, Event.OperationSuccessed);
+
+ srcSnapshot.processEvent(Snapshot.Event.OperationSucceeded);
+ snapResult = new SnapshotResult(this.snapshotfactory.getSnapshot(destSnapshot.getId()));
+ future.complete(snapResult);
+ } catch (Exception e) {
+ s_logger.debug("Failed to update snapshot state", e);
+ snapResult.setResult(e.toString());
+ future.complete(snapResult);
+ }
+ return null;
+ }
+
+ @DB
+ protected boolean destroySnapshotBackUp(SnapshotVO snapshot) {
+ DataStore store = objInStoreMgr.findStore(snapshot.getUuid(), DataObjectType.SNAPSHOT, DataStoreRole.Image);
+ if (store == null) {
+ s_logger.debug("Can't find snapshot" + snapshot.getId() + " backed up into image store");
+ return false;
+ }
+
+ try {
+ SnapshotInfo snapshotInfo = this.snapshotfactory.getSnapshot(snapshot.getId(), store);
+ snapshotInfo.processEvent(ObjectInDataStoreStateMachine.Event.DestroyRequested);
+
+ AsyncCallFuture future = new AsyncCallFuture();
+ DeleteSnapshotContext context = new DeleteSnapshotContext(null,
+ snapshotInfo, future);
+ AsyncCallbackDispatcher caller = AsyncCallbackDispatcher
+ .create(this);
+ caller.setCallback(
+ caller.getTarget().deleteSnapshotCallback(null, null))
+ .setContext(context);
+
+ store.getDriver().deleteAsync(snapshotInfo, caller);
+
+ SnapshotResult result = future.get();
+ if (result.isFailed()) {
+ s_logger.debug("Failed to delete snapsoht: " + result.getResult());
+ }
+ return result.isSuccess();
+ } catch (Exception e) {
+ s_logger.debug("Failed to delete snapshot", e);
+ return false;
+ }
+ }
+
+ protected Void deleteSnapshotCallback(AsyncCallbackDispatcher callback,
+ DeleteSnapshotContext context) {
+ CommandResult result = callback.getResult();
+ AsyncCallFuture future = context.future;
+ SnapshotInfo snapshot = context.snapshot;
+ if (result.isFailed()) {
+ s_logger.debug("delete snapshot failed" + result.getResult());
+ snapshot.processEvent(ObjectInDataStoreStateMachine.Event.OperationFailed);
+ SnapshotResult res = new SnapshotResult(context.snapshot);
+ future.complete(res);
+ return null;
+ }
+ snapshot.processEvent(ObjectInDataStoreStateMachine.Event.OperationSuccessed);
+ SnapshotResult res = new SnapshotResult(context.snapshot);
+ future.complete(res);
+ return null;
+ }
+
+ @Override
+ public boolean deleteSnapshot(SnapshotInfo snapInfo) {
+ Long snapshotId = snapInfo.getId();
+ SnapshotObject snapshot = (SnapshotObject)snapInfo;
+
+ if (!Snapshot.State.BackedUp.equals(snapshot.getState())) {
+ throw new InvalidParameterValueException("Can't delete snapshotshot " + snapshotId + " due to it is not in BackedUp Status");
+ }
+
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Calling deleteSnapshot for snapshotId: " + snapshotId);
+ }
+ SnapshotVO lastSnapshot = null;
+ if (snapshot.getBackupSnapshotId() != null) {
+ List snaps = _snapshotDao.listByBackupUuid(snapshot.getVolumeId(), snapshot.getBackupSnapshotId());
+ if (snaps != null && snaps.size() > 1) {
+ snapshot.setBackupSnapshotId(null);
+ SnapshotVO snapshotVO = this._snapshotDao.findById(snapshotId);
+ _snapshotDao.update(snapshot.getId(), snapshotVO);
+ }
+ }
+
+ _snapshotDao.remove(snapshotId);
+
+ long lastId = snapshotId;
+ boolean destroy = false;
+ while (true) {
+ lastSnapshot = _snapshotDao.findNextSnapshot(lastId);
+ if (lastSnapshot == null) {
+ // if all snapshots after this snapshot in this chain are removed, remove those snapshots.
+ destroy = true;
+ break;
+ }
+ if (lastSnapshot.getRemoved() == null) {
+ // if there is one child not removed, then can not remove back up snapshot.
+ break;
+ }
+ lastId = lastSnapshot.getId();
+ }
+ if (destroy) {
+ lastSnapshot = _snapshotDao.findByIdIncludingRemoved(lastId);
+ while (lastSnapshot.getRemoved() != null) {
+ String BackupSnapshotId = lastSnapshot.getBackupSnapshotId();
+ if (BackupSnapshotId != null) {
+ List snaps = _snapshotDao.listByBackupUuid(lastSnapshot.getVolumeId(), BackupSnapshotId);
+ if (snaps != null && snaps.size() > 1) {
+ lastSnapshot.setBackupSnapshotId(null);
+ _snapshotDao.update(lastSnapshot.getId(), lastSnapshot);
+ } else {
+ if (destroySnapshotBackUp(lastSnapshot)) {
+
+ } else {
+ s_logger.debug("Destroying snapshot backup failed " + lastSnapshot);
+ break;
+ }
+ }
+ }
+ lastId = lastSnapshot.getPrevSnapshotId();
+ if (lastId == 0) {
+ break;
+ }
+ lastSnapshot = _snapshotDao.findByIdIncludingRemoved(lastId);
+ }
+ }
+ return true;
+
+ }
+
+ @Override
+ public boolean revertSnapshot(SnapshotInfo snapshot) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+}
diff --git a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/strategy/HypervisorBasedSnapshot.java b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/strategy/HypervisorBasedSnapshot.java
deleted file mode 100644
index 7f18200cd3d..00000000000
--- a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/strategy/HypervisorBasedSnapshot.java
+++ /dev/null
@@ -1,44 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License. You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied. See the License for the
-// specific language governing permissions and limitations
-// under the License.
-package org.apache.cloudstack.storage.snapshot.strategy;
-
-import org.apache.cloudstack.storage.snapshot.SnapshotInfo;
-import org.apache.cloudstack.storage.snapshot.SnapshotStrategy;
-import org.springframework.stereotype.Component;
-
-@Component
-public class HypervisorBasedSnapshot implements SnapshotStrategy {
-
- @Override
- public boolean takeSnapshot(SnapshotInfo snapshot) {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public boolean revertSnapshot(SnapshotInfo snapshot) {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public boolean deleteSnapshot(SnapshotInfo snapshot) {
- // TODO Auto-generated method stub
- return false;
- }
-
-}
diff --git a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/strategy/StorageBasedSnapshot.java b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/strategy/StorageBasedSnapshot.java
deleted file mode 100644
index fa9c5aeaa08..00000000000
--- a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/strategy/StorageBasedSnapshot.java
+++ /dev/null
@@ -1,42 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License. You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied. See the License for the
-// specific language governing permissions and limitations
-// under the License.
-package org.apache.cloudstack.storage.snapshot.strategy;
-
-import org.apache.cloudstack.storage.snapshot.SnapshotInfo;
-import org.apache.cloudstack.storage.snapshot.SnapshotStrategy;
-
-public class StorageBasedSnapshot implements SnapshotStrategy {
-
- @Override
- public boolean takeSnapshot(SnapshotInfo snapshot) {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public boolean revertSnapshot(SnapshotInfo snapshot) {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public boolean deleteSnapshot(SnapshotInfo snapshot) {
- // TODO Auto-generated method stub
- return false;
- }
-
-}
diff --git a/engine/storage/snapshot/test/resource/SnapshotManagerTestContext.xml b/engine/storage/snapshot/test/resource/SnapshotManagerTestContext.xml
new file mode 100644
index 00000000000..d99c2e2dbac
--- /dev/null
+++ b/engine/storage/snapshot/test/resource/SnapshotManagerTestContext.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/engine/storage/snapshot/test/src/SnapshotDataFactoryTest.java b/engine/storage/snapshot/test/src/SnapshotDataFactoryTest.java
new file mode 100644
index 00000000000..e722ab55c70
--- /dev/null
+++ b/engine/storage/snapshot/test/src/SnapshotDataFactoryTest.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package src;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotDataFactory;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.cloud.utils.component.ComponentContext;
+
+import junit.framework.TestCase;
+
+//@RunWith(SpringJUnit4ClassRunner.class)
+//@ContextConfiguration(locations = "classpath:/SnapshotManagerTestContext.xml")
+public class SnapshotDataFactoryTest extends TestCase {
+ //@Inject SnapshotDataFactory snapshotFactory;
+
+ @Before
+ public void setup() throws Exception {
+ //ComponentContext.initComponentsLifeCycle();
+
+ }
+
+ @Test
+ public void testGestSnapshot() {
+ //snapshotFactory.getSnapshot(snapshotId);
+ }
+
+}
diff --git a/engine/storage/src/org/apache/cloudstack/storage/HypervsiorHostEndPointRpcServer.java b/engine/storage/src/org/apache/cloudstack/storage/HypervsiorHostEndPointRpcServer.java
index b709991ee57..f441f39ddfa 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/HypervsiorHostEndPointRpcServer.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/HypervsiorHostEndPointRpcServer.java
@@ -40,24 +40,24 @@ public class HypervsiorHostEndPointRpcServer implements HostEndpointRpcServer {
private static final Logger s_logger = Logger.getLogger(HypervsiorHostEndPointRpcServer.class);
@Inject
- private RpcProvider _rpcProvider;
+ private RpcProvider rpcProvider;
public HypervsiorHostEndPointRpcServer() {
}
public HypervsiorHostEndPointRpcServer(RpcProvider rpcProvider) {
- _rpcProvider = rpcProvider;
- _rpcProvider.registerRpcServiceEndpoint(RpcServiceDispatcher.getDispatcher(this));
+ rpcProvider = rpcProvider;
+ rpcProvider.registerRpcServiceEndpoint(RpcServiceDispatcher.getDispatcher(this));
}
@PostConstruct
public void Initialize() {
- _rpcProvider.registerRpcServiceEndpoint(RpcServiceDispatcher.getDispatcher(this));
+ rpcProvider.registerRpcServiceEndpoint(RpcServiceDispatcher.getDispatcher(this));
}
@Override
public void sendCommandAsync(HypervisorHostEndPoint host, final Command command, final AsyncCompletionCallback callback) {
- _rpcProvider.newCall(host.getHostAddr()).addCallbackListener(new RpcCallbackListener() {
+ rpcProvider.newCall(host.getHostAddr()).addCallbackListener(new RpcCallbackListener() {
@Override
public void onSuccess(Answer result) {
callback.complete(result);
diff --git a/server/src/com/cloud/storage/allocator/AbstractStoragePoolAllocator.java b/engine/storage/src/org/apache/cloudstack/storage/allocator/AbstractStoragePoolAllocator.java
similarity index 50%
rename from server/src/com/cloud/storage/allocator/AbstractStoragePoolAllocator.java
rename to engine/storage/src/org/apache/cloudstack/storage/allocator/AbstractStoragePoolAllocator.java
index 61b5e1f7752..6334ca7f2dc 100755
--- a/server/src/com/cloud/storage/allocator/AbstractStoragePoolAllocator.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/allocator/AbstractStoragePoolAllocator.java
@@ -14,48 +14,38 @@
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
-package com.cloud.storage.allocator;
+package org.apache.cloudstack.storage.allocator;
import java.math.BigDecimal;
import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
-import java.util.Set;
import javax.inject.Inject;
import javax.naming.ConfigurationException;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
+import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
import org.apache.log4j.Logger;
-import com.cloud.capacity.CapacityManager;
import com.cloud.configuration.dao.ConfigurationDao;
import com.cloud.dc.ClusterVO;
import com.cloud.dc.dao.ClusterDao;
-import com.cloud.deploy.DataCenterDeployment;
import com.cloud.deploy.DeploymentPlan;
import com.cloud.deploy.DeploymentPlanner.ExcludeList;
-import com.cloud.host.Host;
-import com.cloud.server.StatsCollector;
+import com.cloud.storage.DiskOfferingVO;
import com.cloud.storage.Storage.StoragePoolType;
import com.cloud.storage.StorageManager;
import com.cloud.storage.StoragePool;
-import com.cloud.storage.StoragePoolStatus;
-import com.cloud.storage.StoragePoolVO;
-import com.cloud.storage.VMTemplateStoragePoolVO;
-import com.cloud.storage.VMTemplateStorageResourceAssoc;
-import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
-import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.Volume;
import com.cloud.storage.Volume.Type;
-import com.cloud.storage.dao.StoragePoolDao;
-import com.cloud.storage.dao.StoragePoolHostDao;
-import com.cloud.storage.dao.VMTemplateDao;
-import com.cloud.storage.dao.VMTemplateHostDao;
-import com.cloud.storage.dao.VMTemplatePoolDao;
+import com.cloud.storage.dao.DiskOfferingDao;
import com.cloud.storage.dao.VolumeDao;
-import com.cloud.storage.swift.SwiftManager;
-import com.cloud.template.TemplateManager;
+import com.cloud.user.Account;
import com.cloud.utils.NumbersUtil;
import com.cloud.utils.component.AdapterBase;
import com.cloud.vm.DiskProfile;
@@ -64,22 +54,19 @@ import com.cloud.vm.VirtualMachineProfile;
public abstract class AbstractStoragePoolAllocator extends AdapterBase implements StoragePoolAllocator {
private static final Logger s_logger = Logger.getLogger(AbstractStoragePoolAllocator.class);
- @Inject TemplateManager _tmpltMgr;
- @Inject StorageManager _storageMgr;
- @Inject StoragePoolDao _storagePoolDao;
- @Inject VMTemplateHostDao _templateHostDao;
- @Inject VMTemplatePoolDao _templatePoolDao;
- @Inject VMTemplateDao _templateDao;
+ @Inject StorageManager storageMgr;
+ protected @Inject PrimaryDataStoreDao _storagePoolDao;
@Inject VolumeDao _volumeDao;
- @Inject StoragePoolHostDao _poolHostDao;
@Inject ConfigurationDao _configDao;
@Inject ClusterDao _clusterDao;
- @Inject SwiftManager _swiftMgr;
- @Inject CapacityManager _capacityMgr;
+ protected @Inject DataStoreManager dataStoreMgr;
protected BigDecimal _storageOverprovisioningFactor = new BigDecimal(1);
long _extraBytesPerVolume = 0;
Random _rand;
boolean _dontMatter;
+ protected String _allocationAlgorithm = "random";
+ @Inject
+ DiskOfferingDao _diskOfferingDao;
@Override
public boolean configure(String name, Map params) throws ConfigurationException {
@@ -93,53 +80,86 @@ public abstract class AbstractStoragePoolAllocator extends AdapterBase implement
_extraBytesPerVolume = 0;
_rand = new Random(System.currentTimeMillis());
-
+
_dontMatter = Boolean.parseBoolean(configs.get("storage.overwrite.provisioning"));
-
+
+ String allocationAlgorithm = configs.get("vm.allocation.algorithm");
+ if (allocationAlgorithm != null) {
+ _allocationAlgorithm = allocationAlgorithm;
+ }
+
return true;
}
+
+ protected abstract List select(DiskProfile dskCh, VirtualMachineProfile extends VirtualMachine> vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo);
- abstract boolean allocatorIsCorrectType(DiskProfile dskCh);
+ @Override
+ public
+ List allocateToPool(DiskProfile dskCh, VirtualMachineProfile extends VirtualMachine> vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo) {
+ List pools = select(dskCh, vmProfile, plan, avoid, returnUpTo);
+ return reOrder(pools, vmProfile, plan);
+ }
- protected boolean templateAvailable(long templateId, long poolId) {
- VMTemplateStorageResourceAssoc thvo = _templatePoolDao.findByPoolTemplate(poolId, templateId);
- if (thvo != null) {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Template id : " + templateId + " status : " + thvo.getDownloadState().toString());
- }
- return (thvo.getDownloadState()==Status.DOWNLOADED);
- } else {
- return false;
+ protected List reorderPoolsByNumberOfVolumes(DeploymentPlan plan, List pools, Account account) {
+ if(account == null){
+ return pools;
+ }
+ long dcId = plan.getDataCenterId();
+ Long podId = plan.getPodId();
+ Long clusterId = plan.getClusterId();
+
+ List poolIdsByVolCount = _volumeDao.listPoolIdsByVolumeCount(dcId, podId, clusterId, account.getAccountId());
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("List of pools in ascending order of number of volumes for account id: "+ account.getAccountId() + " is: "+ poolIdsByVolCount);
+ }
+
+ //now filter the given list of Pools by this ordered list
+ Map poolMap = new HashMap();
+ for (StoragePool pool : pools) {
+ poolMap.put(pool.getId(), pool);
+ }
+ List matchingPoolIds = new ArrayList(poolMap.keySet());
+
+ poolIdsByVolCount.retainAll(matchingPoolIds);
+
+ List reorderedPools = new ArrayList();
+ for(Long id: poolIdsByVolCount){
+ reorderedPools.add(poolMap.get(id));
+ }
+
+ return reorderedPools;
+ }
+
+ protected List reOrder(List pools,
+ VirtualMachineProfile extends VirtualMachine> vmProfile,
+ DeploymentPlan plan) {
+ Account account = null;
+ if(vmProfile.getVirtualMachine() != null){
+ account = vmProfile.getOwner();
}
+
+ if(_allocationAlgorithm.equals("random") || _allocationAlgorithm.equals("userconcentratedpod_random") || (account == null)) {
+ // Shuffle this so that we don't check the pools in the same order.
+ Collections.shuffle(pools);
+ }else if(_allocationAlgorithm.equals("userdispersing")){
+ pools = reorderPoolsByNumberOfVolumes(plan, pools, account);
+ }
+ return pools;
}
- protected boolean localStorageAllocationNeeded(DiskProfile dskCh) {
- return dskCh.useLocalStorage();
- }
-
- protected boolean poolIsCorrectType(DiskProfile dskCh, StoragePool pool) {
- boolean localStorageAllocationNeeded = localStorageAllocationNeeded(dskCh);
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Is localStorageAllocationNeeded? "+ localStorageAllocationNeeded);
- s_logger.debug("Is storage pool shared? "+ pool.getPoolType().isShared());
- }
-
- return ((!localStorageAllocationNeeded && pool.getPoolType().isShared()) || (localStorageAllocationNeeded && !pool.getPoolType().isShared()));
- }
-
- protected boolean checkPool(ExcludeList avoid, StoragePoolVO pool, DiskProfile dskCh, VMTemplateVO template, List templatesInPool,
- StatsCollector sc, DeploymentPlan plan) {
+ protected boolean filter(ExcludeList avoid, StoragePool pool, DiskProfile dskCh,
+ DeploymentPlan plan) {
if (s_logger.isDebugEnabled()) {
s_logger.debug("Checking if storage pool is suitable, name: " + pool.getName()+ " ,poolId: "+ pool.getId());
}
-
if (avoid.shouldAvoid(pool)) {
if (s_logger.isDebugEnabled()) {
s_logger.debug("StoragePool is in avoid set, skipping this pool");
}
return false;
}
+
if(dskCh.getType().equals(Type.ROOT) && pool.getPoolType().equals(StoragePoolType.Iscsi)){
if (s_logger.isDebugEnabled()) {
s_logger.debug("Disk needed for ROOT volume, but StoragePoolType is Iscsi, skipping this and trying other available pools");
@@ -147,26 +167,13 @@ public abstract class AbstractStoragePoolAllocator extends AdapterBase implement
return false;
}
- //by default, all pools are up when successfully added
- //don't return the pool if not up (if in maintenance/prepareformaintenance/errorinmaintenance)
- if(!pool.getStatus().equals(StoragePoolStatus.Up)){
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("StoragePool status is not UP, status is: "+pool.getStatus().name()+", skipping this pool");
- }
- return false;
+ DiskOfferingVO diskOffering = _diskOfferingDao.findById(dskCh.getDiskOfferingId());
+ if (diskOffering.getSystemUse() && pool.getPoolType() == StoragePoolType.RBD) {
+ s_logger.debug("Skipping RBD pool " + pool.getName() + " as a suitable pool. RBD is not supported for System VM's");
+ return false;
}
+
- // Check that the pool type is correct
- if (!poolIsCorrectType(dskCh, pool)) {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("StoragePool is not of correct type, skipping this pool");
- }
- return false;
- }
-
- /*hypervisor type is correct*/
- // TODO : when creating a standalone volume, offering is passed as NULL, need to
- // refine the logic of checking hypervisorType based on offering info
Long clusterId = pool.getClusterId();
ClusterVO cluster = _clusterDao.findById(clusterId);
if (!(cluster.getHypervisorType() == dskCh.getHypersorType())) {
@@ -176,32 +183,10 @@ public abstract class AbstractStoragePoolAllocator extends AdapterBase implement
return false;
}
-
// check capacity
Volume volume = _volumeDao.findById(dskCh.getVolumeId());
List requestVolumes = new ArrayList();
requestVolumes.add(volume);
- return _storageMgr.storagePoolHasEnoughSpace(requestVolumes, pool);
+ return storageMgr.storagePoolHasEnoughSpace(requestVolumes, pool);
}
-
-
-
- @Override
- public String chooseStorageIp(VirtualMachine vm, Host host, Host storage) {
- return storage.getStorageIpAddress();
- }
-
-
- @Override
- public List allocateToPool(DiskProfile dskCh, VirtualMachineProfile extends VirtualMachine> vmProfile, long dcId, long podId, Long clusterId, Long hostId, Set extends StoragePool> avoids, int returnUpTo) {
-
- ExcludeList avoid = new ExcludeList();
- for(StoragePool pool : avoids){
- avoid.addPool(pool.getId());
- }
-
- DataCenterDeployment plan = new DataCenterDeployment(dcId, podId, clusterId, hostId, null, null);
- return allocateToPool(dskCh, vmProfile, plan, avoid, returnUpTo);
- }
-
}
diff --git a/engine/storage/src/org/apache/cloudstack/storage/allocator/ClusterScopeStoragePoolAllocator.java b/engine/storage/src/org/apache/cloudstack/storage/allocator/ClusterScopeStoragePoolAllocator.java
new file mode 100644
index 00000000000..747e2586fed
--- /dev/null
+++ b/engine/storage/src/org/apache/cloudstack/storage/allocator/ClusterScopeStoragePoolAllocator.java
@@ -0,0 +1,105 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package org.apache.cloudstack.storage.allocator;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import javax.ejb.Local;
+import javax.inject.Inject;
+import javax.naming.ConfigurationException;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator;
+import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
+
+import com.cloud.deploy.DeploymentPlan;
+import com.cloud.deploy.DeploymentPlanner.ExcludeList;
+import com.cloud.offering.ServiceOffering;
+import com.cloud.storage.StoragePool;
+import com.cloud.storage.dao.DiskOfferingDao;
+import com.cloud.vm.DiskProfile;
+import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.VirtualMachineProfile;
+
+@Component
+@Local(value=StoragePoolAllocator.class)
+public class ClusterScopeStoragePoolAllocator extends AbstractStoragePoolAllocator {
+ private static final Logger s_logger = Logger.getLogger(ClusterScopeStoragePoolAllocator.class);
+ protected String _allocationAlgorithm = "random";
+
+ @Inject
+ DiskOfferingDao _diskOfferingDao;
+
+ @Override
+ protected List select(DiskProfile dskCh, VirtualMachineProfile extends VirtualMachine> vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo) {
+
+ List suitablePools = new ArrayList();
+
+ long dcId = plan.getDataCenterId();
+ Long podId = plan.getPodId();
+ Long clusterId = plan.getClusterId();
+
+ if(dskCh.getTags() != null && dskCh.getTags().length != 0){
+ s_logger.debug("Looking for pools in dc: " + dcId + " pod:" + podId + " cluster:" + clusterId + " having tags:" + Arrays.toString(dskCh.getTags()));
+ }else{
+ s_logger.debug("Looking for pools in dc: " + dcId + " pod:" + podId + " cluster:" + clusterId);
+ }
+
+ List pools = _storagePoolDao.findPoolsByTags(dcId, podId, clusterId, dskCh.getTags());
+ if (pools.size() == 0) {
+ if (s_logger.isDebugEnabled()) {
+ String storageType = dskCh.useLocalStorage() ? ServiceOffering.StorageType.local.toString() : ServiceOffering.StorageType.shared.toString();
+ s_logger.debug("No storage pools available for " + storageType + " volume allocation, returning");
+ }
+ return suitablePools;
+ }
+
+ for (StoragePoolVO pool: pools) {
+ if(suitablePools.size() == returnUpTo){
+ break;
+ }
+ StoragePool pol = (StoragePool)this.dataStoreMgr.getPrimaryDataStore(pool.getId());
+ if (filter(avoid, pol, dskCh, plan)) {
+ suitablePools.add(pol);
+ }
+ }
+
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("FirstFitStoragePoolAllocator returning "+suitablePools.size() +" suitable storage pools");
+ }
+
+ return suitablePools;
+ }
+
+ @Override
+ public boolean configure(String name, Map params) throws ConfigurationException {
+ super.configure(name, params);
+
+ if (_configDao != null) {
+ Map configs = _configDao.getConfiguration(params);
+ String allocationAlgorithm = configs.get("vm.allocation.algorithm");
+ if (allocationAlgorithm != null) {
+ _allocationAlgorithm = allocationAlgorithm;
+ }
+ }
+ return true;
+ }
+}
diff --git a/server/src/com/cloud/storage/allocator/GarbageCollectingStoragePoolAllocator.java b/engine/storage/src/org/apache/cloudstack/storage/allocator/GarbageCollectingStoragePoolAllocator.java
similarity index 82%
rename from server/src/com/cloud/storage/allocator/GarbageCollectingStoragePoolAllocator.java
rename to engine/storage/src/org/apache/cloudstack/storage/allocator/GarbageCollectingStoragePoolAllocator.java
index 4eeae280d8b..91bc25c715d 100644
--- a/server/src/com/cloud/storage/allocator/GarbageCollectingStoragePoolAllocator.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/allocator/GarbageCollectingStoragePoolAllocator.java
@@ -14,7 +14,7 @@
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
-package com.cloud.storage.allocator;
+package org.apache.cloudstack.storage.allocator;
import java.util.List;
import java.util.Map;
@@ -23,8 +23,8 @@ import javax.ejb.Local;
import javax.inject.Inject;
import javax.naming.ConfigurationException;
+import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator;
import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
import com.cloud.configuration.dao.ConfigurationDao;
import com.cloud.deploy.DeploymentPlan;
@@ -36,32 +36,18 @@ import com.cloud.vm.DiskProfile;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachineProfile;
-@Component
@Local(value=StoragePoolAllocator.class)
public class GarbageCollectingStoragePoolAllocator extends AbstractStoragePoolAllocator {
private static final Logger s_logger = Logger.getLogger(GarbageCollectingStoragePoolAllocator.class);
StoragePoolAllocator _firstFitStoragePoolAllocator;
StoragePoolAllocator _localStoragePoolAllocator;
- @Inject StorageManager _storageMgr;
+ @Inject StorageManager storageMgr;
@Inject ConfigurationDao _configDao;
boolean _storagePoolCleanupEnabled;
@Override
- public boolean allocatorIsCorrectType(DiskProfile dskCh) {
- return true;
- }
-
- public Integer getStorageOverprovisioningFactor() {
- return null;
- }
-
- public Long getExtraBytesPerVolume() {
- return null;
- }
-
- @Override
- public List allocateToPool(DiskProfile dskCh, VirtualMachineProfile extends VirtualMachine> vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo) {
+ public List select(DiskProfile dskCh, VirtualMachineProfile extends VirtualMachine> vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo) {
if (!_storagePoolCleanupEnabled) {
s_logger.debug("Storage pool cleanup is not enabled, so GarbageCollectingStoragePoolAllocator is being skipped.");
@@ -69,10 +55,10 @@ public class GarbageCollectingStoragePoolAllocator extends AbstractStoragePoolAl
}
// Clean up all storage pools
- _storageMgr.cleanupStorage(false);
+ storageMgr.cleanupStorage(false);
// Determine what allocator to use
StoragePoolAllocator allocator;
- if (localStorageAllocationNeeded(dskCh)) {
+ if (dskCh.useLocalStorage()) {
allocator = _localStoragePoolAllocator;
} else {
allocator = _firstFitStoragePoolAllocator;
@@ -88,7 +74,7 @@ public class GarbageCollectingStoragePoolAllocator extends AbstractStoragePoolAl
public boolean configure(String name, Map params) throws ConfigurationException {
super.configure(name, params);
- _firstFitStoragePoolAllocator = ComponentContext.inject(FirstFitStoragePoolAllocator.class);
+ _firstFitStoragePoolAllocator = ComponentContext.inject(ClusterScopeStoragePoolAllocator.class);
_firstFitStoragePoolAllocator.configure("GCFirstFitStoragePoolAllocator", params);
_localStoragePoolAllocator = ComponentContext.inject(LocalStoragePoolAllocator.class);
_localStoragePoolAllocator.configure("GCLocalStoragePoolAllocator", params);
diff --git a/engine/storage/src/org/apache/cloudstack/storage/allocator/LocalStoragePoolAllocator.java b/engine/storage/src/org/apache/cloudstack/storage/allocator/LocalStoragePoolAllocator.java
new file mode 100644
index 00000000000..a8d5173cebe
--- /dev/null
+++ b/engine/storage/src/org/apache/cloudstack/storage/allocator/LocalStoragePoolAllocator.java
@@ -0,0 +1,126 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package org.apache.cloudstack.storage.allocator;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.ejb.Local;
+import javax.inject.Inject;
+import javax.naming.ConfigurationException;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator;
+import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
+
+import com.cloud.capacity.dao.CapacityDao;
+import com.cloud.configuration.dao.ConfigurationDao;
+import com.cloud.deploy.DeploymentPlan;
+import com.cloud.deploy.DeploymentPlanner.ExcludeList;
+import com.cloud.service.dao.ServiceOfferingDao;
+import com.cloud.storage.StoragePool;
+import com.cloud.storage.StoragePoolHostVO;
+import com.cloud.storage.Volume;
+import com.cloud.storage.dao.StoragePoolHostDao;
+import com.cloud.utils.NumbersUtil;
+import com.cloud.vm.DiskProfile;
+import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.VirtualMachineProfile;
+import com.cloud.vm.dao.UserVmDao;
+import com.cloud.vm.dao.VMInstanceDao;
+
+@Component
+@Local(value = StoragePoolAllocator.class)
+public class LocalStoragePoolAllocator extends AbstractStoragePoolAllocator {
+ private static final Logger s_logger = Logger.getLogger(LocalStoragePoolAllocator.class);
+
+ @Inject
+ StoragePoolHostDao _poolHostDao;
+ @Inject
+ VMInstanceDao _vmInstanceDao;
+ @Inject
+ UserVmDao _vmDao;
+ @Inject
+ ServiceOfferingDao _offeringDao;
+ @Inject
+ CapacityDao _capacityDao;
+ @Inject
+ ConfigurationDao _configDao;
+
+ @Override
+ protected List select(DiskProfile dskCh, VirtualMachineProfile extends VirtualMachine> vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo) {
+
+ List suitablePools = new ArrayList();
+
+
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("LocalStoragePoolAllocator trying to find storage pool to fit the vm");
+ }
+
+ // data disk and host identified from deploying vm (attach volume case)
+ if (dskCh.getType() == Volume.Type.DATADISK && plan.getHostId() != null) {
+ List hostPools = _poolHostDao.listByHostId(plan.getHostId());
+ for (StoragePoolHostVO hostPool: hostPools) {
+ StoragePoolVO pool = _storagePoolDao.findById(hostPool.getPoolId());
+ if (pool != null && pool.isLocal()) {
+ StoragePool pol = (StoragePool)this.dataStoreMgr.getPrimaryDataStore(pool.getId());
+ if (filter(avoid, pol, dskCh, plan)) {
+ s_logger.debug("Found suitable local storage pool " + pool.getId() + ", adding to list");
+ suitablePools.add(pol);
+ }
+ }
+
+ if (suitablePools.size() == returnUpTo) {
+ break;
+ }
+ }
+ } else {
+ List availablePools = _storagePoolDao.findLocalStoragePoolsByTags(plan.getDataCenterId(), plan.getPodId(), plan.getClusterId(), dskCh.getTags());
+ for (StoragePoolVO pool : availablePools) {
+ if (suitablePools.size() == returnUpTo) {
+ break;
+ }
+ StoragePool pol = (StoragePool)this.dataStoreMgr.getPrimaryDataStore(pool.getId());
+ if (filter(avoid, pol, dskCh, plan)) {
+ suitablePools.add(pol);
+ }
+ }
+ }
+
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("LocalStoragePoolAllocator returning " + suitablePools.size() + " suitable storage pools");
+ }
+
+ return suitablePools;
+ }
+
+ @Override
+ public boolean configure(String name, Map params) throws ConfigurationException {
+ super.configure(name, params);
+
+ _storageOverprovisioningFactor = new BigDecimal(1);
+ _extraBytesPerVolume = NumbersUtil.parseLong((String) params.get("extra.bytes.per.volume"), 50 * 1024L * 1024L);
+
+ return true;
+ }
+
+ public LocalStoragePoolAllocator() {
+ }
+}
diff --git a/server/src/com/cloud/storage/allocator/UseLocalForRootAllocator.java b/engine/storage/src/org/apache/cloudstack/storage/allocator/UseLocalForRootAllocator.java
similarity index 74%
rename from server/src/com/cloud/storage/allocator/UseLocalForRootAllocator.java
rename to engine/storage/src/org/apache/cloudstack/storage/allocator/UseLocalForRootAllocator.java
index 2c19406fef6..4663b12e97e 100644
--- a/server/src/com/cloud/storage/allocator/UseLocalForRootAllocator.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/allocator/UseLocalForRootAllocator.java
@@ -14,7 +14,7 @@
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
-package com.cloud.storage.allocator;
+package org.apache.cloudstack.storage.allocator;
import java.util.List;
import java.util.Map;
@@ -23,23 +23,17 @@ import javax.ejb.Local;
import javax.inject.Inject;
import javax.naming.ConfigurationException;
-import org.springframework.stereotype.Component;
+import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator;
-import com.cloud.configuration.Config;
-import com.cloud.configuration.dao.ConfigurationDao;
import com.cloud.dc.DataCenterVO;
import com.cloud.dc.dao.DataCenterDao;
import com.cloud.deploy.DeploymentPlan;
import com.cloud.deploy.DeploymentPlanner.ExcludeList;
-import com.cloud.host.Host;
import com.cloud.storage.StoragePool;
-import com.cloud.storage.Volume.Type;
-
import com.cloud.vm.DiskProfile;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachineProfile;
-@Component
@Local(value=StoragePoolAllocator.class)
public class UseLocalForRootAllocator extends LocalStoragePoolAllocator implements StoragePoolAllocator {
@@ -55,29 +49,13 @@ public class UseLocalForRootAllocator extends LocalStoragePoolAllocator implemen
return super.allocateToPool(dskCh, vmProfile, plan, avoid, returnUpTo);
}
-
- @Override
- public String chooseStorageIp(VirtualMachine vm, Host host, Host storage) {
- return null;
- }
@Override
public boolean configure(String name, Map params) throws ConfigurationException {
super.configure(name, params);
return true;
}
-
- @Override
- protected boolean localStorageAllocationNeeded(DiskProfile dskCh) {
- if (dskCh.getType() == Type.ROOT) {
- return true;
- } else if (dskCh.getType() == Type.DATADISK) {
- return false;
- } else {
- return super.localStorageAllocationNeeded(dskCh);
- }
- }
-
+
protected UseLocalForRootAllocator() {
}
}
diff --git a/engine/storage/src/org/apache/cloudstack/storage/allocator/ZoneWideStoragePoolAllocator.java b/engine/storage/src/org/apache/cloudstack/storage/allocator/ZoneWideStoragePoolAllocator.java
new file mode 100644
index 00000000000..c45f8a822a9
--- /dev/null
+++ b/engine/storage/src/org/apache/cloudstack/storage/allocator/ZoneWideStoragePoolAllocator.java
@@ -0,0 +1,80 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package org.apache.cloudstack.storage.allocator;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
+
+import com.cloud.deploy.DeploymentPlan;
+import com.cloud.deploy.DeploymentPlanner.ExcludeList;
+import com.cloud.hypervisor.Hypervisor.HypervisorType;
+import com.cloud.storage.StoragePool;
+import com.cloud.storage.Volume;
+import com.cloud.vm.DiskProfile;
+import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.VirtualMachineProfile;
+
+@Component
+public class ZoneWideStoragePoolAllocator extends AbstractStoragePoolAllocator {
+ private static final Logger s_logger = Logger.getLogger(ZoneWideStoragePoolAllocator.class);
+ @Inject PrimaryDataStoreDao _storagePoolDao;
+ @Inject DataStoreManager dataStoreMgr;
+
+ @Override
+ protected boolean filter(ExcludeList avoid, StoragePool pool, DiskProfile dskCh,
+ DeploymentPlan plan) {
+ Volume volume = _volumeDao.findById(dskCh.getVolumeId());
+ List requestVolumes = new ArrayList();
+ requestVolumes.add(volume);
+ return storageMgr.storagePoolHasEnoughSpace(requestVolumes, pool);
+ }
+
+ @Override
+ protected List select(DiskProfile dskCh,
+ VirtualMachineProfile extends VirtualMachine> vmProfile,
+ DeploymentPlan plan, ExcludeList avoid, int returnUpTo) {
+ List suitablePools = new ArrayList();
+ HypervisorType hypervisor = vmProfile.getHypervisorType();
+ if (hypervisor != null) {
+ if (hypervisor != HypervisorType.KVM) {
+ s_logger.debug("Only kvm supports zone wide storage");
+ return suitablePools;
+ }
+ }
+
+ List storagePools = _storagePoolDao.findZoneWideStoragePoolsByTags(plan.getDataCenterId(), dskCh.getTags());
+
+ for (StoragePoolVO storage : storagePools) {
+ if (suitablePools.size() == returnUpTo) {
+ break;
+ }
+ StoragePool pol = (StoragePool)this.dataStoreMgr.getPrimaryDataStore(storage.getId());
+ if (filter(avoid, pol, dskCh, plan)) {
+ suitablePools.add(pol);
+ }
+ }
+ return suitablePools;
+ }
+}
diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/DataObjectManagerImpl.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/DataObjectManagerImpl.java
index 657d32c7877..218f9013a17 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/datastore/DataObjectManagerImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/DataObjectManagerImpl.java
@@ -24,14 +24,14 @@ import org.apache.cloudstack.engine.subsystem.api.storage.CommandResult;
import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult;
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
+import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
+import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event;
import org.apache.cloudstack.framework.async.AsyncCallbackDispatcher;
import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
import org.apache.cloudstack.framework.async.AsyncRpcConext;
-import org.apache.cloudstack.storage.db.ObjectInDataStoreVO;
import org.apache.cloudstack.storage.motion.DataMotionService;
-import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine;
-import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine.Event;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
@@ -52,7 +52,7 @@ public class DataObjectManagerImpl implements DataObjectManager {
protected DataObject waitingForCreated(DataObject dataObj,
DataStore dataStore) {
long retries = this.waitingRetries;
- ObjectInDataStoreVO obj = null;
+ DataObjectInStore obj = null;
do {
try {
Thread.sleep(waitingTime);
@@ -61,8 +61,8 @@ public class DataObjectManagerImpl implements DataObjectManager {
throw new CloudRuntimeException("sleep interrupted", e);
}
- obj = objectInDataStoreMgr.findObject(dataObj.getId(),
- dataObj.getType(), dataStore.getId(), dataStore.getRole());
+ obj = objectInDataStoreMgr.findObject(dataObj,
+ dataStore);
if (obj == null) {
s_logger.debug("can't find object in db, maybe it's cleaned up already, exit waiting");
break;
@@ -92,11 +92,10 @@ public class DataObjectManagerImpl implements DataObjectManager {
}
@Override
- public void createAsync(DataObject data, DataStore store,
+ public void createAsync(DataObject data, DataStore store,
AsyncCompletionCallback callback, boolean noCopy) {
- ObjectInDataStoreVO obj = objectInDataStoreMgr.findObject(
- data.getId(), data.getType(), store.getId(),
- store.getRole());
+ DataObjectInStore obj = objectInDataStoreMgr.findObject(
+ data, store);
DataObject objInStore = null;
boolean freshNewTemplate = false;
if (obj == null) {
@@ -105,8 +104,8 @@ public class DataObjectManagerImpl implements DataObjectManager {
data, store);
freshNewTemplate = true;
} catch (Throwable e) {
- obj = objectInDataStoreMgr.findObject(data.getId(),
- data.getType(), store.getId(), store.getRole());
+ obj = objectInDataStoreMgr.findObject(data,
+ store);
if (obj == null) {
CreateCmdResult result = new CreateCmdResult(
null, null);
@@ -184,20 +183,12 @@ public class DataObjectManagerImpl implements DataObjectManager {
return null;
}
- ObjectInDataStoreVO obj = objectInDataStoreMgr.findObject(
- objInStrore.getId(), objInStrore
- .getType(), objInStrore.getDataStore()
- .getId(), objInStrore.getDataStore()
- .getRole());
-
- obj.setInstallPath(result.getPath());
- obj.setSize(result.getSize());
try {
- objectInDataStoreMgr.update(obj,
+ objectInDataStoreMgr.update(objInStrore,
ObjectInDataStoreStateMachine.Event.OperationSuccessed);
} catch (NoTransitionException e) {
try {
- objectInDataStoreMgr.update(obj,
+ objectInDataStoreMgr.update(objInStrore,
ObjectInDataStoreStateMachine.Event.OperationFailed);
} catch (NoTransitionException e1) {
s_logger.debug("failed to change state", e1);
@@ -259,14 +250,10 @@ public class DataObjectManagerImpl implements DataObjectManager {
CopyContext context) {
CopyCommandResult result = callback.getResult();
DataObject destObj = context.destObj;
- ObjectInDataStoreVO obj = objectInDataStoreMgr.findObject(
- destObj.getId(), destObj
- .getType(), destObj.getDataStore()
- .getId(), destObj.getDataStore()
- .getRole());
+
if (result.isFailed()) {
try {
- objectInDataStoreMgr.update(obj, Event.OperationFailed);
+ objectInDataStoreMgr.update(destObj, Event.OperationFailed);
} catch (NoTransitionException e) {
s_logger.debug("Failed to update copying state", e);
}
@@ -276,10 +263,8 @@ public class DataObjectManagerImpl implements DataObjectManager {
context.getParentCallback().complete(res);
}
- obj.setInstallPath(result.getPath());
-
try {
- objectInDataStoreMgr.update(obj,
+ objectInDataStoreMgr.update(destObj,
ObjectInDataStoreStateMachine.Event.OperationSuccessed);
} catch (NoTransitionException e) {
s_logger.debug("Failed to update copying state: ", e);
@@ -311,11 +296,8 @@ public class DataObjectManagerImpl implements DataObjectManager {
@Override
public void deleteAsync(DataObject data,
AsyncCompletionCallback callback) {
- ObjectInDataStoreVO obj = objectInDataStoreMgr.findObject(
- data.getId(), data.getType(), data.getDataStore().getId(),
- data.getDataStore().getRole());
try {
- objectInDataStoreMgr.update(obj, Event.DestroyRequested);
+ objectInDataStoreMgr.update(data, Event.DestroyRequested);
} catch (NoTransitionException e) {
s_logger.debug("destroy failed", e);
CreateCmdResult res = new CreateCmdResult(
@@ -338,23 +320,18 @@ public class DataObjectManagerImpl implements DataObjectManager {
protected Void deleteAsynCallback(AsyncCallbackDispatcher callback,
DeleteContext context) {
DataObject destObj = context.obj;
- ObjectInDataStoreVO obj = objectInDataStoreMgr.findObject(
- destObj.getId(), destObj
- .getType(), destObj.getDataStore()
- .getId(), destObj.getDataStore()
- .getRole());
-
+
CommandResult res = callback.getResult();
if (res.isFailed()) {
try {
- objectInDataStoreMgr.update(obj, Event.OperationFailed);
+ objectInDataStoreMgr.update(destObj, Event.OperationFailed);
} catch (NoTransitionException e) {
s_logger.debug("delete failed", e);
}
} else {
try {
- objectInDataStoreMgr.update(obj, Event.OperationSuccessed);
+ objectInDataStoreMgr.update(destObj, Event.OperationSuccessed);
} catch (NoTransitionException e) {
s_logger.debug("delete failed", e);
}
@@ -366,9 +343,8 @@ public class DataObjectManagerImpl implements DataObjectManager {
@Override
public DataObject createInternalStateOnly(DataObject data, DataStore store) {
- ObjectInDataStoreVO obj = objectInDataStoreMgr.findObject(
- data.getId(), data.getType(), store.getId(),
- store.getRole());
+ DataObjectInStore obj = objectInDataStoreMgr.findObject(
+ data, store);
DataObject objInStore = null;
if (obj == null) {
objInStore = objectInDataStoreMgr.create(
@@ -391,12 +367,6 @@ public class DataObjectManagerImpl implements DataObjectManager {
@Override
public void update(DataObject data, String path, Long size) {
- ObjectInDataStoreVO obj = objectInDataStoreMgr.findObject(
- data.getId(), data.getType(), data.getDataStore().getId(),
- data.getDataStore().getRole());
-
- obj.setInstallPath(path);
- obj.setSize(size);
- objectInDataStoreMgr.update(obj);
+ throw new CloudRuntimeException("not implemented");
}
}
diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java
index f857ac5db1a..a2fd08d1e8f 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java
@@ -18,12 +18,15 @@
*/
package org.apache.cloudstack.storage.datastore;
+import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreRole;
+import org.apache.cloudstack.engine.subsystem.api.storage.Scope;
import org.apache.cloudstack.storage.image.datastore.ImageDataStoreManager;
import org.springframework.stereotype.Component;
@@ -50,5 +53,22 @@ public class DataStoreManagerImpl implements DataStoreManager {
String providerUuid) {
return null;
}
+ @Override
+ public DataStore getDataStore(String uuid, DataStoreRole role) {
+ if (role == DataStoreRole.Primary) {
+ return primaryStorMgr.getPrimaryDataStore(uuid);
+ } else if (role == DataStoreRole.Image) {
+ return imageDataStoreMgr.getImageDataStore(uuid);
+ }
+ throw new CloudRuntimeException("un recognized type" + role);
+ }
+ @Override
+ public List getImageStores(Scope scope) {
+ return imageDataStoreMgr.getList();
+ }
+ @Override
+ public DataStore getPrimaryDataStore(long storeId) {
+ return primaryStorMgr.getPrimaryDataStore(storeId);
+ }
}
diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManager.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManager.java
index e707de6b8bd..d170f5c707a 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManager.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManager.java
@@ -17,26 +17,20 @@
package org.apache.cloudstack.storage.datastore;
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore;
import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectType;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreRole;
-import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
-import org.apache.cloudstack.storage.db.ObjectInDataStoreVO;
-import org.apache.cloudstack.storage.snapshot.SnapshotInfo;
-import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine.Event;
+import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event;
import com.cloud.utils.fsm.NoTransitionException;
public interface ObjectInDataStoreManager {
public DataObject create(DataObject template, DataStore dataStore);
- public VolumeInfo create(VolumeInfo volume, DataStore dataStore);
- public SnapshotInfo create(SnapshotInfo snapshot, DataStore dataStore);
- public ObjectInDataStoreVO findObject(long objectId, DataObjectType type,
- long dataStoreId, DataStoreRole role);
public DataObject get(DataObject dataObj, DataStore store);
public boolean update(DataObject vo, Event event) throws NoTransitionException;
- boolean update(ObjectInDataStoreVO obj, Event event)
- throws NoTransitionException;
-
- boolean update(ObjectInDataStoreVO obj);
+ DataObjectInStore findObject(String uuid, DataObjectType type,
+ String dataStoreUuid, DataStoreRole role);
+ DataObjectInStore findObject(DataObject obj, DataStore store);
+ DataStore findStore(String objUuid, DataObjectType type, DataStoreRole role);
}
diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java
index 7eb4932348f..87ba1d216c5 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java
@@ -19,19 +19,25 @@ package org.apache.cloudstack.storage.datastore;
import javax.inject.Inject;
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore;
import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectType;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreRole;
-import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
+import org.apache.cloudstack.engine.subsystem.api.storage.ImageDataFactory;
+import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event;
+import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State;
+import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotDataFactory;
+import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
import org.apache.cloudstack.storage.db.ObjectInDataStoreDao;
import org.apache.cloudstack.storage.db.ObjectInDataStoreVO;
-import org.apache.cloudstack.storage.image.ImageDataFactory;
-import org.apache.cloudstack.storage.snapshot.SnapshotInfo;
-import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine;
-import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine.Event;
-import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine.State;
+import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
+import com.cloud.storage.VMTemplateStoragePoolVO;
+import com.cloud.storage.dao.VMTemplateHostDao;
+import com.cloud.storage.dao.VMTemplatePoolDao;
+import com.cloud.storage.dao.VolumeHostDao;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.db.SearchCriteria2;
import com.cloud.utils.db.SearchCriteriaService;
@@ -41,16 +47,28 @@ import com.cloud.utils.fsm.StateMachine2;
@Component
public class ObjectInDataStoreManagerImpl implements ObjectInDataStoreManager {
+ private static final Logger s_logger = Logger
+ .getLogger(ObjectInDataStoreManagerImpl.class);
@Inject
ImageDataFactory imageFactory;
@Inject
+ DataStoreManager storeMgr;
+ @Inject
VolumeDataFactory volumeFactory;
@Inject
ObjectInDataStoreDao objectDataStoreDao;
- protected StateMachine2 stateMachines;
+ @Inject
+ VolumeHostDao volumeHostDao;
+ @Inject
+ VMTemplateHostDao templateHostDao;
+ @Inject
+ VMTemplatePoolDao templatePoolDao;
+ @Inject
+ SnapshotDataFactory snapshotFactory;
+ protected StateMachine2 stateMachines;
public ObjectInDataStoreManagerImpl() {
- stateMachines = new StateMachine2();
+ stateMachines = new StateMachine2();
stateMachines.addTransition(State.Allocated, Event.CreateRequested,
State.Creating);
stateMachines.addTransition(State.Creating, Event.OperationSuccessed,
@@ -76,101 +94,122 @@ public class ObjectInDataStoreManagerImpl implements ObjectInDataStoreManager {
stateMachines.addTransition(State.Allocated, Event.CreateOnlyRequested,
State.Creating2);
stateMachines.addTransition(State.Creating2, Event.OperationFailed,
- State.Failed);
+ State.Allocated);
stateMachines.addTransition(State.Creating2, Event.OperationSuccessed,
State.Ready);
}
@Override
public DataObject create(DataObject obj, DataStore dataStore) {
-
- ObjectInDataStoreVO vo = new ObjectInDataStoreVO();
- vo.setDataStoreId(dataStore.getId());
- vo.setDataStoreRole(dataStore.getRole());
- vo.setObjectId(obj.getId());
- vo.setSize(obj.getSize());
-
- vo.setObjectType(obj.getType());
- vo = objectDataStoreDao.persist(vo);
+ if (obj.getType() == DataObjectType.TEMPLATE && dataStore.getRole() == DataStoreRole.Primary) {
+ VMTemplateStoragePoolVO vo = new VMTemplateStoragePoolVO(dataStore.getId(), obj.getId());
+ vo = templatePoolDao.persist(vo);
+ } else {
+ ObjectInDataStoreVO vo = new ObjectInDataStoreVO();
+ vo.setDataStoreRole(dataStore.getRole());
+ vo.setDataStoreUuid(dataStore.getUuid());
+ vo.setObjectType(obj.getType());
+ vo.setObjectUuid(obj.getUuid());
+ vo = objectDataStoreDao.persist(vo);
+ }
if (obj.getType() == DataObjectType.TEMPLATE) {
- return imageFactory.getTemplate(obj.getId(), dataStore);
+ return imageFactory.getTemplate(obj, dataStore);
} else if (obj.getType() == DataObjectType.VOLUME) {
- return volumeFactory.getVolume(obj.getId(), dataStore);
+ return volumeFactory.getVolume(obj, dataStore);
+ } else if (obj.getType() == DataObjectType.SNAPSHOT) {
+ return snapshotFactory.getSnapshot(obj, dataStore);
}
throw new CloudRuntimeException("unknown type");
}
-
- @Override
- public VolumeInfo create(VolumeInfo volume, DataStore dataStore) {
- ObjectInDataStoreVO vo = new ObjectInDataStoreVO();
- vo.setDataStoreId(dataStore.getId());
- vo.setDataStoreRole(dataStore.getRole());
- vo.setObjectId(volume.getId());
- vo.setObjectType(volume.getType());
- vo = objectDataStoreDao.persist(vo);
-
- return volumeFactory.getVolume(volume.getId(), dataStore);
- }
-
- @Override
- public SnapshotInfo create(SnapshotInfo snapshot, DataStore dataStore) {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public ObjectInDataStoreVO findObject(long objectId, DataObjectType type,
- long dataStoreId, DataStoreRole role) {
- SearchCriteriaService sc = SearchCriteria2
- .create(ObjectInDataStoreVO.class);
- sc.addAnd(sc.getEntity().getObjectId(), Op.EQ, objectId);
- sc.addAnd(sc.getEntity().getDataStoreId(), Op.EQ, dataStoreId);
- sc.addAnd(sc.getEntity().getObjectType(), Op.EQ, type);
- sc.addAnd(sc.getEntity().getDataStoreRole(), Op.EQ, role);
- sc.addAnd(sc.getEntity().getState(), Op.NIN,
- ObjectInDataStoreStateMachine.State.Destroyed,
- ObjectInDataStoreStateMachine.State.Failed);
- ObjectInDataStoreVO objectStoreVO = sc.find();
- return objectStoreVO;
-
- }
-
+
@Override
public boolean update(DataObject data, Event event)
throws NoTransitionException {
- ObjectInDataStoreVO obj = this.findObject(data.getId(), data.getType(),
- data.getDataStore().getId(), data.getDataStore().getRole());
+ DataObjectInStore obj = this.findObject(data, data.getDataStore());
if (obj == null) {
throw new CloudRuntimeException(
"can't find mapping in ObjectInDataStore table for: "
+ data);
}
- return this.stateMachines.transitTo(obj, event, null,
- objectDataStoreDao);
-
- }
-
- @Override
- public boolean update(ObjectInDataStoreVO obj, Event event)
- throws NoTransitionException {
- return this.stateMachines.transitTo(obj, event, null,
- objectDataStoreDao);
-
+
+ if (data.getType() == DataObjectType.TEMPLATE && data.getDataStore().getRole() == DataStoreRole.Primary) {
+ try {
+ this.stateMachines.transitTo(obj, event, null,
+ templatePoolDao);
+ } catch (NoTransitionException e) {
+ if (event == Event.CreateOnlyRequested || event == Event.OperationSuccessed) {
+ s_logger.debug("allow muliple create requests");
+ } else {
+ throw e;
+ }
+ }
+ } else {
+ this.stateMachines.transitTo(obj, event, null, objectDataStoreDao);
+ }
+ return true;
}
@Override
public DataObject get(DataObject dataObj, DataStore store) {
if (dataObj.getType() == DataObjectType.TEMPLATE) {
- return imageFactory.getTemplate(dataObj.getId(), store);
+ return imageFactory.getTemplate(dataObj, store);
} else if (dataObj.getType() == DataObjectType.VOLUME) {
- return volumeFactory.getVolume(dataObj.getId(), store);
+ return volumeFactory.getVolume(dataObj, store);
}
throw new CloudRuntimeException("unknown type");
}
@Override
- public boolean update(ObjectInDataStoreVO obj) {
- return objectDataStoreDao.update(obj.getId(), obj);
+ public DataObjectInStore findObject(DataObject obj, DataStore store) {
+ DataObjectInStore vo = null;
+ SearchCriteriaService sc = SearchCriteria2.create(ObjectInDataStoreVO.class);
+
+ if (store.getRole() == DataStoreRole.Image) {
+ sc.addAnd(sc.getEntity().getDataStoreUuid(), Op.EQ, store.getUuid());
+ sc.addAnd(sc.getEntity().getDataStoreRole(), Op.EQ, store.getRole());
+ sc.addAnd(sc.getEntity().getObjectUuid(), Op.EQ, obj.getUuid());
+ sc.addAnd(sc.getEntity().getObjectType(), Op.EQ, obj.getType());
+ vo = sc.find();
+ } else if (obj.getType() == DataObjectType.TEMPLATE && store.getRole() == DataStoreRole.Primary) {
+ vo = templatePoolDao.findByPoolTemplate(store.getId(), obj.getId());
+ } else {
+ s_logger.debug("unknown type: " + obj.getType() + " " + store.getRole());
+ throw new CloudRuntimeException("unknown type");
+ }
+ return vo;
}
+
+ @Override
+ public DataObjectInStore findObject(String uuid, DataObjectType type,
+ String dataStoreUuid, DataStoreRole role) {
+ DataObjectInStore vo = null;
+ SearchCriteriaService sc = SearchCriteria2.create(ObjectInDataStoreVO.class);
+
+ if (role == DataStoreRole.Image) {
+ sc.addAnd(sc.getEntity().getDataStoreUuid(), Op.EQ, dataStoreUuid);
+ sc.addAnd(sc.getEntity().getDataStoreRole(), Op.EQ, role);
+ sc.addAnd(sc.getEntity().getObjectUuid(), Op.EQ, uuid);
+ sc.addAnd(sc.getEntity().getObjectType(), Op.EQ, type);
+ vo = sc.find();
+ }
+ return vo;
+ }
+
+ @Override
+ public DataStore findStore(String objUuid, DataObjectType type, DataStoreRole role) {
+ DataStore store = null;
+ if (role == DataStoreRole.Image) {
+ SearchCriteriaService sc = SearchCriteria2.create(ObjectInDataStoreVO.class);
+ sc.addAnd(sc.getEntity().getDataStoreRole(), Op.EQ, role);
+ sc.addAnd(sc.getEntity().getObjectUuid(), Op.EQ, objUuid);
+ sc.addAnd(sc.getEntity().getObjectType(), Op.EQ, type);
+ ObjectInDataStoreVO vo = sc.find();
+ if (vo != null) {
+ store = this.storeMgr.getDataStore(vo.getDataStoreUuid(), vo.getDataStoreRole());
+ }
+ }
+ return store;
+ }
+
}
diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStore.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStore.java
index a6ba9bc1f60..fdaaace49d7 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStore.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStore.java
@@ -20,31 +20,19 @@ package org.apache.cloudstack.storage.datastore;
import java.util.List;
-import org.apache.cloudstack.engine.subsystem.api.storage.CommandResult;
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
-import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo;
+import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
+import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.disktype.DiskFormat;
-import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
-import org.apache.cloudstack.storage.image.TemplateInfo;
-import org.apache.cloudstack.storage.snapshot.SnapshotInfo;
-import org.apache.cloudstack.storage.volume.PrimaryDataStoreDriver;
-import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreInfo;
public interface PrimaryDataStore extends DataStore, PrimaryDataStoreInfo {
VolumeInfo getVolume(long id);
List getVolumes();
-/* void deleteVolumeAsync(VolumeInfo volume, AsyncCompletionCallback callback);
-
- void createVolumeAsync(VolumeInfo vo, VolumeDiskType diskType, AsyncCompletionCallback callback);
-
- void createVoluemFromBaseImageAsync(VolumeInfo volume, TemplateInfo templateStore, AsyncCompletionCallback callback);
- */
-
boolean exists(DataObject data);
TemplateInfo getTemplate(long templateId);
@@ -53,13 +41,4 @@ public interface PrimaryDataStore extends DataStore, PrimaryDataStoreInfo {
DiskFormat getDefaultDiskType();
-
-/* void takeSnapshot(SnapshotInfo snapshot,
- AsyncCompletionCallback callback);
-
- void revertSnapshot(SnapshotInfo snapshot,
- AsyncCompletionCallback callback);
-
- void deleteSnapshot(SnapshotInfo snapshot,
- AsyncCompletionCallback callback);*/
}
diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStoreEntityImpl.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStoreEntityImpl.java
index 0ac57f445aa..e70f803ee81 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStoreEntityImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStoreEntityImpl.java
@@ -26,8 +26,8 @@ import java.util.Map;
import org.apache.cloudstack.engine.datacenter.entity.api.StorageEntity;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo;
-import com.cloud.storage.StoragePoolStatus;
import com.cloud.storage.Storage.StoragePoolType;
+import com.cloud.storage.StoragePoolStatus;
public class PrimaryDataStoreEntityImpl implements StorageEntity {
private PrimaryDataStoreInfo dataStore;
@@ -132,7 +132,8 @@ public class PrimaryDataStoreEntityImpl implements StorageEntity {
@Override
public State getState() {
- return this.dataStore.getManagedState();
+ //return this.dataStore.getManagedState();
+ return null;
}
@Override
@@ -229,13 +230,7 @@ public class PrimaryDataStoreEntityImpl implements StorageEntity {
return null;
}
- @Override
- public String getStorageProvider() {
- // TODO Auto-generated method stub
- return null;
- }
- @Override
public String getStorageType() {
// TODO Auto-generated method stub
return null;
@@ -247,4 +242,16 @@ public class PrimaryDataStoreEntityImpl implements StorageEntity {
}
+ @Override
+ public Long getStorageProviderId() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public boolean isInMaintenance() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
}
diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStoreProviderManager.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStoreProviderManager.java
index a60ec7a6e65..d1c26e1a272 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStoreProviderManager.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStoreProviderManager.java
@@ -18,11 +18,14 @@
*/
package org.apache.cloudstack.storage.datastore;
-import org.apache.cloudstack.storage.volume.PrimaryDataStoreDriver;
+import org.apache.cloudstack.engine.subsystem.api.storage.HypervisorHostListener;
+import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreDriver;
public interface PrimaryDataStoreProviderManager {
public PrimaryDataStore getPrimaryDataStore(long dataStoreId);
+ public PrimaryDataStore getPrimaryDataStore(String uuid);
boolean registerDriver(String uuid, PrimaryDataStoreDriver driver);
+ boolean registerHostListener(String uuid, HypervisorHostListener listener);
}
diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDao.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDao.java
deleted file mode 100644
index 24a5c790688..00000000000
--- a/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDao.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.cloudstack.storage.datastore.db;
-
-import java.util.List;
-import java.util.Map;
-
-import org.apache.cloudstack.storage.datastore.DataStoreStatus;
-
-import com.cloud.utils.db.GenericDao;
-
-public interface PrimaryDataStoreDao extends GenericDao {
-
- /**
- * @param datacenterId
- * -- the id of the datacenter (availability zone)
- */
- List listByDataCenterId(long datacenterId);
-
- /**
- * @param datacenterId
- * -- the id of the datacenter (availability zone)
- */
- List listBy(long datacenterId, long podId, Long clusterId);
-
- /**
- * Set capacity of storage pool in bytes
- *
- * @param id
- * pool id.
- * @param capacity
- * capacity in bytes
- */
- void updateCapacity(long id, long capacity);
-
- /**
- * Set available bytes of storage pool in bytes
- *
- * @param id
- * pool id.
- * @param available
- * available capacity in bytes
- */
- void updateAvailable(long id, long available);
-
- PrimaryDataStoreVO persist(PrimaryDataStoreVO pool, Map details);
-
- /**
- * Find pool by name.
- *
- * @param name
- * name of pool.
- * @return the single StoragePoolVO
- */
- List findPoolByName(String name);
-
- /**
- * Find pools by the pod that matches the details.
- *
- * @param podId
- * pod id to find the pools in.
- * @param details
- * details to match. All must match for the pool to be returned.
- * @return List of StoragePoolVO
- */
- List findPoolsByDetails(long dcId, long podId, Long clusterId, Map details);
-
- List findPoolsByTags(long dcId, long podId, Long clusterId, String[] tags, Boolean shared);
-
- /**
- * Find pool by UUID.
- *
- * @param uuid
- * uuid of pool.
- * @return the single StoragePoolVO
- */
- PrimaryDataStoreVO findPoolByUUID(String uuid);
-
- List listByStorageHost(String hostFqdnOrIp);
-
- PrimaryDataStoreVO findPoolByHostPath(long dcId, Long podId, String host, String path, String uuid);
-
- List listPoolByHostPath(String host, String path);
-
- void updateDetails(long poolId, Map details);
-
- Map getDetails(long poolId);
-
- List searchForStoragePoolDetails(long poolId, String value);
-
- List findIfDuplicatePoolsExistByUUID(String uuid);
-
- List listByStatus(DataStoreStatus status);
-
- long countPoolsByStatus(DataStoreStatus... statuses);
-
- List listByStatusInZone(long dcId, DataStoreStatus status);
-
- List listPoolsByCluster(long clusterId);
-}
\ No newline at end of file
diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java
deleted file mode 100644
index faca54b569a..00000000000
--- a/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java
+++ /dev/null
@@ -1,360 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.cloudstack.storage.datastore.db;
-
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.inject.Inject;
-import javax.naming.ConfigurationException;
-
-import org.apache.cloudstack.storage.datastore.DataStoreStatus;
-import org.springframework.stereotype.Component;
-
-import com.cloud.utils.db.DB;
-import com.cloud.utils.db.GenericDaoBase;
-import com.cloud.utils.db.GenericSearchBuilder;
-import com.cloud.utils.db.SearchBuilder;
-import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.SearchCriteria.Func;
-import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
-import com.cloud.utils.exception.CloudRuntimeException;
-
-@Component
-public class PrimaryDataStoreDaoImpl extends GenericDaoBase implements PrimaryDataStoreDao {
- protected final SearchBuilder AllFieldSearch;
- protected final SearchBuilder DcPodSearch;
- protected final SearchBuilder DcPodAnyClusterSearch;
- protected final SearchBuilder DeleteLvmSearch;
- protected final GenericSearchBuilder StatusCountSearch;
-
- @Inject protected PrimaryDataStoreDetailsDao _detailsDao;
-
- private final String DetailsSqlPrefix = "SELECT storage_pool.* from storage_pool LEFT JOIN storage_pool_details ON storage_pool.id = storage_pool_details.pool_id WHERE storage_pool.removed is null and storage_pool.data_center_id = ? and (storage_pool.pod_id = ? or storage_pool.pod_id is null) and (";
- private final String DetailsSqlSuffix = ") GROUP BY storage_pool_details.pool_id HAVING COUNT(storage_pool_details.name) >= ?";
- private final String FindPoolTagDetails = "SELECT storage_pool_details.name FROM storage_pool_details WHERE pool_id = ? and value = ?";
-
- public PrimaryDataStoreDaoImpl() {
- AllFieldSearch = createSearchBuilder();
- AllFieldSearch.and("name", AllFieldSearch.entity().getName(), SearchCriteria.Op.EQ);
- AllFieldSearch.and("uuid", AllFieldSearch.entity().getUuid(), SearchCriteria.Op.EQ);
- AllFieldSearch.and("datacenterId", AllFieldSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ);
- AllFieldSearch.and("hostAddress", AllFieldSearch.entity().getHostAddress(), SearchCriteria.Op.EQ);
- AllFieldSearch.and("status", AllFieldSearch.entity().getStatus(), SearchCriteria.Op.EQ);
- AllFieldSearch.and("path", AllFieldSearch.entity().getPath(), SearchCriteria.Op.EQ);
- AllFieldSearch.and("podId", AllFieldSearch.entity().getPodId(), Op.EQ);
- AllFieldSearch.and("clusterId", AllFieldSearch.entity().getClusterId(), Op.EQ);
- AllFieldSearch.done();
-
- DcPodSearch = createSearchBuilder();
- DcPodSearch.and("datacenterId", DcPodSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ);
- DcPodSearch.and().op("nullpod", DcPodSearch.entity().getPodId(), SearchCriteria.Op.NULL);
- DcPodSearch.or("podId", DcPodSearch.entity().getPodId(), SearchCriteria.Op.EQ);
- DcPodSearch.cp();
- DcPodSearch.and().op("nullcluster", DcPodSearch.entity().getClusterId(), SearchCriteria.Op.NULL);
- DcPodSearch.or("cluster", DcPodSearch.entity().getClusterId(), SearchCriteria.Op.EQ);
- DcPodSearch.cp();
- DcPodSearch.done();
-
- DcPodAnyClusterSearch = createSearchBuilder();
- DcPodAnyClusterSearch.and("datacenterId", DcPodAnyClusterSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ);
- DcPodAnyClusterSearch.and().op("nullpod", DcPodAnyClusterSearch.entity().getPodId(), SearchCriteria.Op.NULL);
- DcPodAnyClusterSearch.or("podId", DcPodAnyClusterSearch.entity().getPodId(), SearchCriteria.Op.EQ);
- DcPodAnyClusterSearch.cp();
- DcPodAnyClusterSearch.done();
-
- DeleteLvmSearch = createSearchBuilder();
- DeleteLvmSearch.and("ids", DeleteLvmSearch.entity().getId(), SearchCriteria.Op.IN);
- DeleteLvmSearch.and().op("LVM", DeleteLvmSearch.entity().getPoolType(), SearchCriteria.Op.EQ);
- DeleteLvmSearch.or("Filesystem", DeleteLvmSearch.entity().getPoolType(), SearchCriteria.Op.EQ);
- DeleteLvmSearch.cp();
- DeleteLvmSearch.done();
-
- StatusCountSearch = createSearchBuilder(Long.class);
- StatusCountSearch.and("status", StatusCountSearch.entity().getStatus(), SearchCriteria.Op.IN);
- StatusCountSearch.select(null, Func.COUNT, null);
- StatusCountSearch.done();
- }
-
- @Override
- public List findPoolByName(String name) {
- SearchCriteria sc = AllFieldSearch.create();
- sc.setParameters("name", name);
- return listIncludingRemovedBy(sc);
- }
-
- @Override
- public PrimaryDataStoreVO findPoolByUUID(String uuid) {
- SearchCriteria sc = AllFieldSearch.create();
- sc.setParameters("uuid", uuid);
- return findOneIncludingRemovedBy(sc);
- }
-
- @Override
- public List findIfDuplicatePoolsExistByUUID(String uuid) {
- SearchCriteria sc = AllFieldSearch.create();
- sc.setParameters("uuid", uuid);
- return listBy(sc);
- }
-
- @Override
- public List listByDataCenterId(long datacenterId) {
- SearchCriteria sc = AllFieldSearch.create();
- sc.setParameters("datacenterId", datacenterId);
- return listBy(sc);
- }
-
- @Override
- public void updateAvailable(long id, long available) {
- PrimaryDataStoreVO pool = createForUpdate(id);
- pool.setAvailableBytes(available);
- update(id, pool);
- }
-
- @Override
- public void updateCapacity(long id, long capacity) {
- PrimaryDataStoreVO pool = createForUpdate(id);
- pool.setCapacityBytes(capacity);
- update(id, pool);
-
- }
-
- @Override
- public List listByStorageHost(String hostFqdnOrIp) {
- SearchCriteria sc = AllFieldSearch.create();
- sc.setParameters("hostAddress", hostFqdnOrIp);
- return listIncludingRemovedBy(sc);
- }
-
- @Override
- public List listByStatus(DataStoreStatus status) {
- SearchCriteria sc = AllFieldSearch.create();
- sc.setParameters("status", status);
- return listBy(sc);
- }
-
- @Override
- public List listByStatusInZone(long dcId, DataStoreStatus status) {
- SearchCriteria sc = AllFieldSearch.create();
- sc.setParameters("status", status);
- sc.setParameters("datacenterId", dcId);
- return listBy(sc);
- }
-
- @Override
- public PrimaryDataStoreVO findPoolByHostPath(long datacenterId, Long podId, String host, String path, String uuid) {
- SearchCriteria sc = AllFieldSearch.create();
- sc.setParameters("hostAddress", host);
- sc.setParameters("path", path);
- sc.setParameters("datacenterId", datacenterId);
- sc.setParameters("podId", podId);
- sc.setParameters("uuid", uuid);
-
- return findOneBy(sc);
- }
-
- @Override
- public List listBy(long datacenterId, long podId, Long clusterId) {
- if (clusterId != null) {
- SearchCriteria sc = DcPodSearch.create();
- sc.setParameters("datacenterId", datacenterId);
- sc.setParameters("podId", podId);
-
- sc.setParameters("cluster", clusterId);
- return listBy(sc);
- } else {
- SearchCriteria sc = DcPodAnyClusterSearch.create();
- sc.setParameters("datacenterId", datacenterId);
- sc.setParameters("podId", podId);
- return listBy(sc);
- }
- }
-
- @Override
- public List listPoolByHostPath(String host, String path) {
- SearchCriteria sc = AllFieldSearch.create();
- sc.setParameters("hostAddress", host);
- sc.setParameters("path", path);
-
- return listBy(sc);
- }
-
- public PrimaryDataStoreVO listById(Integer id) {
- SearchCriteria sc = AllFieldSearch.create();
- sc.setParameters("id", id);
-
- return findOneIncludingRemovedBy(sc);
- }
-
- @Override
- @DB
- public PrimaryDataStoreVO persist(PrimaryDataStoreVO pool, Map details) {
- Transaction txn = Transaction.currentTxn();
- txn.start();
- pool = super.persist(pool);
- if (details != null) {
- for (Map.Entry detail : details.entrySet()) {
- PrimaryDataStoreDetailVO vo = new PrimaryDataStoreDetailVO(pool.getId(), detail.getKey(), detail.getValue());
- _detailsDao.persist(vo);
- }
- }
- txn.commit();
- return pool;
- }
-
- @DB
- @Override
- public List findPoolsByDetails(long dcId, long podId, Long clusterId, Map details) {
- StringBuilder sql = new StringBuilder(DetailsSqlPrefix);
- if (clusterId != null) {
- sql.append("storage_pool.cluster_id = ? OR storage_pool.cluster_id IS NULL) AND (");
- }
- for (Map.Entry detail : details.entrySet()) {
- sql.append("((storage_pool_details.name='").append(detail.getKey()).append("') AND (storage_pool_details.value='").append(detail.getValue()).append("')) OR ");
- }
- sql.delete(sql.length() - 4, sql.length());
- sql.append(DetailsSqlSuffix);
- Transaction txn = Transaction.currentTxn();
- PreparedStatement pstmt = null;
- try {
- pstmt = txn.prepareAutoCloseStatement(sql.toString());
- int i = 1;
- pstmt.setLong(i++, dcId);
- pstmt.setLong(i++, podId);
- if (clusterId != null) {
- pstmt.setLong(i++, clusterId);
- }
- pstmt.setInt(i++, details.size());
- ResultSet rs = pstmt.executeQuery();
- List pools = new ArrayList();
- while (rs.next()) {
- pools.add(toEntityBean(rs, false));
- }
- return pools;
- } catch (SQLException e) {
- throw new CloudRuntimeException("Unable to execute " + pstmt, e);
- }
- }
-
- protected Map tagsToDetails(String[] tags) {
- Map details = new HashMap(tags.length);
- for (String tag : tags) {
- details.put(tag, "true");
- }
- return details;
- }
-
- @Override
- public List