From f9e94873d862c9a44f25a56ed2e19b609571e7b8 Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Tue, 5 Mar 2013 12:07:03 -0800 Subject: [PATCH 01/26] CLOUDSTACK-452: cloudstack UI - IPv6 - quick installer - rename fields in quick installer to be consistent with fields in zone wizard. --- ui/scripts/installWizard.js | 4 ++-- ui/scripts/ui-custom/installWizard.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ui/scripts/installWizard.js b/ui/scripts/installWizard.js index a5e13b8c640..46769fae2f0 100644 --- a/ui/scripts/installWizard.js +++ b/ui/scripts/installWizard.js @@ -56,13 +56,13 @@ }); }, - 'tooltip.addZone.dns1': function(args) { + 'tooltip.addZone.ip4dns1': function(args) { args.response.success({ text: 'message.installWizard.tooltip.addZone.dns1' }); }, - 'tooltip.addZone.dns2': function(args) { + 'tooltip.addZone.ip4dns2': function(args) { args.response.success({ text: 'message.installWizard.tooltip.addZone.dns2' }); diff --git a/ui/scripts/ui-custom/installWizard.js b/ui/scripts/ui-custom/installWizard.js index 923e4637275..86919f9fa41 100644 --- a/ui/scripts/ui-custom/installWizard.js +++ b/ui/scripts/ui-custom/installWizard.js @@ -413,8 +413,8 @@ nextStepID: 'addPodIntro', form: { name: { label: 'label.name', validation: { required: true } }, - dns1: { label: 'label.dns.1', validation: { required: true } }, - dns2: { label: 'label.dns.2' }, + ip4dns1: { label: 'label.dns.1', validation: { required: true } }, + ip4dns2: { label: 'label.dns.2' }, internaldns1: { label: 'label.internal.dns.1', validation: { required: true } }, internaldns2: { label: 'label.internal.dns.2' } } From 9f180e485a78e47eb338d91fabdeb36da61d1cad Mon Sep 17 00:00:00 2001 From: Sebastien Goasguen Date: Tue, 5 Mar 2013 16:33:23 -0500 Subject: [PATCH 02/26] Docs: CLOUDSTACk-825 cloudmonkey docs --- docs/en-US/Developers_Guide.xml | 2 +- docs/en-US/cloudmonkey.xml | 224 +++++++++++++++++++++++++++++ docs/en-US/devcloud-usage-mode.xml | 4 +- docs/en-US/tools.xml | 1 + 4 files changed, 228 insertions(+), 3 deletions(-) create mode 100644 docs/en-US/cloudmonkey.xml 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/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/devcloud-usage-mode.xml b/docs/en-US/devcloud-usage-mode.xml index bb65f904ccd..bc211ce1436 100644 --- a/docs/en-US/devcloud-usage-mode.xml +++ b/docs/en-US/devcloud-usage-mode.xml @@ -32,7 +32,7 @@ The following diagram shows the architecture of the SandBox mode. - + DevCloud.png: Schematic of the DevCloud SandBox architecture @@ -49,7 +49,7 @@ The following schematic shows the architecture of the Host-Only mode. - + DevCloud-hostonly.png: Schematic of the DevCloud host-only architecture 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 + From 7dbea68b8728e4b3a5b727a4fd69712cd8a1c468 Mon Sep 17 00:00:00 2001 From: Marcus Sorensen Date: Tue, 5 Mar 2013 15:10:53 -0700 Subject: [PATCH 03/26] Summary: Wait for VPC router nics to hotplug before assigning IPs Detail: CLOUDSTACK-1452, CLOUDSTACK-1523 - When rebooting VPC routers, ip addr assignment was inconsistent, sometimes the assignment would be attempted while router was still setting up nic device. This adds a watch for the nic to show up before attempting to add an ip to a nic. Signed-off-by: Marcus Sorensen 1362521453 -0700 --- .../debian/config/opt/cloud/bin/vpc_guestnw.sh | 12 ++++++++++++ .../debian/config/opt/cloud/bin/vpc_ipassoc.sh | 12 ++++++++++++ 2 files changed, 24 insertions(+) diff --git a/patches/systemvm/debian/config/opt/cloud/bin/vpc_guestnw.sh b/patches/systemvm/debian/config/opt/cloud/bin/vpc_guestnw.sh index c909cf796d1..31003454ec0 100755 --- a/patches/systemvm/debian/config/opt/cloud/bin/vpc_guestnw.sh +++ b/patches/systemvm/debian/config/opt/cloud/bin/vpc_guestnw.sh @@ -129,6 +129,18 @@ desetup_passwdsvcs() { } create_guest_network() { + # need to wait for eth device to appear before configuring it + timer=0 + while ! `grep -q $dev /proc/net/dev` ; do + logger -t cloud "$(basename $0):Waiting for interface $dev to appear, $timer seconds" + sleep 1; + if [ $timer -gt 15 ]; then + logger -t cloud "$(basename $0):interface $dev never appeared" + break + fi + timer=$[timer + 1] + done + logger -t cloud " $(basename $0): Create network on interface $dev, gateway $gw, network $ip/$mask " # setup ip configuration sudo ip addr add dev $dev $ip/$mask brd + diff --git a/patches/systemvm/debian/config/opt/cloud/bin/vpc_ipassoc.sh b/patches/systemvm/debian/config/opt/cloud/bin/vpc_ipassoc.sh index 53e739d02d6..f2f8a49339e 100755 --- a/patches/systemvm/debian/config/opt/cloud/bin/vpc_ipassoc.sh +++ b/patches/systemvm/debian/config/opt/cloud/bin/vpc_ipassoc.sh @@ -56,6 +56,18 @@ remove_routing() { } add_an_ip () { + # need to wait for eth device to appear before configuring it + timer=0 + while ! `grep -q $ethDev /proc/net/dev` ; do + logger -t cloud "$(basename $0):Waiting for interface $ethDev to appear, $timer seconds" + sleep 1; + if [ $timer -gt 15 ]; then + logger -t cloud "$(basename $0):interface $ethDev never appeared" + break + fi + timer=$[timer + 1] + done + logger -t cloud "$(basename $0):Adding ip $pubIp on interface $ethDev" sudo ip link show $ethDev | grep "state DOWN" > /dev/null local old_state=$? From 33757377c0a56d0e4303401c7b10ecf8d9424832 Mon Sep 17 00:00:00 2001 From: Min Chen Date: Tue, 5 Mar 2013 13:46:06 -0800 Subject: [PATCH 04/26] CLOUDSTACK-1465: We should pass array instead of a List for SearchCriteria.Op.IN as value. --- server/src/com/cloud/api/query/QueryManagerImpl.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/server/src/com/cloud/api/query/QueryManagerImpl.java b/server/src/com/cloud/api/query/QueryManagerImpl.java index 746e8cb31ff..8d8663a4010 100644 --- a/server/src/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/com/cloud/api/query/QueryManagerImpl.java @@ -1996,7 +1996,7 @@ public class QueryManagerImpl extends ManagerBase implements QueryService { } if (domainIds != null ){ - sc.setParameters("domainIdIn", domainIds); + sc.setParameters("domainIdIn", domainIds.toArray()); } if (includePublicOfferings){ @@ -2102,7 +2102,7 @@ public class QueryManagerImpl extends ManagerBase implements QueryService { domainRecord = _domainDao.findById(domainRecord.getParent()); domainIds.add(domainRecord.getId()); } - sc.addAnd("domainId", SearchCriteria.Op.IN, domainIds); + sc.addAnd("domainId", SearchCriteria.Op.IN, domainIds.toArray()); // include also public offering if no keyword, name and id specified if ( keyword == null && name == null && id == null ){ @@ -2235,7 +2235,7 @@ public class QueryManagerImpl extends ManagerBase implements QueryService { } // domainId == null (public zones) or domainId IN [all domain id up to root domain] SearchCriteria sdc = _dcJoinDao.createSearchCriteria(); - sdc.addOr("domainId", SearchCriteria.Op.IN, domainIds); + sdc.addOr("domainId", SearchCriteria.Op.IN, domainIds.toArray()); sdc.addOr("domainId", SearchCriteria.Op.NULL); sc.addAnd("domain", SearchCriteria.Op.SC, sdc); @@ -2265,7 +2265,7 @@ public class QueryManagerImpl extends ManagerBase implements QueryService { // domainId == null (public zones) or domainId IN [all domain id up to root domain] SearchCriteria sdc = _dcJoinDao.createSearchCriteria(); - sdc.addOr("domainId", SearchCriteria.Op.IN, domainIds); + sdc.addOr("domainId", SearchCriteria.Op.IN, domainIds.toArray()); sdc.addOr("domainId", SearchCriteria.Op.NULL); sc.addAnd("domain", SearchCriteria.Op.SC, sdc); @@ -2286,7 +2286,7 @@ public class QueryManagerImpl extends ManagerBase implements QueryService { return new Pair, Integer>(new ArrayList(), 0); } else{ - sc.addAnd("idIn", SearchCriteria.Op.IN, dcIds); + sc.addAnd("idIn", SearchCriteria.Op.IN, dcIds.toArray()); } } From d81f7156dca5000e0e14a4a402c4e03a86ebbe2d Mon Sep 17 00:00:00 2001 From: Marcus Sorensen Date: Tue, 5 Mar 2013 16:49:12 -0700 Subject: [PATCH 05/26] Summary: KVM - Add virtio-serial device to libvirt xml for system vms Detail: This device can be used for remotely controlling the system vms through a local socket on the host. We will attempt to replace the KVM patchdisk with it. Tested, successfully deploys VM, and if system vm has proper driver it will create a /dev/vport0p1 device within the VM. We will be updating the system VM in 4.2/5.0 and will support this. Signed-off-by: Marcus Sorensen 1362527352 -0700 --- .../resource/LibvirtComputingResource.java | 6 +++++ .../hypervisor/kvm/resource/LibvirtVMDef.java | 25 +++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java index 5a96c360616..3c848dead1e 100755 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java @@ -188,6 +188,7 @@ import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.InputDef; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.InterfaceDef; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.InterfaceDef.hostNicType; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.SerialDef; +import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.VirtioSerialDef; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.TermPolicy; import com.cloud.hypervisor.kvm.storage.KVMPhysicalDisk; import com.cloud.hypervisor.kvm.storage.KVMPhysicalDisk.PhysicalDiskFormat; @@ -3053,6 +3054,11 @@ ServerResource { SerialDef serial = new SerialDef("pty", null, (short) 0); devices.addDevice(serial); + if (vmTO.getType() != VirtualMachine.Type.User) { + VirtioSerialDef vserial = new VirtioSerialDef(vmTO.getName(), null); + devices.addDevice(vserial); + } + ConsoleDef console = new ConsoleDef("pty", null, null, (short) 0); devices.addDevice(console); diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java index 5ab37702ed6..fc3b5f6da00 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java @@ -846,6 +846,31 @@ public class LibvirtVMDef { } } + public static class VirtioSerialDef { + private final String _name; + private String _path; + + public VirtioSerialDef(String name, String path) { + _name = name; + _path = path; + } + + @Override + public String toString() { + StringBuilder virtioSerialBuilder = new StringBuilder(); + if(_path == null) { + _path = "/var/lib/libvirt/qemu"; + } + virtioSerialBuilder.append("\n"); + virtioSerialBuilder.append("\n"); + virtioSerialBuilder.append("\n"); + virtioSerialBuilder.append("
\n"); + virtioSerialBuilder.append("\n"); + return virtioSerialBuilder.toString(); + } + } + public static class GraphicDef { private final String _type; private short _port = -2; From dd721a832a408385d126975d7ab7d76b03ad8414 Mon Sep 17 00:00:00 2001 From: Sheng Yang Date: Tue, 5 Mar 2013 14:22:15 -0800 Subject: [PATCH 06/26] CLOUDSTACK-1522: Add timestamp to lock Use higher precision timestamp rather than file timestamp to find out the order of lock requester --- patches/systemvm/debian/config/root/func.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/patches/systemvm/debian/config/root/func.sh b/patches/systemvm/debian/config/root/func.sh index 86317a06843..8cc96082cc2 100644 --- a/patches/systemvm/debian/config/root/func.sh +++ b/patches/systemvm/debian/config/root/func.sh @@ -23,7 +23,8 @@ # $2 timeout seconds getLockFile() { __locked=0 - __LOCKFILE="/tmp/$1-$$.lock" + __TS=`date +%s%N` + __LOCKFILE="/tmp/$__TS-$$-$1.lock" if [ $2 ] then __TIMEOUT=$2 @@ -49,7 +50,7 @@ getLockFile() { for i in `seq 1 $(($__TIMEOUT * 10))` do - currlock=`ls -tr /tmp/$1-*.lock | head -n1` + currlock=`ls /tmp/*-$1.lock | head -n1` if [ $currlock -ef $__LOCKFILE ] then __locked=1 @@ -77,7 +78,7 @@ getLockFile() { # $1 lock filename # $2 locked(1) or not(0) releaseLockFile() { - __LOCKFILE="/tmp/$1-$$.lock" + __LOCKFILE="/tmp/*-$$-$1.lock" __locked=$2 if [ "$__locked" == "1" ] then From 7602997b90232c3b11a3dfbf69e9f9cccfe898f6 Mon Sep 17 00:00:00 2001 From: Sheng Yang Date: Tue, 5 Mar 2013 14:25:04 -0800 Subject: [PATCH 07/26] CLOUDSTACK-1521: Stop services after switch to BACKUP --- .../systemvm/debian/config/root/redundant_router/backup.sh.templ | 1 + 1 file changed, 1 insertion(+) diff --git a/patches/systemvm/debian/config/root/redundant_router/backup.sh.templ b/patches/systemvm/debian/config/root/redundant_router/backup.sh.templ index 03111b557a5..7a1bd44584a 100644 --- a/patches/systemvm/debian/config/root/redundant_router/backup.sh.templ +++ b/patches/systemvm/debian/config/root/redundant_router/backup.sh.templ @@ -28,6 +28,7 @@ fi echo To backup called >> [RROUTER_LOG] [RROUTER_BIN_PATH]/disable_pubip.sh >> [RROUTER_LOG] 2>&1 echo Disable public ip $? >> [RROUTER_LOG] +[RROUTER_BIN_PATH]/services.sh stop >> [RROUTER_LOG] 2>&1 [RROUTER_BIN_PATH]/primary-backup.sh backup >> [RROUTER_LOG] 2>&1 echo Switch conntrackd mode backup $? >> [RROUTER_LOG] echo Status: BACKUP >> [RROUTER_LOG] From 72e6fd6e8d6c846057362cd390851d0f70b757c8 Mon Sep 17 00:00:00 2001 From: Kelven Yang Date: Thu, 21 Feb 2013 14:32:47 -0800 Subject: [PATCH 08/26] CLOUDSTACK-1362: Put a workaround fix to set excutable attribute of injectkys.sh at runtime --- .../cloud/server/ConfigurationServerImpl.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/server/src/com/cloud/server/ConfigurationServerImpl.java b/server/src/com/cloud/server/ConfigurationServerImpl.java index 9566285051d..c5ae1e2a436 100755 --- a/server/src/com/cloud/server/ConfigurationServerImpl.java +++ b/server/src/com/cloud/server/ConfigurationServerImpl.java @@ -151,6 +151,8 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio @DB public void persistDefaultValues() throws InternalErrorException { + fixupScriptFileAttribute(); + // Create system user and admin user saveUser(); @@ -703,6 +705,24 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio } } + + private void fixupScriptFileAttribute() { + // TODO : this is a hacking fix to workaround that executable bit is not preserved in WAR package + String scriptPath = Script.findScript("", "scripts/vm/systemvm/injectkeys.sh"); + if(scriptPath != null) { + File file = new File(scriptPath); + if(!file.canExecute()) { + s_logger.info("Some of the shell script files may not have executable bit set. Fixup..."); + + String cmd = "chmod ugo+x " + scriptPath; + s_logger.info("Executing " + cmd); + String result = Script.runSimpleBashScript(cmd); + if (result != null) { + s_logger.warn("Failed to fixup shell script executable bits " + result); + } + } + } + } private void updateKeyPairsOnDisk(String homeDir) { File keyDir = new File(homeDir + "/.ssh"); From 333dd810d21807702787ef744e2814ee4c03262a Mon Sep 17 00:00:00 2001 From: Kelven Yang Date: Sun, 24 Feb 2013 13:28:39 -0800 Subject: [PATCH 09/26] CLOUDSTACK-1339: Using Sping interface injection pattern to avoid using CGLIB proxying mode. Spring with CGLIB proxying will concflict with CGLIB usage in CloudStack DB code, CloudStack CGLIB usage can cause Spring to lose tack of its proxied object and therefore creates a massive amount of objects in memory --- client/tomcatconf/applicationContext.xml.in | 7 +- .../entity/api/db/dao/VMEntityDaoImpl.java | 8 +- .../api/db/dao/VMReservationDaoImpl.java | 2 +- .../orchestration/CloudOrchestrator.java | 7 +- .../test/DirectAgentManagerSimpleImpl.java | 6 + .../storage/image/db/ImageDataDaoImpl.java | 975 ++++++++++++++++++ .../storage/volume/db/VolumeDao2Impl.java | 5 +- server/src/com/cloud/agent/AgentManager.java | 2 + .../cloud/agent/manager/AgentManagerImpl.java | 6 +- .../com/cloud/agent/manager/AgentMonitor.java | 9 +- .../agent/manager/AgentMonitorService.java | 28 + server/src/com/cloud/api/ApiDispatcher.java | 4 +- server/src/com/cloud/api/ApiServer.java | 34 +- .../src/com/cloud/api/ApiServerService.java | 37 + server/src/com/cloud/api/ApiServlet.java | 2 +- .../ConfigurationManagerImpl.java | 3 +- .../dao/ConfigurationDaoImpl.java | 9 - .../dao/ResourceCountDaoImpl.java | 9 +- .../com/cloud/dc/dao/DataCenterDaoImpl.java | 10 +- .../cloud/dc/dao/DataCenterIpAddressDao.java | 6 + .../dao/DataCenterLinkLocalIpAddressDao.java | 16 + .../DataCenterLinkLocalIpAddressDaoImpl.java | 2 +- .../com/cloud/dc/dao/DataCenterVnetDao.java | 38 + .../cloud/dc/dao/DataCenterVnetDaoImpl.java | 2 +- server/src/com/cloud/dc/dao/PodVlanDao.java | 30 + .../src/com/cloud/dc/dao/PodVlanDaoImpl.java | 2 +- .../com/cloud/network/NetworkServiceImpl.java | 15 +- .../network/dao/FirewallRulesDaoImpl.java | 5 +- .../cloud/network/dao/IPAddressDaoImpl.java | 6 +- .../network/dao/LoadBalancerDaoImpl.java | 2 +- .../cloud/network/dao/NetworkAccountDao.java | 22 + .../network/dao/NetworkAccountDaoImpl.java | 2 +- .../com/cloud/network/dao/NetworkDaoImpl.java | 20 +- .../com/cloud/network/dao/NetworkOpDao.java | 26 + .../cloud/network/dao/NetworkOpDaoImpl.java | 2 +- .../network/dao/PhysicalNetworkDaoImpl.java | 2 +- .../cloud/network/dao/RouterNetworkDao.java | 26 + .../network/dao/RouterNetworkDaoImpl.java | 2 +- .../dao/Site2SiteVpnConnectionDaoImpl.java | 4 +- .../dao/Site2SiteVpnGatewayDaoImpl.java | 2 +- .../rules/dao/PortForwardingRulesDaoImpl.java | 3 +- .../security/dao/SecurityGroupDaoImpl.java | 3 +- .../network/vpc/dao/StaticRouteDaoImpl.java | 3 +- .../com/cloud/network/vpc/dao/VpcDaoImpl.java | 7 +- .../cloud/projects/dao/ProjectDaoImpl.java | 3 +- .../cloud/servlet/CloudStartupServlet.java | 17 +- .../cloud/storage/dao/SnapshotDaoImpl.java | 12 +- .../com/cloud/storage/dao/VolumeDaoImpl.java | 4 +- .../com/cloud/vm/dao/DomainRouterDaoImpl.java | 12 +- .../src/com/cloud/vm/dao/UserVmDaoImpl.java | 3 +- .../com/cloud/agent/MockAgentManagerImpl.java | 6 + .../utils/component/ComponentContext.java | 68 +- utils/src/com/cloud/utils/db/GenericDao.java | 2 + .../com/cloud/utils/db/GenericDaoBase.java | 46 +- .../src/com/cloud/utils/db/QueryBuilder.java | 20 +- .../utils/db/TransactionContextBuilder.java | 12 +- 56 files changed, 1439 insertions(+), 177 deletions(-) create mode 100644 engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataDaoImpl.java create mode 100644 server/src/com/cloud/agent/manager/AgentMonitorService.java create mode 100644 server/src/com/cloud/api/ApiServerService.java create mode 100644 server/src/com/cloud/dc/dao/DataCenterLinkLocalIpAddressDao.java create mode 100644 server/src/com/cloud/dc/dao/DataCenterVnetDao.java create mode 100644 server/src/com/cloud/dc/dao/PodVlanDao.java create mode 100644 server/src/com/cloud/network/dao/NetworkAccountDao.java create mode 100644 server/src/com/cloud/network/dao/NetworkOpDao.java create mode 100644 server/src/com/cloud/network/dao/RouterNetworkDao.java 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/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMEntityDaoImpl.java b/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMEntityDaoImpl.java index 7d80e8a69ab..3082d21c1ee 100644 --- a/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMEntityDaoImpl.java +++ b/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMEntityDaoImpl.java @@ -49,13 +49,13 @@ public class VMEntityDaoImpl extends GenericDaoBase implements public static final Logger s_logger = Logger.getLogger(VMEntityDaoImpl.class); - @Inject protected VMReservationDaoImpl _vmReservationDao; + @Inject protected VMReservationDao _vmReservationDao; - @Inject protected VMComputeTagDaoImpl _vmComputeTagDao; + @Inject protected VMComputeTagDao _vmComputeTagDao; - @Inject protected VMRootDiskTagDaoImpl _vmRootDiskTagsDao; + @Inject protected VMRootDiskTagDao _vmRootDiskTagsDao; - @Inject protected VMNetworkMapDaoImpl _vmNetworkMapDao; + @Inject protected VMNetworkMapDao _vmNetworkMapDao; @Inject diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMReservationDaoImpl.java b/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMReservationDaoImpl.java index 66261dd09b6..dc346cc2423 100644 --- a/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMReservationDaoImpl.java +++ b/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMReservationDaoImpl.java @@ -43,7 +43,7 @@ public class VMReservationDaoImpl extends GenericDaoBase protected SearchBuilder VmIdSearch; - @Inject protected VolumeReservationDaoImpl _volumeReservationDao; + @Inject protected VolumeReservationDao _volumeReservationDao; public VMReservationDaoImpl() { } diff --git a/engine/orchestration/src/org/apache/cloudstack/platform/orchestration/CloudOrchestrator.java b/engine/orchestration/src/org/apache/cloudstack/platform/orchestration/CloudOrchestrator.java index f47325ae511..6085c61cd34 100755 --- a/engine/orchestration/src/org/apache/cloudstack/platform/orchestration/CloudOrchestrator.java +++ b/engine/orchestration/src/org/apache/cloudstack/platform/orchestration/CloudOrchestrator.java @@ -84,9 +84,6 @@ public class CloudOrchestrator implements OrchestrationService { @Inject protected DiskOfferingDao _diskOfferingDao = null; - @Inject - protected VirtualMachineEntityFactory _vmEntityFactory; - @Inject protected NetworkDao _networkDao; @@ -230,7 +227,9 @@ public class CloudOrchestrator implements OrchestrationService { // VirtualMachineEntityImpl vmEntity = new VirtualMachineEntityImpl(id, owner, hostName, displayName, cpu, speed, memory, computeTags, rootDiskTags, networks, vmEntityManager); VirtualMachineEntityImpl vmEntity = null; try { - vmEntity = _vmEntityFactory.getObject(); + vmEntity = VirtualMachineEntityImpl.class.newInstance(); + vmEntity = ComponentContext.inject(vmEntity); + } catch (Exception e) { // add error handling here } diff --git a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/DirectAgentManagerSimpleImpl.java b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/DirectAgentManagerSimpleImpl.java index 81db645938c..575bc8e2ba2 100644 --- a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/DirectAgentManagerSimpleImpl.java +++ b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/DirectAgentManagerSimpleImpl.java @@ -240,4 +240,10 @@ public class DirectAgentManagerSimpleImpl extends ManagerBase implements AgentMa return null; } + @Override + public void disconnectWithInvestigation(long hostId, Event event) { + // TODO Auto-generated method stub + + } + } diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataDaoImpl.java new file mode 100644 index 00000000000..f43f18d0e6d --- /dev/null +++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataDaoImpl.java @@ -0,0 +1,975 @@ +/* + * 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.image.db; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashSet; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.inject.Inject; +import javax.naming.ConfigurationException; + +import org.apache.cloudstack.storage.image.TemplateEvent; +import org.apache.cloudstack.storage.image.TemplateState; +import org.apache.cloudstack.storage.image.format.ISO; +import org.apache.log4j.Logger; +import org.springframework.stereotype.Component; + +import com.cloud.configuration.dao.ConfigurationDao; +import com.cloud.dc.dao.DataCenterDao; +import com.cloud.domain.DomainVO; +import com.cloud.domain.dao.DomainDao; +import com.cloud.host.Host; +import com.cloud.host.HostVO; +import com.cloud.host.dao.HostDao; +import com.cloud.hypervisor.Hypervisor.HypervisorType; +import com.cloud.projects.Project.ListProjectResourcesCriteria; +import com.cloud.server.ResourceTag.TaggedResourceType; +import com.cloud.storage.Storage; +import com.cloud.storage.Storage.TemplateType; +import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; +import com.cloud.storage.VMTemplateZoneVO; +import com.cloud.storage.dao.VMTemplateDaoImpl; +import com.cloud.storage.dao.VMTemplateDetailsDao; +import com.cloud.storage.dao.VMTemplateZoneDao; +import com.cloud.tags.ResourceTagVO; +import com.cloud.tags.dao.ResourceTagDao; +import com.cloud.tags.dao.ResourceTagsDaoImpl; +import com.cloud.template.VirtualMachineTemplate.TemplateFilter; +import com.cloud.user.Account; +import com.cloud.utils.Pair; +import com.cloud.utils.db.DB; +import com.cloud.utils.db.Filter; +import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.GenericSearchBuilder; +import com.cloud.utils.db.JoinBuilder; +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.db.UpdateBuilder; +import com.cloud.utils.exception.CloudRuntimeException; + +@Component +public class ImageDataDaoImpl extends GenericDaoBase implements ImageDataDao { + private static final Logger s_logger = Logger.getLogger(VMTemplateDaoImpl.class); + + @Inject + VMTemplateZoneDao templateZoneDao; + @Inject + VMTemplateDetailsDao templateDetailsDao; + + @Inject + ConfigurationDao configDao; + @Inject + HostDao hostDao; + @Inject + DomainDao domainDao; + @Inject + DataCenterDao dcDao; + + private final String SELECT_TEMPLATE_HOST_REF = "SELECT t.id, h.data_center_id, t.unique_name, t.name, t.public, t.featured, t.type, t.hvm, t.bits, t.url, t.format, t.created, t.account_id, " + + "t.checksum, t.display_text, t.enable_password, t.guest_os_id, t.bootable, t.prepopulate, t.cross_zones, t.hypervisor_type FROM vm_template t"; + + private final String SELECT_TEMPLATE_ZONE_REF = "SELECT t.id, tzr.zone_id, t.unique_name, t.name, t.public, t.featured, t.type, t.hvm, t.bits, t.url, t.format, t.created, t.account_id, " + + "t.checksum, t.display_text, t.enable_password, t.guest_os_id, t.bootable, t.prepopulate, t.cross_zones, t.hypervisor_type FROM vm_template t INNER JOIN template_zone_ref tzr on (t.id = tzr.template_id) "; + + private final String SELECT_TEMPLATE_SWIFT_REF = "SELECT t.id, t.unique_name, t.name, t.public, t.featured, t.type, t.hvm, t.bits, t.url, t.format, t.created, t.account_id, " + + "t.checksum, t.display_text, t.enable_password, t.guest_os_id, t.bootable, t.prepopulate, t.cross_zones, t.hypervisor_type FROM vm_template t"; + protected SearchBuilder TemplateNameSearch; + protected SearchBuilder UniqueNameSearch; + protected SearchBuilder tmpltTypeSearch; + protected SearchBuilder tmpltTypeHyperSearch; + protected SearchBuilder tmpltTypeHyperSearch2; + + protected SearchBuilder AccountIdSearch; + protected SearchBuilder NameSearch; + protected SearchBuilder TmpltsInZoneSearch; + private SearchBuilder PublicSearch; + private SearchBuilder NameAccountIdSearch; + private SearchBuilder PublicIsoSearch; + private SearchBuilder UserIsoSearch; + private GenericSearchBuilder CountTemplatesByAccount; + private SearchBuilder updateStateSearch; + + @Inject + ResourceTagDao _tagsDao = null; + private String routerTmpltName; + private String consoleProxyTmpltName; + + protected ImageDataDaoImpl() { + } + + @Override + public List listByPublic() { + SearchCriteria sc = PublicSearch.create(); + sc.setParameters("public", 1); + return listBy(sc); + } + + @Override + public ImageDataVO findByName(String templateName) { + SearchCriteria sc = UniqueNameSearch.create(); + sc.setParameters("uniqueName", templateName); + return findOneIncludingRemovedBy(sc); + } + + @Override + public ImageDataVO findByTemplateName(String templateName) { + SearchCriteria sc = NameSearch.create(); + sc.setParameters("name", templateName); + return findOneIncludingRemovedBy(sc); + } + + @Override + public List publicIsoSearch(Boolean bootable, boolean listRemoved, Map tags) { + + SearchBuilder sb = null; + if (tags == null || tags.isEmpty()) { + sb = PublicIsoSearch; + } else { + sb = createSearchBuilder(); + sb.and("public", sb.entity().isPublicTemplate(), SearchCriteria.Op.EQ); + sb.and("format", sb.entity().getFormat(), SearchCriteria.Op.EQ); + sb.and("type", sb.entity().getTemplateType(), SearchCriteria.Op.EQ); + sb.and("bootable", sb.entity().isBootable(), SearchCriteria.Op.EQ); + sb.and("removed", sb.entity().getRemoved(), SearchCriteria.Op.EQ); + + SearchBuilder tagSearch = _tagsDao.createSearchBuilder(); + for (int count = 0; count < tags.size(); count++) { + tagSearch.or().op("key" + String.valueOf(count), tagSearch.entity().getKey(), SearchCriteria.Op.EQ); + tagSearch.and("value" + String.valueOf(count), tagSearch.entity().getValue(), SearchCriteria.Op.EQ); + tagSearch.cp(); + } + tagSearch.and("resourceType", tagSearch.entity().getResourceType(), SearchCriteria.Op.EQ); + sb.groupBy(sb.entity().getId()); + sb.join("tagSearch", tagSearch, sb.entity().getId(), tagSearch.entity().getResourceId(), JoinBuilder.JoinType.INNER); + } + + SearchCriteria sc = sb.create(); + + sc.setParameters("public", 1); + sc.setParameters("format", "ISO"); + sc.setParameters("type", TemplateType.PERHOST.toString()); + if (bootable != null) { + sc.setParameters("bootable", bootable); + } + + if (!listRemoved) { + sc.setParameters("removed", (Object) null); + } + + if (tags != null && !tags.isEmpty()) { + int count = 0; + sc.setJoinParameters("tagSearch", "resourceType", TaggedResourceType.ISO.toString()); + for (String key : tags.keySet()) { + sc.setJoinParameters("tagSearch", "key" + String.valueOf(count), key); + sc.setJoinParameters("tagSearch", "value" + String.valueOf(count), tags.get(key)); + count++; + } + } + + return listBy(sc); + } + + @Override + public List userIsoSearch(boolean listRemoved) { + + SearchBuilder sb = null; + sb = UserIsoSearch; + SearchCriteria sc = sb.create(); + + sc.setParameters("format", Storage.ImageFormat.ISO); + sc.setParameters("type", TemplateType.USER.toString()); + + if (!listRemoved) { + sc.setParameters("removed", (Object) null); + } + + return listBy(sc); + } + + @Override + public List listAllSystemVMTemplates() { + SearchCriteria sc = tmpltTypeSearch.create(); + sc.setParameters("templateType", Storage.TemplateType.SYSTEM); + + Filter filter = new Filter(ImageDataVO.class, "id", false, null, null); + return listBy(sc, filter); + } + + @Override + public List listPrivateTemplatesByHost(Long hostId) { + + String sql = "select * from template_host_ref as thr INNER JOIN vm_template as t ON t.id=thr.template_id " + + "where thr.host_id=? and t.public=0 and t.featured=0 and t.type='USER' and t.removed is NULL"; + + List l = new ArrayList(); + + Transaction txn = Transaction.currentTxn(); + + PreparedStatement pstmt = null; + try { + pstmt = txn.prepareAutoCloseStatement(sql); + pstmt.setLong(1, hostId); + ResultSet rs = pstmt.executeQuery(); + while (rs.next()) { + l.add(rs.getLong(1)); + } + } catch (SQLException e) { + } catch (Throwable e) { + } + return l; + } + + @Override + public List listReadyTemplates() { + SearchCriteria sc = createSearchCriteria(); + sc.addAnd("ready", SearchCriteria.Op.EQ, true); + sc.addAnd("format", SearchCriteria.Op.NEQ, Storage.ImageFormat.ISO); + return listIncludingRemovedBy(sc); + } + + @Override + public List findIsosByIdAndPath(Long domainId, Long accountId, String path) { + SearchCriteria sc = createSearchCriteria(); + sc.addAnd("iso", SearchCriteria.Op.EQ, true); + if (domainId != null) { + sc.addAnd("domainId", SearchCriteria.Op.EQ, domainId); + } + if (accountId != null) { + sc.addAnd("accountId", SearchCriteria.Op.EQ, accountId); + } + if (path != null) { + sc.addAnd("path", SearchCriteria.Op.EQ, path); + } + return listIncludingRemovedBy(sc); + } + + @Override + public List listByAccountId(long accountId) { + SearchCriteria sc = AccountIdSearch.create(); + sc.setParameters("accountId", accountId); + return listBy(sc); + } + + @Override + public List listByHypervisorType(List hyperTypes) { + SearchCriteria sc = createSearchCriteria(); + hyperTypes.add(HypervisorType.None); + sc.addAnd("hypervisorType", SearchCriteria.Op.IN, hyperTypes.toArray()); + return listBy(sc); + } + + @Override + public boolean configure(String name, Map params) throws ConfigurationException { + boolean result = super.configure(name, params); + + PublicSearch = createSearchBuilder(); + PublicSearch.and("public", PublicSearch.entity().isPublicTemplate(), SearchCriteria.Op.EQ); + + routerTmpltName = (String) params.get("routing.uniquename"); + + s_logger.debug("Found parameter routing unique name " + routerTmpltName); + if (routerTmpltName == null) { + routerTmpltName = "routing"; + } + + consoleProxyTmpltName = (String) params.get("consoleproxy.uniquename"); + if (consoleProxyTmpltName == null) { + consoleProxyTmpltName = "routing"; + } + if (s_logger.isDebugEnabled()) { + s_logger.debug("Use console proxy template : " + consoleProxyTmpltName); + } + + UniqueNameSearch = createSearchBuilder(); + UniqueNameSearch.and("uniqueName", UniqueNameSearch.entity().getUniqueName(), SearchCriteria.Op.EQ); + NameSearch = createSearchBuilder(); + NameSearch.and("name", NameSearch.entity().getName(), SearchCriteria.Op.EQ); + + NameAccountIdSearch = createSearchBuilder(); + NameAccountIdSearch.and("name", NameAccountIdSearch.entity().getName(), SearchCriteria.Op.EQ); + NameAccountIdSearch.and("accountId", NameAccountIdSearch.entity().getAccountId(), SearchCriteria.Op.EQ); + + PublicIsoSearch = createSearchBuilder(); + PublicIsoSearch.and("public", PublicIsoSearch.entity().isPublicTemplate(), SearchCriteria.Op.EQ); + PublicIsoSearch.and("format", PublicIsoSearch.entity().getFormat(), SearchCriteria.Op.EQ); + PublicIsoSearch.and("type", PublicIsoSearch.entity().getTemplateType(), SearchCriteria.Op.EQ); + PublicIsoSearch.and("bootable", PublicIsoSearch.entity().isBootable(), SearchCriteria.Op.EQ); + PublicIsoSearch.and("removed", PublicIsoSearch.entity().getRemoved(), SearchCriteria.Op.EQ); + + UserIsoSearch = createSearchBuilder(); + UserIsoSearch.and("format", UserIsoSearch.entity().getFormat(), SearchCriteria.Op.EQ); + UserIsoSearch.and("type", UserIsoSearch.entity().getTemplateType(), SearchCriteria.Op.EQ); + UserIsoSearch.and("removed", UserIsoSearch.entity().getRemoved(), SearchCriteria.Op.EQ); + + tmpltTypeHyperSearch = createSearchBuilder(); + tmpltTypeHyperSearch.and("templateType", tmpltTypeHyperSearch.entity().getTemplateType(), SearchCriteria.Op.EQ); + SearchBuilder hostHyperSearch = hostDao.createSearchBuilder(); + hostHyperSearch.and("type", hostHyperSearch.entity().getType(), SearchCriteria.Op.EQ); + hostHyperSearch.and("zoneId", hostHyperSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); + hostHyperSearch.groupBy(hostHyperSearch.entity().getHypervisorType()); + + tmpltTypeHyperSearch.join("tmplHyper", hostHyperSearch, hostHyperSearch.entity().getHypervisorType(), tmpltTypeHyperSearch.entity().getHypervisorType(), JoinBuilder.JoinType.INNER); + hostHyperSearch.done(); + tmpltTypeHyperSearch.done(); + + tmpltTypeHyperSearch2 = createSearchBuilder(); + tmpltTypeHyperSearch2.and("templateType", tmpltTypeHyperSearch2.entity().getTemplateType(), SearchCriteria.Op.EQ); + tmpltTypeHyperSearch2.and("hypervisorType", tmpltTypeHyperSearch2.entity().getHypervisorType(), SearchCriteria.Op.EQ); + + tmpltTypeSearch = createSearchBuilder(); + tmpltTypeSearch.and("removed", tmpltTypeSearch.entity().getRemoved(), SearchCriteria.Op.NULL); + tmpltTypeSearch.and("templateType", tmpltTypeSearch.entity().getTemplateType(), SearchCriteria.Op.EQ); + + AccountIdSearch = createSearchBuilder(); + AccountIdSearch.and("accountId", AccountIdSearch.entity().getAccountId(), SearchCriteria.Op.EQ); + AccountIdSearch.and("publicTemplate", AccountIdSearch.entity().isPublicTemplate(), SearchCriteria.Op.EQ); + AccountIdSearch.done(); + + SearchBuilder tmpltZoneSearch = templateZoneDao.createSearchBuilder(); + tmpltZoneSearch.and("removed", tmpltZoneSearch.entity().getRemoved(), SearchCriteria.Op.NULL); + tmpltZoneSearch.and("zoneId", tmpltZoneSearch.entity().getZoneId(), SearchCriteria.Op.EQ); + + TmpltsInZoneSearch = createSearchBuilder(); + TmpltsInZoneSearch.and("removed", TmpltsInZoneSearch.entity().getRemoved(), SearchCriteria.Op.NULL); + TmpltsInZoneSearch.and().op("avoidtype", TmpltsInZoneSearch.entity().getTemplateType(), SearchCriteria.Op.NEQ); + TmpltsInZoneSearch.or("templateType", TmpltsInZoneSearch.entity().getTemplateType(), SearchCriteria.Op.NULL); + TmpltsInZoneSearch.cp(); + TmpltsInZoneSearch.join("tmpltzone", tmpltZoneSearch, tmpltZoneSearch.entity().getTemplateId(), TmpltsInZoneSearch.entity().getId(), JoinBuilder.JoinType.INNER); + tmpltZoneSearch.done(); + TmpltsInZoneSearch.done(); + + CountTemplatesByAccount = createSearchBuilder(Long.class); + CountTemplatesByAccount.select(null, Func.COUNT, null); + CountTemplatesByAccount.and("account", CountTemplatesByAccount.entity().getAccountId(), SearchCriteria.Op.EQ); + CountTemplatesByAccount.and("removed", CountTemplatesByAccount.entity().getRemoved(), SearchCriteria.Op.NULL); + CountTemplatesByAccount.done(); + + updateStateSearch = this.createSearchBuilder(); + updateStateSearch.and("id", updateStateSearch.entity().getId(), Op.EQ); + updateStateSearch.and("state", updateStateSearch.entity().getState(), Op.EQ); + updateStateSearch.and("updatedCount", updateStateSearch.entity().getUpdatedCount(), Op.EQ); + updateStateSearch.done(); + return result; + } + + @Override + public String getRoutingTemplateUniqueName() { + return routerTmpltName; + } + + @Override + public Set> searchSwiftTemplates(String name, String keyword, TemplateFilter templateFilter, boolean isIso, List hypers, Boolean bootable, DomainVO domain, + Long pageSize, Long startIndex, Long zoneId, HypervisorType hyperType, boolean onlyReady, boolean showDomr, List permittedAccounts, Account caller, Map tags) { + + StringBuilder builder = new StringBuilder(); + if (!permittedAccounts.isEmpty()) { + for (Account permittedAccount : permittedAccounts) { + builder.append(permittedAccount.getAccountId() + ","); + } + } + + String permittedAccountsStr = builder.toString(); + + if (permittedAccountsStr.length() > 0) { + // chop the "," off + permittedAccountsStr = permittedAccountsStr.substring(0, permittedAccountsStr.length() - 1); + } + + Transaction txn = Transaction.currentTxn(); + txn.start(); + + Set> templateZonePairList = new HashSet>(); + PreparedStatement pstmt = null; + ResultSet rs = null; + String sql = SELECT_TEMPLATE_SWIFT_REF; + try { + String joinClause = ""; + String whereClause = " WHERE t.removed IS NULL"; + + if (isIso) { + whereClause += " AND t.format = 'ISO'"; + if (!hyperType.equals(HypervisorType.None)) { + joinClause = " INNER JOIN guest_os guestOS on (guestOS.id = t.guest_os_id) INNER JOIN guest_os_hypervisor goh on ( goh.guest_os_id = guestOS.id) "; + whereClause += " AND goh.hypervisor_type = '" + hyperType.toString() + "'"; + } + } else { + whereClause += " AND t.format <> 'ISO'"; + if (hypers.isEmpty()) { + return templateZonePairList; + } else { + StringBuilder relatedHypers = new StringBuilder(); + for (HypervisorType hyper : hypers) { + relatedHypers.append("'"); + relatedHypers.append(hyper.toString()); + relatedHypers.append("'"); + relatedHypers.append(","); + } + relatedHypers.setLength(relatedHypers.length() - 1); + whereClause += " AND t.hypervisor_type IN (" + relatedHypers + ")"; + } + } + joinClause += " INNER JOIN template_swift_ref tsr on (t.id = tsr.template_id)"; + if (keyword != null) { + whereClause += " AND t.name LIKE \"%" + keyword + "%\""; + } else if (name != null) { + whereClause += " AND t.name LIKE \"%" + name + "%\""; + } + + if (bootable != null) { + whereClause += " AND t.bootable = " + bootable; + } + + if (!showDomr) { + whereClause += " AND t.type != '" + Storage.TemplateType.SYSTEM.toString() + "'"; + } + + if (templateFilter == TemplateFilter.featured) { + whereClause += " AND t.public = 1 AND t.featured = 1"; + } else if ((templateFilter == TemplateFilter.self || templateFilter == TemplateFilter.selfexecutable) && caller.getType() != Account.ACCOUNT_TYPE_ADMIN) { + if (caller.getType() == Account.ACCOUNT_TYPE_DOMAIN_ADMIN || caller.getType() == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN) { + joinClause += " INNER JOIN account a on (t.account_id = a.id) INNER JOIN domain d on (a.domain_id = d.id)"; + whereClause += " AND d.path LIKE '" + domain.getPath() + "%'"; + } else { + whereClause += " AND t.account_id IN (" + permittedAccountsStr + ")"; + } + } else if (templateFilter == TemplateFilter.sharedexecutable && caller.getType() != Account.ACCOUNT_TYPE_ADMIN) { + if (caller.getType() == Account.ACCOUNT_TYPE_NORMAL) { + joinClause += " LEFT JOIN launch_permission lp ON t.id = lp.template_id WHERE" + " (t.account_id IN (" + permittedAccountsStr + ") OR" + " lp.account_id IN (" + + permittedAccountsStr + "))"; + } else { + joinClause += " INNER JOIN account a on (t.account_id = a.id) "; + } + } else if (templateFilter == TemplateFilter.executable && !permittedAccounts.isEmpty()) { + whereClause += " AND (t.public = 1 OR t.account_id IN (" + permittedAccountsStr + "))"; + } else if (templateFilter == TemplateFilter.community) { + whereClause += " AND t.public = 1 AND t.featured = 0"; + } else if (templateFilter == TemplateFilter.all && caller.getType() == Account.ACCOUNT_TYPE_ADMIN) { + } else if (caller.getType() != Account.ACCOUNT_TYPE_ADMIN) { + return templateZonePairList; + } + + sql += joinClause + whereClause + getOrderByLimit(pageSize, startIndex); + pstmt = txn.prepareStatement(sql); + rs = pstmt.executeQuery(); + while (rs.next()) { + Pair templateZonePair = new Pair(rs.getLong(1), -1L); + templateZonePairList.add(templateZonePair); + } + + } catch (Exception e) { + s_logger.warn("Error listing templates", e); + } finally { + try { + if (rs != null) { + rs.close(); + } + if (pstmt != null) { + pstmt.close(); + } + txn.commit(); + } catch (SQLException sqle) { + s_logger.warn("Error in cleaning up", sqle); + } + } + + return templateZonePairList; + } + + @Override + public Set> searchTemplates(String name, String keyword, TemplateFilter templateFilter, boolean isIso, List hypers, Boolean bootable, DomainVO domain, + Long pageSize, Long startIndex, Long zoneId, HypervisorType hyperType, boolean onlyReady, boolean showDomr, List permittedAccounts, Account caller, + ListProjectResourcesCriteria listProjectResourcesCriteria, Map tags) { + StringBuilder builder = new StringBuilder(); + if (!permittedAccounts.isEmpty()) { + for (Account permittedAccount : permittedAccounts) { + builder.append(permittedAccount.getAccountId() + ","); + } + } + + String permittedAccountsStr = builder.toString(); + + if (permittedAccountsStr.length() > 0) { + // chop the "," off + permittedAccountsStr = permittedAccountsStr.substring(0, permittedAccountsStr.length() - 1); + } + + Transaction txn = Transaction.currentTxn(); + txn.start(); + + /* Use LinkedHashSet here to guarantee iteration order */ + Set> templateZonePairList = new LinkedHashSet>(); + PreparedStatement pstmt = null; + ResultSet rs = null; + StringBuilder relatedDomainIds = new StringBuilder(); + String sql = SELECT_TEMPLATE_ZONE_REF; + String groupByClause = ""; + try { + // short accountType; + // String accountId = null; + String guestOSJoin = ""; + StringBuilder templateHostRefJoin = new StringBuilder(); + String dataCenterJoin = "", lpjoin = ""; + String tagsJoin = ""; + + if (isIso && !hyperType.equals(HypervisorType.None)) { + guestOSJoin = " INNER JOIN guest_os guestOS on (guestOS.id = t.guest_os_id) INNER JOIN guest_os_hypervisor goh on ( goh.guest_os_id = guestOS.id) "; + } + if (onlyReady) { + templateHostRefJoin.append(" INNER JOIN template_host_ref thr on (t.id = thr.template_id) INNER JOIN host h on (thr.host_id = h.id)"); + sql = SELECT_TEMPLATE_HOST_REF; + groupByClause = " GROUP BY t.id, h.data_center_id "; + } + if ((templateFilter == TemplateFilter.featured) || (templateFilter == TemplateFilter.community)) { + dataCenterJoin = " INNER JOIN data_center dc on (h.data_center_id = dc.id)"; + } + + if (templateFilter == TemplateFilter.sharedexecutable) { + lpjoin = " INNER JOIN launch_permission lp ON t.id = lp.template_id "; + } + + if (tags != null && !tags.isEmpty()) { + tagsJoin = " INNER JOIN resource_tags r ON t.id = r.resource_id "; + } + + sql += guestOSJoin + templateHostRefJoin + dataCenterJoin + lpjoin + tagsJoin; + String whereClause = ""; + + // All joins have to be made before we start setting the condition + // settings + if ((listProjectResourcesCriteria == ListProjectResourcesCriteria.SkipProjectResources || (!permittedAccounts.isEmpty() && !(templateFilter == TemplateFilter.community || templateFilter == TemplateFilter.featured))) + && !(caller.getType() != Account.ACCOUNT_TYPE_NORMAL && templateFilter == TemplateFilter.all)) { + whereClause += " INNER JOIN account a on (t.account_id = a.id)"; + if ((templateFilter == TemplateFilter.self || templateFilter == TemplateFilter.selfexecutable) + && (caller.getType() == Account.ACCOUNT_TYPE_DOMAIN_ADMIN || caller.getType() == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN)) { + whereClause += " INNER JOIN domain d on (a.domain_id = d.id) WHERE d.path LIKE '" + domain.getPath() + "%'"; + if (listProjectResourcesCriteria == ListProjectResourcesCriteria.SkipProjectResources) { + whereClause += " AND a.type != " + Account.ACCOUNT_TYPE_PROJECT; + } + } else if (listProjectResourcesCriteria == ListProjectResourcesCriteria.SkipProjectResources) { + whereClause += " WHERE a.type != " + Account.ACCOUNT_TYPE_PROJECT; + } + } + + if (!permittedAccounts.isEmpty()) { + for (Account account : permittedAccounts) { + // accountType = account.getType(); + // accountId = Long.toString(account.getId()); + DomainVO accountDomain = domainDao.findById(account.getDomainId()); + + // get all parent domain ID's all the way till root domain + DomainVO domainTreeNode = accountDomain; + while (true) { + relatedDomainIds.append(domainTreeNode.getId()); + relatedDomainIds.append(","); + if (domainTreeNode.getParent() != null) { + domainTreeNode = domainDao.findById(domainTreeNode.getParent()); + } else { + break; + } + } + + // get all child domain ID's + if (isAdmin(account.getType())) { + List allChildDomains = domainDao.findAllChildren(accountDomain.getPath(), accountDomain.getId()); + for (DomainVO childDomain : allChildDomains) { + relatedDomainIds.append(childDomain.getId()); + relatedDomainIds.append(","); + } + } + relatedDomainIds.setLength(relatedDomainIds.length() - 1); + } + } + + String attr = " AND "; + if (whereClause.endsWith(" WHERE ")) { + attr += " WHERE "; + } + + if (!isIso) { + if (hypers.isEmpty()) { + return templateZonePairList; + } else { + StringBuilder relatedHypers = new StringBuilder(); + for (HypervisorType hyper : hypers) { + relatedHypers.append("'"); + relatedHypers.append(hyper.toString()); + relatedHypers.append("'"); + relatedHypers.append(","); + } + relatedHypers.setLength(relatedHypers.length() - 1); + whereClause += attr + " t.hypervisor_type IN (" + relatedHypers + ")"; + } + } + + if (!permittedAccounts.isEmpty() && !(templateFilter == TemplateFilter.featured || templateFilter == TemplateFilter.community || templateFilter == TemplateFilter.executable) + && !isAdmin(caller.getType())) { + whereClause += attr + "t.account_id IN (" + permittedAccountsStr + ")"; + } + + if (templateFilter == TemplateFilter.featured) { + whereClause += attr + "t.public = 1 AND t.featured = 1"; + if (!permittedAccounts.isEmpty()) { + whereClause += attr + "(dc.domain_id IN (" + relatedDomainIds + ") OR dc.domain_id is NULL)"; + } + } else if (templateFilter == TemplateFilter.self || templateFilter == TemplateFilter.selfexecutable) { + whereClause += " AND t.account_id IN (" + permittedAccountsStr + ")"; + } else if (templateFilter == TemplateFilter.sharedexecutable) { + whereClause += " AND " + " (t.account_id IN (" + permittedAccountsStr + ") OR" + " lp.account_id IN (" + permittedAccountsStr + "))"; + } else if (templateFilter == TemplateFilter.executable && !permittedAccounts.isEmpty()) { + whereClause += attr + "(t.public = 1 OR t.account_id IN (" + permittedAccountsStr + "))"; + } else if (templateFilter == TemplateFilter.community) { + whereClause += attr + "t.public = 1 AND t.featured = 0"; + if (!permittedAccounts.isEmpty()) { + whereClause += attr + "(dc.domain_id IN (" + relatedDomainIds + ") OR dc.domain_id is NULL)"; + } + } else if (caller.getType() != Account.ACCOUNT_TYPE_ADMIN && !isIso) { + return templateZonePairList; + } + + if (tags != null && !tags.isEmpty()) { + whereClause += " AND ("; + boolean first = true; + for (String key : tags.keySet()) { + if (!first) { + whereClause += " OR "; + } + whereClause += "(r.key=\"" + key + "\" and r.value=\"" + tags.get(key) + "\")"; + first = false; + } + whereClause += ")"; + } + + if (whereClause.equals("")) { + whereClause += " WHERE "; + } else if (!whereClause.equals(" WHERE ")) { + whereClause += " AND "; + } + + sql += whereClause + getExtrasWhere(templateFilter, name, keyword, isIso, bootable, hyperType, zoneId, onlyReady, showDomr) + groupByClause + getOrderByLimit(pageSize, startIndex); + + pstmt = txn.prepareStatement(sql); + rs = pstmt.executeQuery(); + + while (rs.next()) { + Pair templateZonePair = new Pair(rs.getLong(1), rs.getLong(2)); + templateZonePairList.add(templateZonePair); + } + // for now, defaulting pageSize to a large val if null; may need to + // revisit post 2.2RC2 + if (isIso && + templateZonePairList.size() < (pageSize != null ? pageSize : 500) && + templateFilter != TemplateFilter.community && + !(templateFilter == TemplateFilter.self) /* TODO: Fix this! && !BaseCmd.isRootAdmin(caller.getType())*/) { // evaluates + // to + // true + // If + // root + // admin + // and + // filter=self + + List publicIsos = publicIsoSearch(bootable, false, tags); + List userIsos = userIsoSearch(false); + + // Listing the ISOs according to the page size.Restricting the + // total no. of ISOs on a page + // to be less than or equal to the pageSize parameter + + int i = 0; + + if (startIndex > userIsos.size()) { + i = (int) (startIndex - userIsos.size()); + } + + for (; i < publicIsos.size(); i++) { + if (templateZonePairList.size() >= pageSize) { + break; + } else { + if (keyword != null && publicIsos.get(i).getName().contains(keyword)) { + templateZonePairList.add(new Pair(publicIsos.get(i).getId(), null)); + continue; + } else if (name != null && publicIsos.get(i).getName().contains(name)) { + templateZonePairList.add(new Pair(publicIsos.get(i).getId(), null)); + continue; + } else if (keyword == null && name == null) { + templateZonePairList.add(new Pair(publicIsos.get(i).getId(), null)); + } + } + } + } + } catch (Exception e) { + s_logger.warn("Error listing templates", e); + } finally { + try { + if (rs != null) { + rs.close(); + } + if (pstmt != null) { + pstmt.close(); + } + txn.commit(); + } catch (SQLException sqle) { + s_logger.warn("Error in cleaning up", sqle); + } + } + + return templateZonePairList; + } + + private String getExtrasWhere(TemplateFilter templateFilter, String name, String keyword, boolean isIso, Boolean bootable, HypervisorType hyperType, Long zoneId, boolean onlyReady, + boolean showDomr) { + String sql = ""; + if (keyword != null) { + sql += " t.name LIKE \"%" + keyword + "%\" AND"; + } else if (name != null) { + sql += " t.name LIKE \"%" + name + "%\" AND"; + } + + if (isIso) { + sql += " t.format = 'ISO'"; + if (!hyperType.equals(HypervisorType.None)) { + sql += " AND goh.hypervisor_type = '" + hyperType.toString() + "'"; + } + } else { + sql += " t.format <> 'ISO'"; + if (!hyperType.equals(HypervisorType.None)) { + sql += " AND t.hypervisor_type = '" + hyperType.toString() + "'"; + } + } + + if (bootable != null) { + sql += " AND t.bootable = " + bootable; + } + + if (onlyReady) { + sql += " AND thr.download_state = '" + Status.DOWNLOADED.toString() + "'" + " AND thr.destroyed=0 "; + if (zoneId != null) { + sql += " AND h.data_center_id = " + zoneId; + } + } else if (zoneId != null) { + sql += " AND tzr.zone_id = " + zoneId + " AND tzr.removed is null"; + } else { + sql += " AND tzr.removed is null "; + } + if (!showDomr) { + sql += " AND t.type != '" + Storage.TemplateType.SYSTEM.toString() + "'"; + } + + sql += " AND t.removed IS NULL"; + + return sql; + } + + private String getOrderByLimit(Long pageSize, Long startIndex) { + Boolean isAscending = Boolean.parseBoolean(configDao.getValue("sortkey.algorithm")); + isAscending = (isAscending == null ? true : isAscending); + + String sql; + if (isAscending) { + sql = " ORDER BY t.sort_key ASC"; + } else { + sql = " ORDER BY t.sort_key DESC"; + } + + if ((pageSize != null) && (startIndex != null)) { + sql += " LIMIT " + startIndex.toString() + "," + pageSize.toString(); + } + return sql; + } + + @Override + @DB + public long addTemplateToZone(ImageDataVO tmplt, long zoneId) { + Transaction txn = Transaction.currentTxn(); + txn.start(); + ImageDataVO tmplt2 = findById(tmplt.getId()); + if (tmplt2 == null) { + if (persist(tmplt) == null) { + throw new CloudRuntimeException("Failed to persist the template " + tmplt); + } + if (tmplt.getDetails() != null) { + templateDetailsDao.persist(tmplt.getId(), tmplt.getDetails()); + } + } + VMTemplateZoneVO tmpltZoneVO = templateZoneDao.findByZoneTemplate(zoneId, tmplt.getId()); + if (tmpltZoneVO == null) { + tmpltZoneVO = new VMTemplateZoneVO(zoneId, tmplt.getId(), new Date()); + templateZoneDao.persist(tmpltZoneVO); + } else { + tmpltZoneVO.setRemoved(null); + tmpltZoneVO.setLastUpdated(new Date()); + templateZoneDao.update(tmpltZoneVO.getId(), tmpltZoneVO); + } + txn.commit(); + + return tmplt.getId(); + } + + @Override + @DB + public List listAllInZone(long dataCenterId) { + SearchCriteria sc = TmpltsInZoneSearch.create(); + sc.setParameters("avoidtype", TemplateType.PERHOST.toString()); + sc.setJoinParameters("tmpltzone", "zoneId", dataCenterId); + return listBy(sc); + } + + @Override + public List listDefaultBuiltinTemplates() { + SearchCriteria sc = tmpltTypeSearch.create(); + sc.setParameters("templateType", Storage.TemplateType.BUILTIN); + return listBy(sc); + } + + @Override + public ImageDataVO findSystemVMTemplate(long zoneId) { + SearchCriteria sc = tmpltTypeHyperSearch.create(); + sc.setParameters("templateType", Storage.TemplateType.SYSTEM); + sc.setJoinParameters("tmplHyper", "type", Host.Type.Routing); + sc.setJoinParameters("tmplHyper", "zoneId", zoneId); + + // order by descending order of id and select the first (this is going + // to be the latest) + List tmplts = listBy(sc, new Filter(ImageDataVO.class, "id", false, null, 1l)); + + if (tmplts.size() > 0) { + return tmplts.get(0); + } else { + return null; + } + } + + @Override + public ImageDataVO findSystemVMTemplate(long zoneId, HypervisorType hType) { + SearchCriteria sc = tmpltTypeHyperSearch.create(); + sc.setParameters("templateType", Storage.TemplateType.SYSTEM); + sc.setJoinParameters("tmplHyper", "type", Host.Type.Routing); + sc.setJoinParameters("tmplHyper", "zoneId", zoneId); + + // order by descending order of id + List tmplts = listBy(sc, new Filter(ImageDataVO.class, "id", false, null, null)); + + for (ImageDataVO tmplt : tmplts) { + if (tmplt.getHypervisorType() == hType) { + return tmplt; + } + } + if (tmplts.size() > 0 && hType == HypervisorType.Any) { + return tmplts.get(0); + } + return null; + } + + @Override + public ImageDataVO findRoutingTemplate(HypervisorType hType) { + SearchCriteria sc = tmpltTypeHyperSearch2.create(); + sc.setParameters("templateType", Storage.TemplateType.SYSTEM); + sc.setParameters("hypervisorType", hType); + + // order by descending order of id and select the first (this is going + // to be the latest) + List tmplts = listBy(sc, new Filter(ImageDataVO.class, "id", false, null, 1l)); + + if (tmplts.size() > 0) { + return tmplts.get(0); + } else { + return null; + } + } + + @Override + public Long countTemplatesForAccount(long accountId) { + SearchCriteria sc = CountTemplatesByAccount.create(); + sc.setParameters("account", accountId); + return customSearch(sc, null).get(0); + } + + @Override + @DB + public boolean remove(Long id) { + Transaction txn = Transaction.currentTxn(); + txn.start(); + ImageDataVO template = createForUpdate(); + template.setRemoved(new Date()); + + ImageDataVO vo = findById(id); + if (vo != null) { + if (vo.getFormat().equalsIgnoreCase(new ISO().toString())) { + _tagsDao.removeByIdAndType(id, TaggedResourceType.ISO); + } else { + _tagsDao.removeByIdAndType(id, TaggedResourceType.Template); + } + } + + boolean result = update(id, template); + txn.commit(); + return result; + } + + private boolean isAdmin(short accountType) { + return ((accountType == Account.ACCOUNT_TYPE_ADMIN) || (accountType == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN) || (accountType == Account.ACCOUNT_TYPE_DOMAIN_ADMIN) || (accountType == Account.ACCOUNT_TYPE_READ_ONLY_ADMIN)); + } + + @Override + public boolean updateState(TemplateState currentState, TemplateEvent event, + TemplateState nextState, ImageDataVO vo, Object data) { + Long oldUpdated = vo.getUpdatedCount(); + Date oldUpdatedTime = vo.getUpdated(); + + + SearchCriteria sc = updateStateSearch.create(); + sc.setParameters("id", vo.getId()); + sc.setParameters("state", currentState); + sc.setParameters("updatedCount", vo.getUpdatedCount()); + + vo.incrUpdatedCount(); + + UpdateBuilder builder = getUpdateBuilder(vo); + builder.set(vo, "state", nextState); + builder.set(vo, "updated", new Date()); + + int rows = update((ImageDataVO) vo, sc); + if (rows == 0 && s_logger.isDebugEnabled()) { + ImageDataVO dbVol = findByIdIncludingRemoved(vo.getId()); + if (dbVol != null) { + StringBuilder str = new StringBuilder("Unable to update ").append(vo.toString()); + str.append(": DB Data={id=").append(dbVol.getId()).append("; state=").append(dbVol.getState()).append("; updatecount=").append(dbVol.getUpdatedCount()).append(";updatedTime=") + .append(dbVol.getUpdated()); + str.append(": New Data={id=").append(vo.getId()).append("; state=").append(nextState).append("; event=").append(event).append("; updatecount=").append(vo.getUpdatedCount()) + .append("; updatedTime=").append(vo.getUpdated()); + str.append(": stale Data={id=").append(vo.getId()).append("; state=").append(currentState).append("; event=").append(event).append("; updatecount=").append(oldUpdated) + .append("; updatedTime=").append(oldUpdatedTime); + } else { + s_logger.debug("Unable to update objectIndatastore: id=" + vo.getId() + ", as there is no such object exists in the database anymore"); + } + } + return rows > 0; + } +} \ No newline at end of file diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/db/VolumeDao2Impl.java b/engine/storage/src/org/apache/cloudstack/storage/volume/db/VolumeDao2Impl.java index 1e12498dff6..d8497e2f3da 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/volume/db/VolumeDao2Impl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/volume/db/VolumeDao2Impl.java @@ -24,6 +24,7 @@ import java.util.Date; import java.util.List; import javax.ejb.Local; +import javax.inject.Inject; import org.apache.cloudstack.engine.subsystem.api.storage.type.RootDisk; import org.apache.cloudstack.engine.subsystem.api.storage.type.VolumeType; @@ -36,6 +37,7 @@ import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.server.ResourceTag.TaggedResourceType; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.Volume; +import com.cloud.tags.dao.ResourceTagDao; import com.cloud.tags.dao.ResourceTagsDaoImpl; import com.cloud.utils.Pair; @@ -63,8 +65,7 @@ public class VolumeDao2Impl extends GenericDaoBase implements Vo protected final SearchBuilder InstanceStatesSearch; protected final SearchBuilder AllFieldsSearch; protected GenericSearchBuilder CountByAccount; - //ResourceTagsDaoImpl _tagsDao = ComponentLocator.inject(ResourceTagsDaoImpl.class); - ResourceTagsDaoImpl _tagsDao = null; + @Inject ResourceTagDao _tagsDao = null; protected static final String SELECT_VM_SQL = "SELECT DISTINCT instance_id from volumes v where v.host_id = ? and v.mirror_state = ?"; protected static final String SELECT_HYPERTYPE_FROM_VOLUME = "SELECT c.hypervisor_type from volumes v, storage_pool s, cluster c where v.pool_id = s.id and s.cluster_id = c.id and v.id = ?"; diff --git a/server/src/com/cloud/agent/AgentManager.java b/server/src/com/cloud/agent/AgentManager.java index 0053851a6fe..6c300ea76fa 100755 --- a/server/src/com/cloud/agent/AgentManager.java +++ b/server/src/com/cloud/agent/AgentManager.java @@ -156,4 +156,6 @@ public interface AgentManager extends Manager { boolean reconnect(long hostId); Answer sendToSSVM(Long dcId, final Command cmd); + + void disconnectWithInvestigation(final long hostId, final Status.Event event); } diff --git a/server/src/com/cloud/agent/manager/AgentManagerImpl.java b/server/src/com/cloud/agent/manager/AgentManagerImpl.java index 3b5d433f1be..5342a4f71f9 100755 --- a/server/src/com/cloud/agent/manager/AgentManagerImpl.java +++ b/server/src/com/cloud/agent/manager/AgentManagerImpl.java @@ -218,7 +218,7 @@ public class AgentManagerImpl extends ManagerBase implements AgentManager, Handl protected int _pingInterval; protected long _pingTimeout; - @Inject protected AgentMonitor _monitor; + @Inject protected AgentMonitorService _monitor; protected ExecutorService _executor; protected ThreadPoolExecutor _connectExecutor; @@ -668,7 +668,7 @@ public class AgentManagerImpl extends ManagerBase implements AgentManager, Handl public boolean start() { startDirectlyConnectedHosts(); if (_monitor != null) { - _monitor.start(); + _monitor.startMonitoring(); } if (_connection != null) { _connection.start(); @@ -1455,7 +1455,7 @@ public class AgentManagerImpl extends ManagerBase implements AgentManager, Handl _executor.submit(new DisconnectTask(attache, event, false)); } - protected void disconnectWithInvestigation(AgentAttache attache, final Status.Event event) { + public void disconnectWithInvestigation(AgentAttache attache, final Status.Event event) { _executor.submit(new DisconnectTask(attache, event, true)); } diff --git a/server/src/com/cloud/agent/manager/AgentMonitor.java b/server/src/com/cloud/agent/manager/AgentMonitor.java index c019a76eaa8..ae539fd9188 100755 --- a/server/src/com/cloud/agent/manager/AgentMonitor.java +++ b/server/src/com/cloud/agent/manager/AgentMonitor.java @@ -26,6 +26,7 @@ import javax.inject.Inject; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; +import com.cloud.agent.AgentManager; import com.cloud.agent.Listener; import com.cloud.agent.api.AgentControlAnswer; import com.cloud.agent.api.AgentControlCommand; @@ -56,13 +57,13 @@ import com.cloud.vm.VMInstanceVO; import com.cloud.vm.dao.VMInstanceDao; @Component -public class AgentMonitor extends Thread implements Listener { +public class AgentMonitor extends Thread implements AgentMonitorService { private static Logger s_logger = Logger.getLogger(AgentMonitor.class); private static Logger status_Logger = Logger.getLogger(Status.class); private long _pingTimeout; @Inject private HostDao _hostDao; private boolean _stop; - @Inject private AgentManagerImpl _agentMgr; + @Inject private AgentManager _agentMgr; @Inject private VMInstanceDao _vmDao; @Inject private DataCenterDao _dcDao = null; @Inject private HostPodDao _podDao = null; @@ -296,4 +297,8 @@ public class AgentMonitor extends Thread implements Listener { return -1; } + public void startMonitoring() { + start(); + } } + diff --git a/server/src/com/cloud/agent/manager/AgentMonitorService.java b/server/src/com/cloud/agent/manager/AgentMonitorService.java new file mode 100644 index 00000000000..cdb0c1e2cbb --- /dev/null +++ b/server/src/com/cloud/agent/manager/AgentMonitorService.java @@ -0,0 +1,28 @@ +// 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.manager; + +import com.cloud.agent.Listener; + +public interface AgentMonitorService extends Listener { + + public Boolean isAgentBehindOnPing(long agentId); + public Long getAgentPingTime(long agentId); + public void pingBy(long agentId); + public void signalStop(); + public void startMonitoring(); +} diff --git a/server/src/com/cloud/api/ApiDispatcher.java b/server/src/com/cloud/api/ApiDispatcher.java index cf86afc7fe6..552dea568ad 100755 --- a/server/src/com/cloud/api/ApiDispatcher.java +++ b/server/src/com/cloud/api/ApiDispatcher.java @@ -135,7 +135,9 @@ public class ApiDispatcher { processParameters(cmd, params); UserContext ctx = UserContext.current(); ctx.setAccountId(cmd.getEntityOwnerId()); - if (cmd instanceof BaseAsyncCmd) { + + BaseCmd realCmdObj = ComponentContext.getTargetObject(cmd); + if (realCmdObj instanceof BaseAsyncCmd) { BaseAsyncCmd asyncCmd = (BaseAsyncCmd) cmd; String startEventId = params.get("ctxStartEventId"); diff --git a/server/src/com/cloud/api/ApiServer.java b/server/src/com/cloud/api/ApiServer.java index 8b14d8268c8..deb5e12f9fc 100755 --- a/server/src/com/cloud/api/ApiServer.java +++ b/server/src/com/cloud/api/ApiServer.java @@ -142,7 +142,7 @@ import com.cloud.utils.db.Transaction; import com.cloud.utils.exception.CloudRuntimeException; @Component -public class ApiServer implements HttpRequestHandler { +public class ApiServer implements HttpRequestHandler, ApiServerService { private static final Logger s_logger = Logger.getLogger(ApiServer.class.getName()); private static final Logger s_accessLogger = Logger.getLogger("apiserver." + ApiServer.class.getName()); @@ -500,22 +500,22 @@ public class ApiServer implements HttpRequestHandler { // if the command is of the listXXXCommand, we will need to also return the // the job id and status if possible // For those listXXXCommand which we have already created DB views, this step is not needed since async job is joined in their db views. - if (cmdObj instanceof BaseListCmd && !(cmdObj instanceof ListVMsCmd) && !(cmdObj instanceof ListRoutersCmd) - && !(cmdObj instanceof ListSecurityGroupsCmd) - && !(cmdObj instanceof ListTagsCmd) - && !(cmdObj instanceof ListEventsCmd) - && !(cmdObj instanceof ListVMGroupsCmd) - && !(cmdObj instanceof ListProjectsCmd) - && !(cmdObj instanceof ListProjectAccountsCmd) - && !(cmdObj instanceof ListProjectInvitationsCmd) - && !(cmdObj instanceof ListHostsCmd) - && !(cmdObj instanceof ListVolumesCmd) - && !(cmdObj instanceof ListUsersCmd) - && !(cmdObj instanceof ListAccountsCmd) - && !(cmdObj instanceof ListStoragePoolsCmd) - && !(cmdObj instanceof ListDiskOfferingsCmd) - && !(cmdObj instanceof ListServiceOfferingsCmd) - && !(cmdObj instanceof ListZonesByCmd) + if (realCmdObj instanceof BaseListCmd && !(realCmdObj instanceof ListVMsCmd) && !(realCmdObj instanceof ListRoutersCmd) + && !(realCmdObj instanceof ListSecurityGroupsCmd) + && !(realCmdObj instanceof ListTagsCmd) + && !(realCmdObj instanceof ListEventsCmd) + && !(realCmdObj instanceof ListVMGroupsCmd) + && !(realCmdObj instanceof ListProjectsCmd) + && !(realCmdObj instanceof ListProjectAccountsCmd) + && !(realCmdObj instanceof ListProjectInvitationsCmd) + && !(realCmdObj instanceof ListHostsCmd) + && !(realCmdObj instanceof ListVolumesCmd) + && !(realCmdObj instanceof ListUsersCmd) + && !(realCmdObj instanceof ListAccountsCmd) + && !(realCmdObj instanceof ListStoragePoolsCmd) + && !(realCmdObj instanceof ListDiskOfferingsCmd) + && !(realCmdObj instanceof ListServiceOfferingsCmd) + && !(realCmdObj instanceof ListZonesByCmd) ) { buildAsyncListResponse((BaseListCmd) cmdObj, caller); } diff --git a/server/src/com/cloud/api/ApiServerService.java b/server/src/com/cloud/api/ApiServerService.java new file mode 100644 index 00000000000..12d8b52fa83 --- /dev/null +++ b/server/src/com/cloud/api/ApiServerService.java @@ -0,0 +1,37 @@ +// 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.api; + +import java.util.Map; + +import javax.servlet.http.HttpSession; + +import org.apache.cloudstack.api.ServerApiException; +import com.cloud.exception.CloudAuthenticationException; + +public interface ApiServerService { + public boolean verifyRequest(Map requestParameters, Long userId) throws ServerApiException; + public Long fetchDomainId(String domainUUID); + public void loginUser(HttpSession session, String username, String password, Long domainId, String domainPath, String loginIpAddress ,Map requestParameters) throws CloudAuthenticationException; + public void logoutUser(long userId); + public boolean verifyUser(Long userId); + + public String getSerializedApiError(int errorCode, String errorText, Map apiCommandParams, String responseType); + public String getSerializedApiError(ServerApiException ex, Map apiCommandParams, String responseType); + + public String handleRequest(Map params, String responseType, StringBuffer auditTrailSb) throws ServerApiException; +} diff --git a/server/src/com/cloud/api/ApiServlet.java b/server/src/com/cloud/api/ApiServlet.java index e5c1db78c7b..03bfb5f2d49 100755 --- a/server/src/com/cloud/api/ApiServlet.java +++ b/server/src/com/cloud/api/ApiServlet.java @@ -50,7 +50,7 @@ public class ApiServlet extends HttpServlet { public static final Logger s_logger = Logger.getLogger(ApiServlet.class.getName()); private static final Logger s_accessLogger = Logger.getLogger("apiserver." + ApiServer.class.getName()); - @Inject ApiServer _apiServer; + @Inject ApiServerService _apiServer; @Inject AccountService _accountMgr; public ApiServlet() { diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index 44d9e0db335..62f4fd5d8dd 100755 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -86,6 +86,7 @@ import com.cloud.dc.dao.AccountVlanMapDao; import com.cloud.dc.dao.ClusterDao; import com.cloud.dc.dao.DataCenterDao; import com.cloud.dc.dao.DataCenterIpAddressDao; +import com.cloud.dc.dao.DataCenterLinkLocalIpAddressDao; import com.cloud.dc.dao.DataCenterLinkLocalIpAddressDaoImpl; import com.cloud.dc.dao.HostPodDao; import com.cloud.dc.dao.PodVlanMapDao; @@ -249,7 +250,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati VpcManager _vpcMgr; // FIXME - why don't we have interface for DataCenterLinkLocalIpAddressDao? - @Inject protected DataCenterLinkLocalIpAddressDaoImpl _LinkLocalIpAllocDao; + @Inject protected DataCenterLinkLocalIpAddressDao _LinkLocalIpAllocDao; private int _maxVolumeSizeInGb; private long _defaultPageSize; diff --git a/server/src/com/cloud/configuration/dao/ConfigurationDaoImpl.java b/server/src/com/cloud/configuration/dao/ConfigurationDaoImpl.java index 68106f7dd6a..fe5f5aee810 100644 --- a/server/src/com/cloud/configuration/dao/ConfigurationDaoImpl.java +++ b/server/src/com/cloud/configuration/dao/ConfigurationDaoImpl.java @@ -65,15 +65,6 @@ public class ConfigurationDaoImpl extends GenericDaoBase private final SearchBuilder AccountSearch; private final SearchBuilder DomainSearch; - //protected final DomainDaoImpl _domainDao = ComponentLocator.inject(DomainDaoImpl.class); - //protected final AccountDaoImpl _accountDao = ComponentLocator.inject(AccountDaoImpl.class); - - @Inject protected DomainDaoImpl _domainDao; - @Inject protected AccountDaoImpl _accountDao; + @Inject protected DomainDao _domainDao; + @Inject protected AccountDao _accountDao; public ResourceCountDaoImpl() { TypeSearch = createSearchBuilder(); diff --git a/server/src/com/cloud/dc/dao/DataCenterDaoImpl.java b/server/src/com/cloud/dc/dao/DataCenterDaoImpl.java index a63bbd3c068..2a6c2ecb252 100755 --- a/server/src/com/cloud/dc/dao/DataCenterDaoImpl.java +++ b/server/src/com/cloud/dc/dao/DataCenterDaoImpl.java @@ -63,11 +63,11 @@ public class DataCenterDaoImpl extends GenericDaoBase implem protected SearchBuilder DisabledZonesSearch; protected SearchBuilder TokenSearch; - @Inject protected DataCenterIpAddressDaoImpl _ipAllocDao = null; - @Inject protected DataCenterLinkLocalIpAddressDaoImpl _LinkLocalIpAllocDao = null; - @Inject protected DataCenterVnetDaoImpl _vnetAllocDao = null; - @Inject protected PodVlanDaoImpl _podVlanAllocDao = null; - @Inject protected DcDetailsDaoImpl _detailsDao = null; + @Inject protected DataCenterIpAddressDao _ipAllocDao = null; + @Inject protected DataCenterLinkLocalIpAddressDao _LinkLocalIpAllocDao = null; + @Inject protected DataCenterVnetDao _vnetAllocDao = null; + @Inject protected PodVlanDao _podVlanAllocDao = null; + @Inject protected DcDetailsDao _detailsDao = null; protected long _prefix; protected Random _rand = new Random(System.currentTimeMillis()); diff --git a/server/src/com/cloud/dc/dao/DataCenterIpAddressDao.java b/server/src/com/cloud/dc/dao/DataCenterIpAddressDao.java index bf7884466d0..7a19b245d2c 100644 --- a/server/src/com/cloud/dc/dao/DataCenterIpAddressDao.java +++ b/server/src/com/cloud/dc/dao/DataCenterIpAddressDao.java @@ -23,6 +23,12 @@ import com.cloud.utils.db.GenericDao; public interface DataCenterIpAddressDao extends GenericDao { + public DataCenterIpAddressVO takeIpAddress(long dcId, long podId, long instanceId, String reservationId); + public DataCenterIpAddressVO takeDataCenterIpAddress(long dcId, String reservationId); + public void addIpRange(long dcId, long podId, String start, String end); + public void releaseIpAddress(String ipAddress, long dcId, Long instanceId); + public void releaseIpAddress(long nicId, String reservationId); + boolean mark(long dcId, long podId, String ip); List listByPodIdDcIdIpAddress(long podId, long dcId, String ipAddress); List listByPodIdDcId(long podId, long dcId); diff --git a/server/src/com/cloud/dc/dao/DataCenterLinkLocalIpAddressDao.java b/server/src/com/cloud/dc/dao/DataCenterLinkLocalIpAddressDao.java new file mode 100644 index 00000000000..64fabfbadb4 --- /dev/null +++ b/server/src/com/cloud/dc/dao/DataCenterLinkLocalIpAddressDao.java @@ -0,0 +1,16 @@ +package com.cloud.dc.dao; + +import java.util.List; + +import com.cloud.dc.DataCenterLinkLocalIpAddressVO; +import com.cloud.utils.db.GenericDao; + +public interface DataCenterLinkLocalIpAddressDao extends GenericDao{ + public DataCenterLinkLocalIpAddressVO takeIpAddress(long dcId, long podId, long instanceId, String reservationId); + public boolean deleteIpAddressByPod(long podId); + public void addIpRange(long dcId, long podId, String start, String end); + public void releaseIpAddress(String ipAddress, long dcId, long instanceId); + public void releaseIpAddress(long nicId, String reservationId); + public List listByPodIdDcId(long podId, long dcId); + public int countIPs(long podId, long dcId, boolean onlyCountAllocated); +} diff --git a/server/src/com/cloud/dc/dao/DataCenterLinkLocalIpAddressDaoImpl.java b/server/src/com/cloud/dc/dao/DataCenterLinkLocalIpAddressDaoImpl.java index 6456ebfd5c5..b52e3733a3f 100644 --- a/server/src/com/cloud/dc/dao/DataCenterLinkLocalIpAddressDaoImpl.java +++ b/server/src/com/cloud/dc/dao/DataCenterLinkLocalIpAddressDaoImpl.java @@ -42,7 +42,7 @@ import com.cloud.utils.net.NetUtils; @Component @Local(value={DataCenterLinkLocalIpAddressDaoImpl.class}) @DB(txn=false) -public class DataCenterLinkLocalIpAddressDaoImpl extends GenericDaoBase implements GenericDao { +public class DataCenterLinkLocalIpAddressDaoImpl extends GenericDaoBase implements DataCenterLinkLocalIpAddressDao { private static final Logger s_logger = Logger.getLogger(DataCenterLinkLocalIpAddressDaoImpl.class); private final SearchBuilder AllFieldsSearch; diff --git a/server/src/com/cloud/dc/dao/DataCenterVnetDao.java b/server/src/com/cloud/dc/dao/DataCenterVnetDao.java new file mode 100644 index 00000000000..79e91c4bca8 --- /dev/null +++ b/server/src/com/cloud/dc/dao/DataCenterVnetDao.java @@ -0,0 +1,38 @@ +// 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.dc.dao; + +import java.util.List; + +import com.cloud.dc.DataCenterVnetVO; +import com.cloud.utils.db.GenericDao; + +public interface DataCenterVnetDao extends GenericDao { + public List listAllocatedVnets(long physicalNetworkId); + public List findVnet(long dcId, String vnet); + public int countZoneVlans(long dcId, boolean onlyCountAllocated); + public List findVnet(long dcId, long physicalNetworkId, String vnet); + + public void add(long dcId, long physicalNetworkId, int start, int end); + + public void delete(long physicalNetworkId); + + public DataCenterVnetVO take(long physicalNetworkId, long accountId, String reservationId); + + public void release(String vnet, long physicalNetworkId, long accountId, String reservationId); + +} diff --git a/server/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java b/server/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java index af8bd25ebc9..5ded0f4ecf5 100755 --- a/server/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java +++ b/server/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java @@ -41,7 +41,7 @@ import com.cloud.utils.exception.CloudRuntimeException; */ @Component @DB(txn=false) -public class DataCenterVnetDaoImpl extends GenericDaoBase implements GenericDao { +public class DataCenterVnetDaoImpl extends GenericDaoBase implements DataCenterVnetDao { private final SearchBuilder FreeVnetSearch; private final SearchBuilder VnetDcSearch; private final SearchBuilder VnetDcSearchAllocated; diff --git a/server/src/com/cloud/dc/dao/PodVlanDao.java b/server/src/com/cloud/dc/dao/PodVlanDao.java new file mode 100644 index 00000000000..6359dfea83d --- /dev/null +++ b/server/src/com/cloud/dc/dao/PodVlanDao.java @@ -0,0 +1,30 @@ +// 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.dc.dao; + +import java.util.List; + +import com.cloud.dc.PodVlanVO; +import com.cloud.utils.db.GenericDao; + +public interface PodVlanDao extends GenericDao { + public List listAllocatedVnets(long podId); + public void add(long podId, int start, int end); + public void delete(long podId); + public PodVlanVO take(long podId, long accountId); + public void release(String vlan, long podId, long accountId); +} diff --git a/server/src/com/cloud/dc/dao/PodVlanDaoImpl.java b/server/src/com/cloud/dc/dao/PodVlanDaoImpl.java index 96cd42cf31f..413f9ed6c18 100755 --- a/server/src/com/cloud/dc/dao/PodVlanDaoImpl.java +++ b/server/src/com/cloud/dc/dao/PodVlanDaoImpl.java @@ -35,7 +35,7 @@ import com.cloud.utils.exception.CloudRuntimeException; * PodVlanDaoImpl maintains the one-to-many relationship between */ @Component -public class PodVlanDaoImpl extends GenericDaoBase implements GenericDao { +public class PodVlanDaoImpl extends GenericDaoBase implements PodVlanDao { private final SearchBuilder FreeVlanSearch; private final SearchBuilder VlanPodSearch; private final SearchBuilder PodSearchAllocated; diff --git a/server/src/com/cloud/network/NetworkServiceImpl.java b/server/src/com/cloud/network/NetworkServiceImpl.java index 4c61aec284f..87920373013 100755 --- a/server/src/com/cloud/network/NetworkServiceImpl.java +++ b/server/src/com/cloud/network/NetworkServiceImpl.java @@ -113,6 +113,7 @@ import com.cloud.utils.AnnotationHelper; import com.cloud.utils.Journal; import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; +import com.cloud.utils.component.ComponentContext; import com.cloud.utils.component.Manager; import com.cloud.utils.component.ManagerBase; import com.cloud.utils.db.*; @@ -2978,10 +2979,12 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { PhysicalNetworkServiceProvider nsp = addProviderToPhysicalNetwork(physicalNetworkId, Network.Provider.VirtualRouter.getName(), null, null); // add instance of the provider - VirtualRouterElement element = (VirtualRouterElement) _networkModel.getElementImplementingProvider(Network.Provider.VirtualRouter.getName()); - if (element == null) { + NetworkElement networkElement = _networkModel.getElementImplementingProvider(Network.Provider.VirtualRouter.getName()); + if (networkElement == null) { throw new CloudRuntimeException("Unable to find the Network Element implementing the VirtualRouter Provider"); } + + VirtualRouterElement element = ComponentContext.getTargetObject(networkElement); element.addElement(nsp.getId(), VirtualRouterProviderType.VirtualRouter); return nsp; @@ -3003,11 +3006,13 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { PhysicalNetworkServiceProvider nsp = addProviderToPhysicalNetwork(physicalNetworkId, Network.Provider.VPCVirtualRouter.getName(), null, null); - // add instance of the provider - VpcVirtualRouterElement element = (VpcVirtualRouterElement) _networkModel.getElementImplementingProvider(Network.Provider.VPCVirtualRouter.getName()); - if (element == null) { + + NetworkElement networkElement = _networkModel.getElementImplementingProvider(Network.Provider.VPCVirtualRouter.getName()); + if (networkElement == null) { throw new CloudRuntimeException("Unable to find the Network Element implementing the VPCVirtualRouter Provider"); } + + VpcVirtualRouterElement element = ComponentContext.getTargetObject(networkElement); element.addElement(nsp.getId(), VirtualRouterProviderType.VPCVirtualRouter); return nsp; diff --git a/server/src/com/cloud/network/dao/FirewallRulesDaoImpl.java b/server/src/com/cloud/network/dao/FirewallRulesDaoImpl.java index 57a5f853fda..45a80685078 100644 --- a/server/src/com/cloud/network/dao/FirewallRulesDaoImpl.java +++ b/server/src/com/cloud/network/dao/FirewallRulesDaoImpl.java @@ -30,6 +30,7 @@ import com.cloud.network.rules.FirewallRule.State; import com.cloud.network.rules.FirewallRule.TrafficType; import com.cloud.network.rules.FirewallRuleVO; import com.cloud.server.ResourceTag.TaggedResourceType; +import com.cloud.tags.dao.ResourceTagDao; import com.cloud.tags.dao.ResourceTagsDaoImpl; import com.cloud.utils.db.DB; import com.cloud.utils.db.GenericDaoBase; @@ -53,8 +54,8 @@ public class FirewallRulesDaoImpl extends GenericDaoBase i protected final SearchBuilder SystemRuleSearch; protected final GenericSearchBuilder RulesByIpCount; - @Inject protected FirewallRulesCidrsDaoImpl _firewallRulesCidrsDao; - @Inject ResourceTagsDaoImpl _tagsDao; + @Inject protected FirewallRulesCidrsDao _firewallRulesCidrsDao; + @Inject ResourceTagDao _tagsDao; @Inject IPAddressDao _ipDao; protected FirewallRulesDaoImpl() { diff --git a/server/src/com/cloud/network/dao/IPAddressDaoImpl.java b/server/src/com/cloud/network/dao/IPAddressDaoImpl.java index 691e46047de..b0eef4f3043 100755 --- a/server/src/com/cloud/network/dao/IPAddressDaoImpl.java +++ b/server/src/com/cloud/network/dao/IPAddressDaoImpl.java @@ -30,9 +30,11 @@ import org.springframework.stereotype.Component; import com.cloud.dc.Vlan.VlanType; import com.cloud.dc.VlanVO; +import com.cloud.dc.dao.VlanDao; import com.cloud.dc.dao.VlanDaoImpl; import com.cloud.network.IpAddress.State; import com.cloud.server.ResourceTag.TaggedResourceType; +import com.cloud.tags.dao.ResourceTagDao; import com.cloud.tags.dao.ResourceTagsDaoImpl; import com.cloud.utils.db.DB; import com.cloud.utils.db.GenericDaoBase; @@ -57,9 +59,9 @@ public class IPAddressDaoImpl extends GenericDaoBase implemen protected GenericSearchBuilder AllocatedIpCount; protected GenericSearchBuilder AllIpCountForDashboard; protected GenericSearchBuilder AllocatedIpCountForAccount; - @Inject protected VlanDaoImpl _vlanDao; + @Inject protected VlanDao _vlanDao; protected GenericSearchBuilder CountFreePublicIps; - @Inject ResourceTagsDaoImpl _tagsDao; + @Inject ResourceTagDao _tagsDao; // make it public for JUnit test public IPAddressDaoImpl() { diff --git a/server/src/com/cloud/network/dao/LoadBalancerDaoImpl.java b/server/src/com/cloud/network/dao/LoadBalancerDaoImpl.java index 547dc608e73..f211a7f1a79 100644 --- a/server/src/com/cloud/network/dao/LoadBalancerDaoImpl.java +++ b/server/src/com/cloud/network/dao/LoadBalancerDaoImpl.java @@ -51,7 +51,7 @@ public class LoadBalancerDaoImpl extends GenericDaoBase im private final SearchBuilder AccountAndNameSearch; protected final SearchBuilder TransitionStateSearch; - @Inject protected FirewallRulesCidrsDaoImpl _portForwardingRulesCidrsDao; + @Inject protected FirewallRulesCidrsDao _portForwardingRulesCidrsDao; protected LoadBalancerDaoImpl() { ListByIp = createSearchBuilder(); diff --git a/server/src/com/cloud/network/dao/NetworkAccountDao.java b/server/src/com/cloud/network/dao/NetworkAccountDao.java new file mode 100644 index 00000000000..c4435c8074e --- /dev/null +++ b/server/src/com/cloud/network/dao/NetworkAccountDao.java @@ -0,0 +1,22 @@ +// 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.network.dao; + +import com.cloud.utils.db.GenericDao; + +public interface NetworkAccountDao extends GenericDao { +} diff --git a/server/src/com/cloud/network/dao/NetworkAccountDaoImpl.java b/server/src/com/cloud/network/dao/NetworkAccountDaoImpl.java index f0b71562f62..09479056f14 100644 --- a/server/src/com/cloud/network/dao/NetworkAccountDaoImpl.java +++ b/server/src/com/cloud/network/dao/NetworkAccountDaoImpl.java @@ -22,7 +22,7 @@ import com.cloud.utils.db.GenericDao; import com.cloud.utils.db.GenericDaoBase; @Component -public class NetworkAccountDaoImpl extends GenericDaoBase implements GenericDao { +public class NetworkAccountDaoImpl extends GenericDaoBase implements NetworkAccountDao { public NetworkAccountDaoImpl() { super(); } diff --git a/server/src/com/cloud/network/dao/NetworkDaoImpl.java b/server/src/com/cloud/network/dao/NetworkDaoImpl.java index 43c581f83b9..1bc8973bc50 100644 --- a/server/src/com/cloud/network/dao/NetworkDaoImpl.java +++ b/server/src/com/cloud/network/dao/NetworkDaoImpl.java @@ -39,13 +39,11 @@ import com.cloud.network.Networks.Mode; import com.cloud.network.Networks.TrafficType; import com.cloud.offering.NetworkOffering; import com.cloud.offerings.NetworkOfferingVO; +import com.cloud.offerings.dao.NetworkOfferingDao; import com.cloud.offerings.dao.NetworkOfferingDaoImpl; import com.cloud.server.ResourceTag.TaggedResourceType; +import com.cloud.tags.dao.ResourceTagDao; import com.cloud.tags.dao.ResourceTagsDaoImpl; -import com.cloud.utils.db.DB; -import com.cloud.utils.db.GenericDaoBase; -import com.cloud.utils.db.GenericSearchBuilder; -import com.cloud.utils.db.JoinBuilder; import com.cloud.utils.db.*; import com.cloud.utils.db.JoinBuilder.JoinType; import com.cloud.utils.db.SearchCriteria.Func; @@ -76,13 +74,13 @@ public class NetworkDaoImpl extends GenericDaoBase implements N - @Inject ResourceTagsDaoImpl _tagsDao; - @Inject NetworkAccountDaoImpl _accountsDao; - @Inject NetworkDomainDaoImpl _domainsDao; - @Inject NetworkOpDaoImpl _opDao; - @Inject NetworkServiceMapDaoImpl _ntwkSvcMap; - @Inject NetworkOfferingDaoImpl _ntwkOffDao; - @Inject NetworkOpDaoImpl _ntwkOpDao; + @Inject ResourceTagDao _tagsDao; + @Inject NetworkAccountDao _accountsDao; + @Inject NetworkDomainDao _domainsDao; + @Inject NetworkOpDao _opDao; + @Inject NetworkServiceMapDao _ntwkSvcMap; + @Inject NetworkOfferingDao _ntwkOffDao; + @Inject NetworkOpDao _ntwkOpDao; TableGenerator _tgMacAddress; diff --git a/server/src/com/cloud/network/dao/NetworkOpDao.java b/server/src/com/cloud/network/dao/NetworkOpDao.java new file mode 100644 index 00000000000..f492dbd254f --- /dev/null +++ b/server/src/com/cloud/network/dao/NetworkOpDao.java @@ -0,0 +1,26 @@ +// 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.network.dao; + +import com.cloud.utils.db.GenericDao; + +public interface NetworkOpDao extends GenericDao { + public int getActiveNics(long networkId); + public void changeActiveNicsBy(long networkId, int count); + public void setCheckForGc(long networkId); + public void clearCheckForGc(long networkId); +} diff --git a/server/src/com/cloud/network/dao/NetworkOpDaoImpl.java b/server/src/com/cloud/network/dao/NetworkOpDaoImpl.java index bdc9f50398c..a3f54b78850 100644 --- a/server/src/com/cloud/network/dao/NetworkOpDaoImpl.java +++ b/server/src/com/cloud/network/dao/NetworkOpDaoImpl.java @@ -30,7 +30,7 @@ import com.cloud.utils.db.SearchCriteria.Op; import com.cloud.utils.db.UpdateBuilder; @Component -public class NetworkOpDaoImpl extends GenericDaoBase implements GenericDao { +public class NetworkOpDaoImpl extends GenericDaoBase implements NetworkOpDao { protected final SearchBuilder AllFieldsSearch; protected final GenericSearchBuilder ActiveNicsSearch; protected final Attribute _activeNicsAttribute; diff --git a/server/src/com/cloud/network/dao/PhysicalNetworkDaoImpl.java b/server/src/com/cloud/network/dao/PhysicalNetworkDaoImpl.java index 8e67d8bb5e8..1e26a51cead 100644 --- a/server/src/com/cloud/network/dao/PhysicalNetworkDaoImpl.java +++ b/server/src/com/cloud/network/dao/PhysicalNetworkDaoImpl.java @@ -36,7 +36,7 @@ import com.cloud.utils.db.SearchCriteria.Op; public class PhysicalNetworkDaoImpl extends GenericDaoBase implements PhysicalNetworkDao { final SearchBuilder ZoneSearch; - @Inject protected PhysicalNetworkTrafficTypeDaoImpl _trafficTypeDao; + @Inject protected PhysicalNetworkTrafficTypeDao _trafficTypeDao; protected PhysicalNetworkDaoImpl() { super(); diff --git a/server/src/com/cloud/network/dao/RouterNetworkDao.java b/server/src/com/cloud/network/dao/RouterNetworkDao.java new file mode 100644 index 00000000000..bd275bdd5fc --- /dev/null +++ b/server/src/com/cloud/network/dao/RouterNetworkDao.java @@ -0,0 +1,26 @@ +// 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.network.dao; + +import java.util.List; + +import com.cloud.utils.db.GenericDao; + +public interface RouterNetworkDao extends GenericDao { + public List getRouterNetworks(long routerId); + public RouterNetworkVO findByRouterAndNetwork (long routerId, long networkId); +} diff --git a/server/src/com/cloud/network/dao/RouterNetworkDaoImpl.java b/server/src/com/cloud/network/dao/RouterNetworkDaoImpl.java index e560713aca5..b0b633c55e9 100644 --- a/server/src/com/cloud/network/dao/RouterNetworkDaoImpl.java +++ b/server/src/com/cloud/network/dao/RouterNetworkDaoImpl.java @@ -28,7 +28,7 @@ import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.SearchCriteria.Op; @Component -public class RouterNetworkDaoImpl extends GenericDaoBase implements GenericDao{ +public class RouterNetworkDaoImpl extends GenericDaoBase implements RouterNetworkDao { protected final GenericSearchBuilder RouterNetworksSearch; protected final SearchBuilder AllFieldsSearch; diff --git a/server/src/com/cloud/network/dao/Site2SiteVpnConnectionDaoImpl.java b/server/src/com/cloud/network/dao/Site2SiteVpnConnectionDaoImpl.java index 2830abe699f..4745f9aad01 100644 --- a/server/src/com/cloud/network/dao/Site2SiteVpnConnectionDaoImpl.java +++ b/server/src/com/cloud/network/dao/Site2SiteVpnConnectionDaoImpl.java @@ -35,8 +35,8 @@ import com.cloud.utils.db.SearchCriteria; public class Site2SiteVpnConnectionDaoImpl extends GenericDaoBase implements Site2SiteVpnConnectionDao { private static final Logger s_logger = Logger.getLogger(Site2SiteVpnConnectionDaoImpl.class); - @Inject protected IPAddressDaoImpl _addrDao; - @Inject protected Site2SiteVpnGatewayDaoImpl _vpnGatewayDao; + @Inject protected IPAddressDao _addrDao; + @Inject protected Site2SiteVpnGatewayDao _vpnGatewayDao; private SearchBuilder AllFieldsSearch; private SearchBuilder VpcSearch; diff --git a/server/src/com/cloud/network/dao/Site2SiteVpnGatewayDaoImpl.java b/server/src/com/cloud/network/dao/Site2SiteVpnGatewayDaoImpl.java index 8305978f26c..fa4a9fa3df2 100644 --- a/server/src/com/cloud/network/dao/Site2SiteVpnGatewayDaoImpl.java +++ b/server/src/com/cloud/network/dao/Site2SiteVpnGatewayDaoImpl.java @@ -29,7 +29,7 @@ import com.cloud.utils.db.SearchCriteria; @Component @Local(value={Site2SiteVpnGatewayDao.class}) public class Site2SiteVpnGatewayDaoImpl extends GenericDaoBase implements Site2SiteVpnGatewayDao { - @Inject protected IPAddressDaoImpl _addrDao; + @Inject protected IPAddressDao _addrDao; private static final Logger s_logger = Logger.getLogger(Site2SiteVpnGatewayDaoImpl.class); diff --git a/server/src/com/cloud/network/rules/dao/PortForwardingRulesDaoImpl.java b/server/src/com/cloud/network/rules/dao/PortForwardingRulesDaoImpl.java index 1d2e991ab39..5d0b01cabed 100644 --- a/server/src/com/cloud/network/rules/dao/PortForwardingRulesDaoImpl.java +++ b/server/src/com/cloud/network/rules/dao/PortForwardingRulesDaoImpl.java @@ -23,6 +23,7 @@ import javax.inject.Inject; import org.springframework.stereotype.Component; +import com.cloud.network.dao.FirewallRulesCidrsDao; import com.cloud.network.dao.FirewallRulesCidrsDaoImpl; import com.cloud.network.rules.FirewallRule.Purpose; import com.cloud.network.rules.FirewallRule.State; @@ -44,7 +45,7 @@ public class PortForwardingRulesDaoImpl extends GenericDaoBase AllRulesSearchByVM; protected final SearchBuilder ActiveRulesSearchByAccount; - @Inject protected FirewallRulesCidrsDaoImpl _portForwardingRulesCidrsDao; + @Inject protected FirewallRulesCidrsDao _portForwardingRulesCidrsDao; protected PortForwardingRulesDaoImpl() { super(); diff --git a/server/src/com/cloud/network/security/dao/SecurityGroupDaoImpl.java b/server/src/com/cloud/network/security/dao/SecurityGroupDaoImpl.java index 68112c0a7c1..dfa6a2e53ad 100644 --- a/server/src/com/cloud/network/security/dao/SecurityGroupDaoImpl.java +++ b/server/src/com/cloud/network/security/dao/SecurityGroupDaoImpl.java @@ -25,6 +25,7 @@ import org.springframework.stereotype.Component; import com.cloud.network.security.SecurityGroupVO; import com.cloud.server.ResourceTag.TaggedResourceType; +import com.cloud.tags.dao.ResourceTagDao; import com.cloud.tags.dao.ResourceTagsDaoImpl; import com.cloud.utils.db.DB; @@ -39,7 +40,7 @@ public class SecurityGroupDaoImpl extends GenericDaoBase private SearchBuilder AccountIdSearch; private SearchBuilder AccountIdNameSearch; private SearchBuilder AccountIdNamesSearch; - @Inject ResourceTagsDaoImpl _tagsDao; + @Inject ResourceTagDao _tagsDao; protected SecurityGroupDaoImpl() { diff --git a/server/src/com/cloud/network/vpc/dao/StaticRouteDaoImpl.java b/server/src/com/cloud/network/vpc/dao/StaticRouteDaoImpl.java index 0ebccabfa8e..fac35a91a53 100644 --- a/server/src/com/cloud/network/vpc/dao/StaticRouteDaoImpl.java +++ b/server/src/com/cloud/network/vpc/dao/StaticRouteDaoImpl.java @@ -26,6 +26,7 @@ import org.springframework.stereotype.Component; import com.cloud.network.vpc.StaticRoute; import com.cloud.network.vpc.StaticRouteVO; import com.cloud.server.ResourceTag.TaggedResourceType; +import com.cloud.tags.dao.ResourceTagDao; import com.cloud.tags.dao.ResourceTagsDaoImpl; import com.cloud.utils.db.DB; @@ -44,7 +45,7 @@ public class StaticRouteDaoImpl extends GenericDaoBase impl protected final SearchBuilder AllFieldsSearch; protected final SearchBuilder NotRevokedSearch; protected final GenericSearchBuilder RoutesByGatewayCount; - @Inject ResourceTagsDaoImpl _tagsDao; + @Inject ResourceTagDao _tagsDao; protected StaticRouteDaoImpl() { super(); diff --git a/server/src/com/cloud/network/vpc/dao/VpcDaoImpl.java b/server/src/com/cloud/network/vpc/dao/VpcDaoImpl.java index 5fdf27972a2..6560b90ce7d 100644 --- a/server/src/com/cloud/network/vpc/dao/VpcDaoImpl.java +++ b/server/src/com/cloud/network/vpc/dao/VpcDaoImpl.java @@ -29,7 +29,7 @@ import org.springframework.stereotype.Component; import com.cloud.network.vpc.Vpc; import com.cloud.network.vpc.VpcVO; import com.cloud.server.ResourceTag.TaggedResourceType; -import com.cloud.tags.dao.ResourceTagsDaoImpl; +import com.cloud.tags.dao.ResourceTagDao; import com.cloud.utils.db.DB; import com.cloud.utils.db.GenericDaoBase; @@ -47,8 +47,9 @@ public class VpcDaoImpl extends GenericDaoBase implements VpcDao{ final GenericSearchBuilder CountByOfferingId; final SearchBuilder AllFieldsSearch; final GenericSearchBuilder CountByAccountId; - @Inject ResourceTagsDaoImpl _tagsDao; - @Inject VpcServiceMapDaoImpl _vpcSvcMap; + + @Inject ResourceTagDao _tagsDao; + @Inject VpcServiceMapDao _vpcSvcMap; protected VpcDaoImpl() { super(); diff --git a/server/src/com/cloud/projects/dao/ProjectDaoImpl.java b/server/src/com/cloud/projects/dao/ProjectDaoImpl.java index e07aecc5ec6..ecf40dacaff 100644 --- a/server/src/com/cloud/projects/dao/ProjectDaoImpl.java +++ b/server/src/com/cloud/projects/dao/ProjectDaoImpl.java @@ -27,6 +27,7 @@ import org.springframework.stereotype.Component; import com.cloud.projects.Project; import com.cloud.projects.ProjectVO; import com.cloud.server.ResourceTag.TaggedResourceType; +import com.cloud.tags.dao.ResourceTagDao; import com.cloud.tags.dao.ResourceTagsDaoImpl; import com.cloud.utils.db.DB; @@ -45,7 +46,7 @@ public class ProjectDaoImpl extends GenericDaoBase implements P protected GenericSearchBuilder CountByDomain; protected GenericSearchBuilder ProjectAccountSearch; // ResourceTagsDaoImpl _tagsDao = ComponentLocator.inject(ResourceTagsDaoImpl.class); - @Inject ResourceTagsDaoImpl _tagsDao; + @Inject ResourceTagDao _tagsDao; protected ProjectDaoImpl() { AllFieldsSearch = createSearchBuilder(); diff --git a/server/src/com/cloud/servlet/CloudStartupServlet.java b/server/src/com/cloud/servlet/CloudStartupServlet.java index 46be09387ba..2cabe15e0ac 100755 --- a/server/src/com/cloud/servlet/CloudStartupServlet.java +++ b/server/src/com/cloud/servlet/CloudStartupServlet.java @@ -16,6 +16,9 @@ // under the License. package com.cloud.servlet; +import java.util.Timer; +import java.util.TimerTask; + import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; @@ -31,10 +34,22 @@ public class CloudStartupServlet extends HttpServlet { public static final Logger s_logger = Logger.getLogger(CloudStartupServlet.class.getName()); static final long serialVersionUID = SerialVersionUID.CloudStartupServlet; + Timer _timer = new Timer(); + @Override public void init(ServletConfig config) throws ServletException { LogUtils.initLog4j("log4j-cloud.xml"); SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, config.getServletContext()); - ComponentContext.initComponentsLifeCycle(); + + // wait when condition is ready for initialization + _timer.scheduleAtFixedRate(new TimerTask() { + @Override + public void run() { + if(ComponentContext.getApplicationContext() != null) { + _timer.cancel(); + ComponentContext.initComponentsLifeCycle(); + } + } + }, 0, 1000); } } diff --git a/server/src/com/cloud/storage/dao/SnapshotDaoImpl.java b/server/src/com/cloud/storage/dao/SnapshotDaoImpl.java index 5b3f2732f99..825b6d56e00 100644 --- a/server/src/com/cloud/storage/dao/SnapshotDaoImpl.java +++ b/server/src/com/cloud/storage/dao/SnapshotDaoImpl.java @@ -35,16 +35,14 @@ import com.cloud.storage.Snapshot.Type; import com.cloud.storage.SnapshotVO; import com.cloud.storage.Volume; import com.cloud.storage.VolumeVO; +import com.cloud.tags.dao.ResourceTagDao; import com.cloud.tags.dao.ResourceTagsDaoImpl; -import com.cloud.utils.db.DB; -import com.cloud.utils.db.Filter; -import com.cloud.utils.db.GenericDaoBase; -import com.cloud.utils.db.GenericSearchBuilder; import com.cloud.utils.db.*; import com.cloud.utils.db.JoinBuilder.JoinType; import com.cloud.utils.db.SearchCriteria.Func; import com.cloud.vm.VMInstanceVO; +import com.cloud.vm.dao.VMInstanceDao; import com.cloud.vm.dao.VMInstanceDaoImpl; @Component @@ -66,10 +64,10 @@ public class SnapshotDaoImpl extends GenericDaoBase implements private SearchBuilder InstanceIdSearch; private SearchBuilder StatusSearch; private GenericSearchBuilder CountSnapshotsByAccount; - @Inject ResourceTagsDaoImpl _tagsDao; + @Inject ResourceTagDao _tagsDao; - @Inject protected VMInstanceDaoImpl _instanceDao; - @Inject protected VolumeDaoImpl _volumeDao; + @Inject protected VMInstanceDao _instanceDao; + @Inject protected VolumeDao _volumeDao; @Override public SnapshotVO findNextSnapshot(long snapshotId) { diff --git a/server/src/com/cloud/storage/dao/VolumeDaoImpl.java b/server/src/com/cloud/storage/dao/VolumeDaoImpl.java index ca3b82a06c1..40ed875caab 100755 --- a/server/src/com/cloud/storage/dao/VolumeDaoImpl.java +++ b/server/src/com/cloud/storage/dao/VolumeDaoImpl.java @@ -37,6 +37,7 @@ import com.cloud.storage.Volume.Event; import com.cloud.storage.Volume.State; import com.cloud.storage.Volume.Type; import com.cloud.storage.VolumeVO; +import com.cloud.tags.dao.ResourceTagDao; import com.cloud.tags.dao.ResourceTagsDaoImpl; import com.cloud.utils.Pair; import com.cloud.utils.db.DB; @@ -61,8 +62,7 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol protected final SearchBuilder InstanceStatesSearch; protected final SearchBuilder AllFieldsSearch; protected GenericSearchBuilder CountByAccount; - // ResourceTagsDaoImpl _tagsDao = ComponentLocator.inject(ResourceTagsDaoImpl.class); - @Inject ResourceTagsDaoImpl _tagsDao; + @Inject ResourceTagDao _tagsDao; protected static final String SELECT_VM_SQL = "SELECT DISTINCT instance_id from volumes v where v.host_id = ? and v.mirror_state = ?"; protected static final String SELECT_HYPERTYPE_FROM_VOLUME = "SELECT c.hypervisor_type from volumes v, storage_pool s, cluster c where v.pool_id = s.id and s.cluster_id = c.id and v.id = ?"; diff --git a/server/src/com/cloud/vm/dao/DomainRouterDaoImpl.java b/server/src/com/cloud/vm/dao/DomainRouterDaoImpl.java index 52075880b9c..391fa5895b0 100755 --- a/server/src/com/cloud/vm/dao/DomainRouterDaoImpl.java +++ b/server/src/com/cloud/vm/dao/DomainRouterDaoImpl.java @@ -25,15 +25,19 @@ import javax.inject.Inject; import org.springframework.stereotype.Component; import com.cloud.host.HostVO; +import com.cloud.host.dao.HostDao; import com.cloud.host.dao.HostDaoImpl; import com.cloud.network.Network; +import com.cloud.network.dao.RouterNetworkDao; import com.cloud.network.dao.RouterNetworkDaoImpl; import com.cloud.network.dao.RouterNetworkVO; import com.cloud.network.router.VirtualRouter; import com.cloud.network.router.VirtualRouter.Role; import com.cloud.offering.NetworkOffering; +import com.cloud.offerings.dao.NetworkOfferingDao; import com.cloud.offerings.dao.NetworkOfferingDaoImpl; import com.cloud.user.UserStatisticsVO; +import com.cloud.user.dao.UserStatisticsDao; import com.cloud.user.dao.UserStatisticsDaoImpl; import com.cloud.utils.db.DB; import com.cloud.utils.db.GenericDaoBase; @@ -57,10 +61,10 @@ public class DomainRouterDaoImpl extends GenericDaoBase im protected SearchBuilder HostUpSearch; protected SearchBuilder StateNetworkTypeSearch; protected SearchBuilder OutsidePodSearch; - @Inject HostDaoImpl _hostsDao; - @Inject RouterNetworkDaoImpl _routerNetworkDao; - @Inject UserStatisticsDaoImpl _userStatsDao; - @Inject NetworkOfferingDaoImpl _offDao; + @Inject HostDao _hostsDao; + @Inject RouterNetworkDao _routerNetworkDao; + @Inject UserStatisticsDao _userStatsDao; + @Inject NetworkOfferingDao _offDao; protected SearchBuilder VpcSearch; public DomainRouterDaoImpl() { diff --git a/server/src/com/cloud/vm/dao/UserVmDaoImpl.java b/server/src/com/cloud/vm/dao/UserVmDaoImpl.java index 02604fe767b..49228287f67 100755 --- a/server/src/com/cloud/vm/dao/UserVmDaoImpl.java +++ b/server/src/com/cloud/vm/dao/UserVmDaoImpl.java @@ -35,6 +35,7 @@ import org.springframework.stereotype.Component; import com.cloud.configuration.Resource; import com.cloud.server.ResourceTag.TaggedResourceType; +import com.cloud.tags.dao.ResourceTagDao; import com.cloud.tags.dao.ResourceTagsDaoImpl; import com.cloud.user.Account; @@ -79,7 +80,7 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use protected SearchBuilder UserVmByIsoSearch; protected Attribute _updateTimeAttr; // ResourceTagsDaoImpl _tagsDao = ComponentLocator.inject(ResourceTagsDaoImpl.class); - @Inject ResourceTagsDaoImpl _tagsDao; + @Inject ResourceTagDao _tagsDao; private static final String LIST_PODS_HAVING_VMS_FOR_ACCOUNT = "SELECT pod_id FROM cloud.vm_instance WHERE data_center_id = ? AND account_id = ? AND pod_id IS NOT NULL AND (state = 'Running' OR state = 'Stopped') " + "GROUP BY pod_id HAVING count(id) > 0 ORDER BY count(id) DESC"; diff --git a/server/test/com/cloud/agent/MockAgentManagerImpl.java b/server/test/com/cloud/agent/MockAgentManagerImpl.java index bdacf68e28a..7e3462d8ff8 100755 --- a/server/test/com/cloud/agent/MockAgentManagerImpl.java +++ b/server/test/com/cloud/agent/MockAgentManagerImpl.java @@ -188,4 +188,10 @@ public class MockAgentManagerImpl extends ManagerBase implements AgentManager { return null; } + @Override + public void disconnectWithInvestigation(long hostId, Event event) { + // TODO Auto-generated method stub + + } + } diff --git a/utils/src/com/cloud/utils/component/ComponentContext.java b/utils/src/com/cloud/utils/component/ComponentContext.java index a6affc2c002..e598b851e77 100644 --- a/utils/src/com/cloud/utils/component/ComponentContext.java +++ b/utils/src/com/cloud/utils/component/ComponentContext.java @@ -55,8 +55,18 @@ public class ComponentContext implements ApplicationContextAware { private static ApplicationContext s_appContext; + private static Advisor s_advisor; + private static ProxyFactory s_pf; + static { + s_advisor = new DefaultPointcutAdvisor(new MatchAnyMethodPointcut(), + new TransactionContextBuilder()); + s_pf = new ProxyFactory(); + s_pf.addAdvisor(s_advisor); + } + @Override - public void setApplicationContext(ApplicationContext applicationContext) { + public void setApplicationContext(ApplicationContext applicationContext) { + s_logger.info("Setup Spring Application context"); s_appContext = applicationContext; } @@ -157,27 +167,24 @@ public class ComponentContext implements ApplicationContextAware { public static T getComponent(Class beanType) { assert(s_appContext != null); - try { - return s_appContext.getBean(beanType); - } catch(NoSuchBeanDefinitionException e) { - Map matchedTypes = getComponentsOfType(beanType); - if(matchedTypes.size() > 0) { - for(Map.Entry entry : matchedTypes.entrySet()) { - Primary primary = getTargetClass(entry.getValue()).getAnnotation(Primary.class); - if(primary != null) - return entry.getValue(); - } - - if(matchedTypes.size() > 1) { - s_logger.warn("Unable to uniquely locate bean type " + beanType.getName()); - for(Map.Entry entry : matchedTypes.entrySet()) { - s_logger.warn("Candidate " + getTargetClass(entry.getValue()).getName()); - } - } - - return (T)matchedTypes.values().toArray()[0]; + Map matchedTypes = getComponentsOfType(beanType); + if(matchedTypes.size() > 0) { + for(Map.Entry entry : matchedTypes.entrySet()) { + Primary primary = getTargetClass(entry.getValue()).getAnnotation(Primary.class); + if(primary != null) + return entry.getValue(); } + + if(matchedTypes.size() > 1) { + s_logger.warn("Unable to uniquely locate bean type " + beanType.getName()); + for(Map.Entry entry : matchedTypes.entrySet()) { + s_logger.warn("Candidate " + getTargetClass(entry.getValue()).getName()); + } + } + + return (T)matchedTypes.values().toArray()[0]; } + throw new NoSuchBeanDefinitionException(beanType.getName()); } @@ -208,24 +215,19 @@ public class ComponentContext implements ApplicationContextAware { return (T)instance; } - @SuppressWarnings("unchecked") - public static T inject(Class clz) { - Object instance = s_appContext.getAutowireCapableBeanFactory().createBean(clz); - return (T)inject(instance); + public static T inject(Class clz) { + T instance = s_appContext.getAutowireCapableBeanFactory().createBean(clz); + return instance; } public static T inject(Object instance) { // autowire dynamically loaded object AutowireCapableBeanFactory beanFactory = s_appContext.getAutowireCapableBeanFactory(); beanFactory.autowireBean(instance); - - Advisor advisor = new DefaultPointcutAdvisor(new MatchAnyMethodPointcut(), - new TransactionContextBuilder()); - - ProxyFactory pf = new ProxyFactory(); - pf.setTarget(instance); - pf.addAdvisor(advisor); - - return (T)pf.getProxy(); + return (T)instance; +/* + s_pf.setTarget(instance); + return (T)s_pf.getProxy(); +*/ } } diff --git a/utils/src/com/cloud/utils/db/GenericDao.java b/utils/src/com/cloud/utils/db/GenericDao.java index c0a9029bf3c..3efc1c5208d 100755 --- a/utils/src/com/cloud/utils/db/GenericDao.java +++ b/utils/src/com/cloud/utils/db/GenericDao.java @@ -277,4 +277,6 @@ public interface GenericDao { * @return */ Pair, Integer> searchAndCount(SearchCriteria sc, Filter filter); + + Map getAllAttributes(); } diff --git a/utils/src/com/cloud/utils/db/GenericDaoBase.java b/utils/src/com/cloud/utils/db/GenericDaoBase.java index cf30474fbbf..afb12471da7 100755 --- a/utils/src/com/cloud/utils/db/GenericDaoBase.java +++ b/utils/src/com/cloud/utils/db/GenericDaoBase.java @@ -68,6 +68,7 @@ import com.cloud.utils.DateUtil; import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; import com.cloud.utils.Ternary; +import com.cloud.utils.component.ComponentContext; import com.cloud.utils.component.ComponentLifecycle; import com.cloud.utils.component.ComponentLifecycleBase; import com.cloud.utils.crypt.DBEncryptionUtil; @@ -118,7 +119,7 @@ public abstract class GenericDaoBase extends Compone protected final static TimeZone s_gmtTimeZone = TimeZone.getTimeZone("GMT"); - protected final static Map, GenericDaoBase> s_daoMaps = new ConcurrentHashMap, GenericDaoBase>(71); + protected final static Map, GenericDao> s_daoMaps = new ConcurrentHashMap, GenericDao>(71); protected Class _entityBeanType; protected String _table; @@ -128,8 +129,8 @@ public abstract class GenericDaoBase extends Compone protected Field[] _embeddedFields; // This is private on purpose. Everyone should use createPartialSelectSql() - private final Pair _partialSelectSql; - private final Pair _partialQueryCacheSelectSql; + private Pair _partialSelectSql; + private Pair _partialQueryCacheSelectSql; protected StringBuilder _discriminatorClause; protected Map _discriminatorValues; protected String _selectByIdSql; @@ -141,11 +142,11 @@ public abstract class GenericDaoBase extends Compone protected Pair _removed; protected Pair _removeSql; protected List> _deleteSqls; - protected final Map _idAttributes; - protected final Map _tgs; - protected final Map _allAttributes; - protected final List _ecAttributes; - protected final Map, Attribute> _allColumns; + protected Map _idAttributes; + protected Map _tgs; + protected Map _allAttributes; + protected List _ecAttributes; + protected Map, Attribute> _allColumns; protected Enhancer _enhancer; protected Factory _factory; protected Enhancer _searchEnhancer; @@ -159,9 +160,9 @@ public abstract class GenericDaoBase extends Compone protected static final SequenceFetcher s_seqFetcher = SequenceFetcher.getInstance(); - public static GenericDaoBase getDao(Class entityType) { + public static GenericDao getDao(Class entityType) { @SuppressWarnings("unchecked") - GenericDaoBase dao = (GenericDaoBase)s_daoMaps.get(entityType); + GenericDao dao = (GenericDao)s_daoMaps.get(entityType); assert dao != null : "Unable to find DAO for " + entityType + ". Are you sure you waited for the DAO to be initialized before asking for it?"; return dao; } @@ -192,13 +193,15 @@ public abstract class GenericDaoBase extends Compone ( (Class)((Class)t).getGenericSuperclass()).getGenericSuperclass()).getActualTypeArguments()[0]; } - s_daoMaps.put(_entityBeanType, this); +/* + s_daoMaps.put(_entityBeanType, ComponentContext.getComponent(this.getClass())); Class[] interphaces = _entityBeanType.getInterfaces(); if (interphaces != null) { for (Class interphace : interphaces) { - s_daoMaps.put(interphace, this); + s_daoMaps.put(interphace, ComponentContext.getComponent(this.getClass())); } } +*/ _table = DbUtil.getTableName(_entityBeanType); final SqlGenerator generator = new SqlGenerator(_entityBeanType); @@ -1747,6 +1750,25 @@ public abstract class GenericDaoBase extends Compone public boolean configure(final String name, final Map params) throws ConfigurationException { _name = name; + Class daoInterface = null; + for(Class intf : this.getClass().getInterfaces()) { + if(GenericDao.class.isAssignableFrom(intf)) { + daoInterface = intf; + break; + } + } + + if(daoInterface != null) { + s_logger.info("Register dao interface in GenericDaoBase entity-DAO map. " + daoInterface.getName()); + s_daoMaps.put(_entityBeanType, (GenericDao) ComponentContext.getComponent(daoInterface)); + Class[] interphaces = _entityBeanType.getInterfaces(); + if (interphaces != null) { + for (Class interphace : interphaces) { + s_daoMaps.put(interphace, (GenericDao) ComponentContext.getComponent(daoInterface)); + } + } + } + final String value = (String)params.get("lock.timeout"); _timeoutSeconds = NumbersUtil.parseInt(value, 300); diff --git a/utils/src/com/cloud/utils/db/QueryBuilder.java b/utils/src/com/cloud/utils/db/QueryBuilder.java index 2eb3658a20a..3303fbd5b45 100644 --- a/utils/src/com/cloud/utils/db/QueryBuilder.java +++ b/utils/src/com/cloud/utils/db/QueryBuilder.java @@ -56,21 +56,21 @@ public class QueryBuilder implements MethodInterceptor, SimpleQueryBuilder } } - protected HashMap, Pair, Object>> _entities; + protected HashMap, Pair, Object>> _entities; protected ArrayList _specifiedAttrs = new ArrayList(); protected T _resultSetClass; protected ArrayList> _selects; public QueryBuilder(Class resultSetClass, Class... clazzes) { - _entities = new HashMap, Pair, Object>>(clazzes.length); + _entities = new HashMap, Pair, Object>>(clazzes.length); for (Class clazz : clazzes) { - GenericDaoBase dao = GenericDaoBase.getDao(clazz); + GenericDao dao = GenericDaoBase.getDao(clazz); Enhancer searchEnhancer = new Enhancer(); searchEnhancer.setSuperclass(clazz); searchEnhancer.setCallback(this); Object entity = searchEnhancer.create(); - _entities.put(clazz, new Pair, Object>(dao, entity)); + _entities.put(clazz, new Pair, Object>(dao, entity)); } } @@ -86,14 +86,14 @@ public class QueryBuilder implements MethodInterceptor, SimpleQueryBuilder * @param resultSetClass result class to put the result set in. */ public QueryBuilder(Class entityClass, Class resultSetClass) { - _entities = new HashMap, Pair, Object>>(1); - GenericDaoBase dao = GenericDaoBase.getDao(entityClass); + _entities = new HashMap, Pair, Object>>(1); + GenericDao dao = GenericDaoBase.getDao(entityClass); Enhancer searchEnhancer = new Enhancer(); searchEnhancer.setSuperclass(entityClass); searchEnhancer.setCallback(this); Object entity = searchEnhancer.create(); - _entities.put(entityClass, new Pair, Object>(dao, entity)); + _entities.put(entityClass, new Pair, Object>(dao, entity)); } @Override @@ -114,7 +114,7 @@ public class QueryBuilder implements MethodInterceptor, SimpleQueryBuilder return this; } - protected void set(GenericDaoBase dao , String name) { + protected void set(GenericDao dao , String name) { Attribute attr = dao.getAllAttributes().get(name); assert (attr != null) : "Searching for a field that's not there: " + name; _specifiedAttrs.add(attr); @@ -125,9 +125,9 @@ public class QueryBuilder implements MethodInterceptor, SimpleQueryBuilder public Object intercept(Object entity, Method method, Object[] args, MethodProxy proxy) throws Throwable { Class entityClass = entity.getClass().getSuperclass(); - Pair, Object> daoInfo = _entities.get(entityClass); + Pair, Object> daoInfo = _entities.get(entityClass); assert (daoInfo != null) : "You need to specify " + entityClass + " as one of the entities in the Query"; - GenericDaoBase dao = daoInfo.first(); + GenericDao dao = daoInfo.first(); String name = method.getName(); if (name.startsWith("get")) { diff --git a/utils/src/com/cloud/utils/db/TransactionContextBuilder.java b/utils/src/com/cloud/utils/db/TransactionContextBuilder.java index 9b474d56c94..2cbaa303f2a 100644 --- a/utils/src/com/cloud/utils/db/TransactionContextBuilder.java +++ b/utils/src/com/cloud/utils/db/TransactionContextBuilder.java @@ -33,16 +33,8 @@ public class TransactionContextBuilder implements MethodInterceptor { public Object AroundAnyMethod(ProceedingJoinPoint call) throws Throwable { MethodSignature methodSignature = (MethodSignature)call.getSignature(); Method targetMethod = methodSignature.getMethod(); - if(needToIntercept(targetMethod)) { - Transaction txn = null; - try { - Signature s = call.getSignature(); - String name = s.getName(); - txn = Transaction.open(name); - } catch (Throwable e) { - s_logger.debug("Failed to open transaction: " + e.toString()); - throw e; - } + if(true) { // TODO ??? needToIntercept(targetMethod)) { + Transaction txn = Transaction.open(call.getSignature().getName()); Object ret = null; try { ret = call.proceed(); From 3f2b771e072592535e9a71788635e11c264c461a Mon Sep 17 00:00:00 2001 From: Kelven Yang Date: Tue, 26 Feb 2013 11:51:03 -0800 Subject: [PATCH 10/26] CLOUDSTACK-1173: fix the regression caused by life-cycle management changes --- .../consoleproxy/ConsoleProxyResource.java | 25 +++++++++++++++- .../com/cloud/cluster/ClusterManagerImpl.java | 5 ++-- ...ExternalLoadBalancerDeviceManagerImpl.java | 3 +- .../com/cloud/network/NetworkManagerImpl.java | 17 ++++++----- .../com/cloud/network/NetworkModelImpl.java | 7 +++-- .../com/cloud/network/NetworkServiceImpl.java | 21 ++------------ .../com/cloud/consoleproxy/ConsoleProxy.java | 29 ++++++++++++------- .../cloud/utils/component/AdapterBase.java | 2 +- .../utils/component/ComponentContext.java | 2 +- 9 files changed, 66 insertions(+), 45 deletions(-) diff --git a/agent/src/com/cloud/agent/resource/consoleproxy/ConsoleProxyResource.java b/agent/src/com/cloud/agent/resource/consoleproxy/ConsoleProxyResource.java index 8a3a271c4f4..516430b2fed 100644 --- a/agent/src/com/cloud/agent/resource/consoleproxy/ConsoleProxyResource.java +++ b/agent/src/com/cloud/agent/resource/consoleproxy/ConsoleProxyResource.java @@ -26,6 +26,7 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.URL; import java.net.URLConnection; +import java.util.HashMap; import java.util.Map; import java.util.Properties; @@ -77,7 +78,7 @@ import com.google.gson.Gson; * server. * */ -public abstract class ConsoleProxyResource extends ServerResourceBase implements +public class ConsoleProxyResource extends ServerResourceBase implements ServerResource { static final Logger s_logger = Logger.getLogger(ConsoleProxyResource.class); @@ -489,4 +490,26 @@ public abstract class ConsoleProxyResource extends ServerResourceBase implements } } } + + @Override + public void setName(String name) { + } + + @Override + public void setConfigParams(Map params) { + } + + @Override + public Map getConfigParams() { + return new HashMap(); + } + + @Override + public int getRunLevel() { + return 0; + } + + @Override + public void setRunLevel(int level) { + } } diff --git a/server/src/com/cloud/cluster/ClusterManagerImpl.java b/server/src/com/cloud/cluster/ClusterManagerImpl.java index 45d9dca8f91..27e0e0381d2 100755 --- a/server/src/com/cloud/cluster/ClusterManagerImpl.java +++ b/server/src/com/cloud/cluster/ClusterManagerImpl.java @@ -74,6 +74,7 @@ import com.cloud.utils.DateUtil; import com.cloud.utils.NumbersUtil; import com.cloud.utils.Profiler; import com.cloud.utils.PropertiesUtil; +import com.cloud.utils.component.ComponentContext; import com.cloud.utils.component.ComponentLifecycle; import com.cloud.utils.component.ManagerBase; import com.cloud.utils.concurrency.NamedThreadFactory; @@ -364,11 +365,11 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager { try { // schedule a scan task immediately - if (_agentMgr instanceof ClusteredAgentManagerImpl) { + if (ComponentContext.getTargetObject(_agentMgr) instanceof ClusteredAgentManagerImpl) { if (s_logger.isDebugEnabled()) { s_logger.debug("Received notification as part of addHost command to start a host scan task"); } - ClusteredAgentManagerImpl clusteredAgentMgr = (ClusteredAgentManagerImpl)_agentMgr; + ClusteredAgentManagerImpl clusteredAgentMgr = (ClusteredAgentManagerImpl)ComponentContext.getTargetObject(_agentMgr); clusteredAgentMgr.scheduleHostScanTask(); } } catch (Exception e) { diff --git a/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java b/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java index bcefccc3a04..88568819922 100644 --- a/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java +++ b/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java @@ -109,6 +109,7 @@ import com.cloud.user.dao.AccountDao; import com.cloud.user.dao.UserStatisticsDao; import com.cloud.utils.NumbersUtil; import com.cloud.utils.component.AdapterBase; +import com.cloud.utils.component.ComponentContext; import com.cloud.utils.db.DB; import com.cloud.utils.db.GlobalLock; import com.cloud.utils.db.Transaction; @@ -1102,7 +1103,7 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase } NetworkElement element = _networkModel.getElementImplementingProvider(providers.get(0).getName()); - if (!(element instanceof IpDeployer)) { + if (!(ComponentContext.getTargetObject(element) instanceof IpDeployer)) { s_logger.error("The firewall provider for network " + network.getName() + " don't have ability to deploy IP address!"); return null; } diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index a575183a152..ba5ab5d378b 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -129,6 +129,7 @@ import com.cloud.utils.Journal; import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; import com.cloud.utils.component.AdapterBase; +import com.cloud.utils.component.ComponentContext; import com.cloud.utils.component.ManagerBase; import com.cloud.utils.concurrency.NamedThreadFactory; import com.cloud.utils.db.*; @@ -546,10 +547,10 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L } IpDeployer deployer = null; NetworkElement element = _networkModel.getElementImplementingProvider(provider.getName()); - if (!(element instanceof IpDeployingRequester)) { + if (!(ComponentContext.getTargetObject(element) instanceof IpDeployingRequester)) { throw new CloudRuntimeException("Element " + element + " is not a IpDeployingRequester!"); } - deployer = ((IpDeployingRequester)element).getIpDeployer(network); + deployer = ((IpDeployingRequester)ComponentContext.getTargetObject(element)).getIpDeployer(network); if (deployer == null) { throw new CloudRuntimeException("Fail to get ip deployer for element: " + element); } @@ -1529,13 +1530,13 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L if (vmProfile.getType() == Type.User && element.getProvider() != null) { if (_networkModel.areServicesSupportedInNetwork(network.getId(), Service.Dhcp) && _networkModel.isProviderSupportServiceInNetwork(network.getId(), Service.Dhcp, element.getProvider()) && - (element instanceof DhcpServiceProvider)) { + (ComponentContext.getTargetObject(element) instanceof DhcpServiceProvider)) { DhcpServiceProvider sp = (DhcpServiceProvider) element; sp.addDhcpEntry(network, profile, vmProfile, dest, context); } if (_networkModel.areServicesSupportedInNetwork(network.getId(), Service.UserData) && _networkModel.isProviderSupportServiceInNetwork(network.getId(), Service.UserData, element.getProvider()) && - (element instanceof UserDataServiceProvider)) { + (ComponentContext.getTargetObject(element) instanceof UserDataServiceProvider)) { UserDataServiceProvider sp = (UserDataServiceProvider) element; sp.addPasswordAndUserdata(network, profile, vmProfile, dest, context); } @@ -3622,15 +3623,15 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L @Override public StaticNatServiceProvider getStaticNatProviderForNetwork(Network network) { NetworkElement element = getElementForServiceInNetwork(network, Service.StaticNat); - assert element instanceof StaticNatServiceProvider; - return (StaticNatServiceProvider)element; + assert ComponentContext.getTargetObject(element) instanceof StaticNatServiceProvider; + return (StaticNatServiceProvider)ComponentContext.getTargetObject(element); } @Override public LoadBalancingServiceProvider getLoadBalancingProviderForNetwork(Network network) { NetworkElement element = getElementForServiceInNetwork(network, Service.Lb); - assert element instanceof LoadBalancingServiceProvider; - return ( LoadBalancingServiceProvider)element; + assert ComponentContext.getTargetObject(element) instanceof LoadBalancingServiceProvider; + return ( LoadBalancingServiceProvider)ComponentContext.getTargetObject(element); } @Override public boolean isNetworkInlineMode(Network network) { diff --git a/server/src/com/cloud/network/NetworkModelImpl.java b/server/src/com/cloud/network/NetworkModelImpl.java index 05258884db9..e83c0d28ad4 100644 --- a/server/src/com/cloud/network/NetworkModelImpl.java +++ b/server/src/com/cloud/network/NetworkModelImpl.java @@ -92,6 +92,7 @@ import com.cloud.user.Account; import com.cloud.user.DomainManager; import com.cloud.user.dao.AccountDao; import com.cloud.utils.component.AdapterBase; +import com.cloud.utils.component.ComponentContext; import com.cloud.utils.component.Manager; import com.cloud.utils.component.ManagerBase; import com.cloud.utils.db.DB; @@ -398,9 +399,9 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel { Network network = _networksDao.findById(networkId); NetworkElement oldElement = getElementImplementingProvider(oldProvider.getName()); NetworkElement newElement = getElementImplementingProvider(newProvider.getName()); - if (oldElement instanceof IpDeployingRequester && newElement instanceof IpDeployingRequester) { - IpDeployer oldIpDeployer = ((IpDeployingRequester)oldElement).getIpDeployer(network); - IpDeployer newIpDeployer = ((IpDeployingRequester)newElement).getIpDeployer(network); + if (ComponentContext.getTargetObject(oldElement) instanceof IpDeployingRequester && ComponentContext.getTargetObject(newElement) instanceof IpDeployingRequester) { + IpDeployer oldIpDeployer = ((IpDeployingRequester)ComponentContext.getTargetObject(oldElement)).getIpDeployer(network); + IpDeployer newIpDeployer = ((IpDeployingRequester)ComponentContext.getTargetObject(newElement)).getIpDeployer(network); if (!oldIpDeployer.getProvider().getName().equals(newIpDeployer.getProvider().getName())) { throw new InvalidParameterException("There would be multiple providers for IP " + publicIp.getAddress() + "!"); } diff --git a/server/src/com/cloud/network/NetworkServiceImpl.java b/server/src/com/cloud/network/NetworkServiceImpl.java index 87920373013..821aa6db26f 100755 --- a/server/src/com/cloud/network/NetworkServiceImpl.java +++ b/server/src/com/cloud/network/NetworkServiceImpl.java @@ -2175,10 +2175,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { addDefaultSecurityGroupProviderToPhysicalNetwork(pNetwork.getId()); // add VPCVirtualRouter as the defualt network service provider - addDefaultVpcVirtualRouterToPhysicalNetwork(pNetwork.getId()); - - // add baremetal pxe/dhcp provider to the physical network - addDefaultBaremetalProvidersToPhysicalNetwork(pNetwork.getId()); + addDefaultVpcVirtualRouterToPhysicalNetwork(pNetwork.getId()); txn.commit(); return pNetwork; @@ -2984,22 +2981,10 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { throw new CloudRuntimeException("Unable to find the Network Element implementing the VirtualRouter Provider"); } - VirtualRouterElement element = ComponentContext.getTargetObject(networkElement); + VirtualRouterElement element = (VirtualRouterElement)networkElement; element.addElement(nsp.getId(), VirtualRouterProviderType.VirtualRouter); return nsp; - } - - - private PhysicalNetworkServiceProvider addDefaultBaremetalProvidersToPhysicalNetwork(long physicalNetworkId) { - PhysicalNetworkVO pvo = _physicalNetworkDao.findById(physicalNetworkId); - DataCenterVO dvo = _dcDao.findById(pvo.getDataCenterId()); - if (dvo.getNetworkType() == NetworkType.Basic) { - addProviderToPhysicalNetwork(physicalNetworkId, "BaremetalDhcpProvider", null, null); - addProviderToPhysicalNetwork(physicalNetworkId, "BaremetalPxeProvider", null, null); - addProviderToPhysicalNetwork(physicalNetworkId, "BaremetaUserdataProvider", null, null); - } - return null; } protected PhysicalNetworkServiceProvider addDefaultVpcVirtualRouterToPhysicalNetwork(long physicalNetworkId) { @@ -3012,7 +2997,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { throw new CloudRuntimeException("Unable to find the Network Element implementing the VPCVirtualRouter Provider"); } - VpcVirtualRouterElement element = ComponentContext.getTargetObject(networkElement); + VpcVirtualRouterElement element = (VpcVirtualRouterElement)networkElement; element.addElement(nsp.getId(), VirtualRouterProviderType.VPCVirtualRouter); return nsp; diff --git a/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxy.java b/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxy.java index a722d8305a2..b5c29892a7b 100644 --- a/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxy.java +++ b/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxy.java @@ -425,23 +425,32 @@ public class ConsoleProxy { synchronized (connectionMap) { ConsoleProxyClient viewer = connectionMap.get(clientKey); if (viewer == null) { + authenticationExternally(param); viewer = new ConsoleProxyVncClient(); viewer.initClient(param); connectionMap.put(clientKey, viewer); s_logger.info("Added viewer object " + viewer); reportLoadChange = true; - } else if (!viewer.isFrontEndAlive()) { - s_logger.info("The rfb thread died, reinitializing the viewer " + viewer); - viewer.initClient(param); - } else if (!param.getClientHostPassword().equals(viewer.getClientHostPassword())) { - s_logger.warn("Bad sid detected(VNC port may be reused). sid in session: " - + viewer.getClientHostPassword() + ", sid in request: " + param.getClientHostPassword()); - viewer.initClient(param); - } else { - if(ajaxSession == null || ajaxSession.isEmpty()) + } else { + // protected against malicous attack by modifying URL content + if(ajaxSession != null) { + long ajaxSessionIdFromUrl = Long.parseLong(ajaxSession); + if(ajaxSessionIdFromUrl != viewer.getAjaxSessionId()) + throw new AuthenticationException ("Cannot use the existing viewer " + + viewer + ": modified AJAX session id"); + } + + if(param.getClientHostPassword() == null || param.getClientHostPassword().isEmpty() || !param.getClientHostPassword().equals(viewer.getClientHostPassword())) + throw new AuthenticationException ("Cannot use the existing viewer " + + viewer + ": bad sid"); + + if(!viewer.isFrontEndAlive()) { authenticationExternally(param); - } + viewer.initClient(param); + reportLoadChange = true; + } + } if(reportLoadChange) { ConsoleProxyClientStatsCollector statsCollector = getStatsCollector(); diff --git a/utils/src/com/cloud/utils/component/AdapterBase.java b/utils/src/com/cloud/utils/component/AdapterBase.java index 405762d64f1..a8f4f468090 100644 --- a/utils/src/com/cloud/utils/component/AdapterBase.java +++ b/utils/src/com/cloud/utils/component/AdapterBase.java @@ -27,7 +27,7 @@ public class AdapterBase extends ComponentLifecycleBase implements Adapter { public static T getAdapterByName(List adapters, String name) { for(T adapter : adapters) { if(adapter.getName() != null && adapter.getName().equalsIgnoreCase(name)) - return adapter; + return ComponentContext.getTargetObject(adapter); } return null; } diff --git a/utils/src/com/cloud/utils/component/ComponentContext.java b/utils/src/com/cloud/utils/component/ComponentContext.java index e598b851e77..82fe90db2f8 100644 --- a/utils/src/com/cloud/utils/component/ComponentContext.java +++ b/utils/src/com/cloud/utils/component/ComponentContext.java @@ -214,7 +214,7 @@ public class ComponentContext implements ApplicationContextAware { return (T)instance; } - + public static T inject(Class clz) { T instance = s_appContext.getAutowireCapableBeanFactory().createBean(clz); return instance; From cc91d826df5a0fecaf24464446a8ddbdf1867b06 Mon Sep 17 00:00:00 2001 From: Kelven Yang Date: Tue, 5 Mar 2013 14:23:23 -0500 Subject: [PATCH 11/26] Fix conflicts in storage subsystem with Spring --- .../orchestration/CloudOrchestrator.java | 20 +- .../store/DefaultImageDataStoreImpl.java | 2 +- .../storage/image/store/TemplateObject.java | 2 +- .../storage/snapshot/SnapshotObject.java | 2 +- .../storage/db/ObjectInDataStoreDaoImpl.java | 2 + .../storage/image/db/ImageDataDaoImpl.java | 975 ------------------ .../datastore/DefaultPrimaryDataStore.java | 2 +- .../storage/volume/VolumeEntityImpl.java | 2 +- .../storage/volume/VolumeObject.java | 2 +- .../utils/component/ComponentContext.java | 26 +- 10 files changed, 23 insertions(+), 1012 deletions(-) delete mode 100644 engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataDaoImpl.java diff --git a/engine/orchestration/src/org/apache/cloudstack/platform/orchestration/CloudOrchestrator.java b/engine/orchestration/src/org/apache/cloudstack/platform/orchestration/CloudOrchestrator.java index 6085c61cd34..c07931befc8 100755 --- a/engine/orchestration/src/org/apache/cloudstack/platform/orchestration/CloudOrchestrator.java +++ b/engine/orchestration/src/org/apache/cloudstack/platform/orchestration/CloudOrchestrator.java @@ -25,11 +25,9 @@ import java.util.Map; import javax.inject.Inject; -import org.apache.cloudstack.api.BaseCmd; import org.apache.cloudstack.engine.cloud.entity.api.NetworkEntity; import org.apache.cloudstack.engine.cloud.entity.api.TemplateEntity; import org.apache.cloudstack.engine.cloud.entity.api.VirtualMachineEntity; -import org.apache.cloudstack.engine.cloud.entity.api.VirtualMachineEntityFactory; import org.apache.cloudstack.engine.cloud.entity.api.VirtualMachineEntityImpl; import org.apache.cloudstack.engine.cloud.entity.api.VMEntityManager; import org.apache.cloudstack.engine.cloud.entity.api.VolumeEntity; @@ -90,6 +88,8 @@ public class CloudOrchestrator implements OrchestrationService { @Inject protected AccountDao _accountDao = null; + public CloudOrchestrator() { + } public VirtualMachineEntity createFromScratch(String uuid, String iso, String os, String hypervisor, String hostName, int cpu, int speed, long memory, List networks, List computeTags, Map details, String owner) { @@ -171,12 +171,7 @@ public class CloudOrchestrator implements OrchestrationService { } } - VirtualMachineEntityImpl vmEntity = null; - try { - vmEntity = _vmEntityFactory.getObject(); - } catch (Exception e) { - // add error handling here - } + VirtualMachineEntityImpl vmEntity = ComponentContext.inject(VirtualMachineEntityImpl.class); vmEntity.init(id, owner, hostName, displayName, cpu, speed, memory, computeTags, rootDiskTags, new ArrayList(networkNicMap.keySet())); @@ -225,14 +220,7 @@ public class CloudOrchestrator implements OrchestrationService { List computeTags, List rootDiskTags, Map networkNicMap, DeploymentPlan plan) throws InsufficientCapacityException { // VirtualMachineEntityImpl vmEntity = new VirtualMachineEntityImpl(id, owner, hostName, displayName, cpu, speed, memory, computeTags, rootDiskTags, networks, vmEntityManager); - VirtualMachineEntityImpl vmEntity = null; - try { - vmEntity = VirtualMachineEntityImpl.class.newInstance(); - vmEntity = ComponentContext.inject(vmEntity); - - } catch (Exception e) { - // add error handling here - } + VirtualMachineEntityImpl vmEntity = ComponentContext.inject(VirtualMachineEntityImpl.class); vmEntity.init(id, owner, hostName, displayName, cpu, speed, memory, computeTags, rootDiskTags, new ArrayList(networkNicMap.keySet())); //load vm instance and offerings and call virtualMachineManagerImpl diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/DefaultImageDataStoreImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/DefaultImageDataStoreImpl.java index d159f741584..a6e961a0a83 100644 --- a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/DefaultImageDataStoreImpl.java +++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/DefaultImageDataStoreImpl.java @@ -51,7 +51,7 @@ public class DefaultImageDataStoreImpl implements ImageDataStore { protected ImageDataStoreProvider provider; boolean needDownloadToCacheStorage = false; - protected DefaultImageDataStoreImpl() { + public DefaultImageDataStoreImpl() { } diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/TemplateObject.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/TemplateObject.java index 85bc0c118a0..b6c20046c1c 100644 --- a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/TemplateObject.java +++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/TemplateObject.java @@ -53,7 +53,7 @@ public class TemplateObject implements TemplateInfo { ObjectInDataStoreManager ojbectInStoreMgr; @Inject VMTemplatePoolDao templatePoolDao; - protected TemplateObject() { + public TemplateObject() { } protected void configure(VMTemplateVO template, DataStore dataStore) { 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 a82be6de01d..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 @@ -53,7 +53,7 @@ public class SnapshotObject implements SnapshotInfo { @Inject protected SnapshotStateMachineManager stateMachineMgr; @Inject ObjectInDataStoreManager ojbectInStoreMgr; - protected SnapshotObject() { + public SnapshotObject() { } diff --git a/engine/storage/src/org/apache/cloudstack/storage/db/ObjectInDataStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/db/ObjectInDataStoreDaoImpl.java index 50dc984d49b..9965d60b23d 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/db/ObjectInDataStoreDaoImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/db/ObjectInDataStoreDaoImpl.java @@ -38,6 +38,8 @@ public class ObjectInDataStoreDaoImpl extends GenericDaoBase updateStateSearch; @Override public boolean configure(String name, Map params) throws ConfigurationException { + super.configure(name, params); + updateStateSearch = this.createSearchBuilder(); updateStateSearch.and("id", updateStateSearch.entity().getId(), Op.EQ); updateStateSearch.and("state", updateStateSearch.entity().getState(), Op.EQ); diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataDaoImpl.java deleted file mode 100644 index f43f18d0e6d..00000000000 --- a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataDaoImpl.java +++ /dev/null @@ -1,975 +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.image.db; - -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashSet; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.inject.Inject; -import javax.naming.ConfigurationException; - -import org.apache.cloudstack.storage.image.TemplateEvent; -import org.apache.cloudstack.storage.image.TemplateState; -import org.apache.cloudstack.storage.image.format.ISO; -import org.apache.log4j.Logger; -import org.springframework.stereotype.Component; - -import com.cloud.configuration.dao.ConfigurationDao; -import com.cloud.dc.dao.DataCenterDao; -import com.cloud.domain.DomainVO; -import com.cloud.domain.dao.DomainDao; -import com.cloud.host.Host; -import com.cloud.host.HostVO; -import com.cloud.host.dao.HostDao; -import com.cloud.hypervisor.Hypervisor.HypervisorType; -import com.cloud.projects.Project.ListProjectResourcesCriteria; -import com.cloud.server.ResourceTag.TaggedResourceType; -import com.cloud.storage.Storage; -import com.cloud.storage.Storage.TemplateType; -import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; -import com.cloud.storage.VMTemplateZoneVO; -import com.cloud.storage.dao.VMTemplateDaoImpl; -import com.cloud.storage.dao.VMTemplateDetailsDao; -import com.cloud.storage.dao.VMTemplateZoneDao; -import com.cloud.tags.ResourceTagVO; -import com.cloud.tags.dao.ResourceTagDao; -import com.cloud.tags.dao.ResourceTagsDaoImpl; -import com.cloud.template.VirtualMachineTemplate.TemplateFilter; -import com.cloud.user.Account; -import com.cloud.utils.Pair; -import com.cloud.utils.db.DB; -import com.cloud.utils.db.Filter; -import com.cloud.utils.db.GenericDaoBase; -import com.cloud.utils.db.GenericSearchBuilder; -import com.cloud.utils.db.JoinBuilder; -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.db.UpdateBuilder; -import com.cloud.utils.exception.CloudRuntimeException; - -@Component -public class ImageDataDaoImpl extends GenericDaoBase implements ImageDataDao { - private static final Logger s_logger = Logger.getLogger(VMTemplateDaoImpl.class); - - @Inject - VMTemplateZoneDao templateZoneDao; - @Inject - VMTemplateDetailsDao templateDetailsDao; - - @Inject - ConfigurationDao configDao; - @Inject - HostDao hostDao; - @Inject - DomainDao domainDao; - @Inject - DataCenterDao dcDao; - - private final String SELECT_TEMPLATE_HOST_REF = "SELECT t.id, h.data_center_id, t.unique_name, t.name, t.public, t.featured, t.type, t.hvm, t.bits, t.url, t.format, t.created, t.account_id, " - + "t.checksum, t.display_text, t.enable_password, t.guest_os_id, t.bootable, t.prepopulate, t.cross_zones, t.hypervisor_type FROM vm_template t"; - - private final String SELECT_TEMPLATE_ZONE_REF = "SELECT t.id, tzr.zone_id, t.unique_name, t.name, t.public, t.featured, t.type, t.hvm, t.bits, t.url, t.format, t.created, t.account_id, " - + "t.checksum, t.display_text, t.enable_password, t.guest_os_id, t.bootable, t.prepopulate, t.cross_zones, t.hypervisor_type FROM vm_template t INNER JOIN template_zone_ref tzr on (t.id = tzr.template_id) "; - - private final String SELECT_TEMPLATE_SWIFT_REF = "SELECT t.id, t.unique_name, t.name, t.public, t.featured, t.type, t.hvm, t.bits, t.url, t.format, t.created, t.account_id, " - + "t.checksum, t.display_text, t.enable_password, t.guest_os_id, t.bootable, t.prepopulate, t.cross_zones, t.hypervisor_type FROM vm_template t"; - protected SearchBuilder TemplateNameSearch; - protected SearchBuilder UniqueNameSearch; - protected SearchBuilder tmpltTypeSearch; - protected SearchBuilder tmpltTypeHyperSearch; - protected SearchBuilder tmpltTypeHyperSearch2; - - protected SearchBuilder AccountIdSearch; - protected SearchBuilder NameSearch; - protected SearchBuilder TmpltsInZoneSearch; - private SearchBuilder PublicSearch; - private SearchBuilder NameAccountIdSearch; - private SearchBuilder PublicIsoSearch; - private SearchBuilder UserIsoSearch; - private GenericSearchBuilder CountTemplatesByAccount; - private SearchBuilder updateStateSearch; - - @Inject - ResourceTagDao _tagsDao = null; - private String routerTmpltName; - private String consoleProxyTmpltName; - - protected ImageDataDaoImpl() { - } - - @Override - public List listByPublic() { - SearchCriteria sc = PublicSearch.create(); - sc.setParameters("public", 1); - return listBy(sc); - } - - @Override - public ImageDataVO findByName(String templateName) { - SearchCriteria sc = UniqueNameSearch.create(); - sc.setParameters("uniqueName", templateName); - return findOneIncludingRemovedBy(sc); - } - - @Override - public ImageDataVO findByTemplateName(String templateName) { - SearchCriteria sc = NameSearch.create(); - sc.setParameters("name", templateName); - return findOneIncludingRemovedBy(sc); - } - - @Override - public List publicIsoSearch(Boolean bootable, boolean listRemoved, Map tags) { - - SearchBuilder sb = null; - if (tags == null || tags.isEmpty()) { - sb = PublicIsoSearch; - } else { - sb = createSearchBuilder(); - sb.and("public", sb.entity().isPublicTemplate(), SearchCriteria.Op.EQ); - sb.and("format", sb.entity().getFormat(), SearchCriteria.Op.EQ); - sb.and("type", sb.entity().getTemplateType(), SearchCriteria.Op.EQ); - sb.and("bootable", sb.entity().isBootable(), SearchCriteria.Op.EQ); - sb.and("removed", sb.entity().getRemoved(), SearchCriteria.Op.EQ); - - SearchBuilder tagSearch = _tagsDao.createSearchBuilder(); - for (int count = 0; count < tags.size(); count++) { - tagSearch.or().op("key" + String.valueOf(count), tagSearch.entity().getKey(), SearchCriteria.Op.EQ); - tagSearch.and("value" + String.valueOf(count), tagSearch.entity().getValue(), SearchCriteria.Op.EQ); - tagSearch.cp(); - } - tagSearch.and("resourceType", tagSearch.entity().getResourceType(), SearchCriteria.Op.EQ); - sb.groupBy(sb.entity().getId()); - sb.join("tagSearch", tagSearch, sb.entity().getId(), tagSearch.entity().getResourceId(), JoinBuilder.JoinType.INNER); - } - - SearchCriteria sc = sb.create(); - - sc.setParameters("public", 1); - sc.setParameters("format", "ISO"); - sc.setParameters("type", TemplateType.PERHOST.toString()); - if (bootable != null) { - sc.setParameters("bootable", bootable); - } - - if (!listRemoved) { - sc.setParameters("removed", (Object) null); - } - - if (tags != null && !tags.isEmpty()) { - int count = 0; - sc.setJoinParameters("tagSearch", "resourceType", TaggedResourceType.ISO.toString()); - for (String key : tags.keySet()) { - sc.setJoinParameters("tagSearch", "key" + String.valueOf(count), key); - sc.setJoinParameters("tagSearch", "value" + String.valueOf(count), tags.get(key)); - count++; - } - } - - return listBy(sc); - } - - @Override - public List userIsoSearch(boolean listRemoved) { - - SearchBuilder sb = null; - sb = UserIsoSearch; - SearchCriteria sc = sb.create(); - - sc.setParameters("format", Storage.ImageFormat.ISO); - sc.setParameters("type", TemplateType.USER.toString()); - - if (!listRemoved) { - sc.setParameters("removed", (Object) null); - } - - return listBy(sc); - } - - @Override - public List listAllSystemVMTemplates() { - SearchCriteria sc = tmpltTypeSearch.create(); - sc.setParameters("templateType", Storage.TemplateType.SYSTEM); - - Filter filter = new Filter(ImageDataVO.class, "id", false, null, null); - return listBy(sc, filter); - } - - @Override - public List listPrivateTemplatesByHost(Long hostId) { - - String sql = "select * from template_host_ref as thr INNER JOIN vm_template as t ON t.id=thr.template_id " - + "where thr.host_id=? and t.public=0 and t.featured=0 and t.type='USER' and t.removed is NULL"; - - List l = new ArrayList(); - - Transaction txn = Transaction.currentTxn(); - - PreparedStatement pstmt = null; - try { - pstmt = txn.prepareAutoCloseStatement(sql); - pstmt.setLong(1, hostId); - ResultSet rs = pstmt.executeQuery(); - while (rs.next()) { - l.add(rs.getLong(1)); - } - } catch (SQLException e) { - } catch (Throwable e) { - } - return l; - } - - @Override - public List listReadyTemplates() { - SearchCriteria sc = createSearchCriteria(); - sc.addAnd("ready", SearchCriteria.Op.EQ, true); - sc.addAnd("format", SearchCriteria.Op.NEQ, Storage.ImageFormat.ISO); - return listIncludingRemovedBy(sc); - } - - @Override - public List findIsosByIdAndPath(Long domainId, Long accountId, String path) { - SearchCriteria sc = createSearchCriteria(); - sc.addAnd("iso", SearchCriteria.Op.EQ, true); - if (domainId != null) { - sc.addAnd("domainId", SearchCriteria.Op.EQ, domainId); - } - if (accountId != null) { - sc.addAnd("accountId", SearchCriteria.Op.EQ, accountId); - } - if (path != null) { - sc.addAnd("path", SearchCriteria.Op.EQ, path); - } - return listIncludingRemovedBy(sc); - } - - @Override - public List listByAccountId(long accountId) { - SearchCriteria sc = AccountIdSearch.create(); - sc.setParameters("accountId", accountId); - return listBy(sc); - } - - @Override - public List listByHypervisorType(List hyperTypes) { - SearchCriteria sc = createSearchCriteria(); - hyperTypes.add(HypervisorType.None); - sc.addAnd("hypervisorType", SearchCriteria.Op.IN, hyperTypes.toArray()); - return listBy(sc); - } - - @Override - public boolean configure(String name, Map params) throws ConfigurationException { - boolean result = super.configure(name, params); - - PublicSearch = createSearchBuilder(); - PublicSearch.and("public", PublicSearch.entity().isPublicTemplate(), SearchCriteria.Op.EQ); - - routerTmpltName = (String) params.get("routing.uniquename"); - - s_logger.debug("Found parameter routing unique name " + routerTmpltName); - if (routerTmpltName == null) { - routerTmpltName = "routing"; - } - - consoleProxyTmpltName = (String) params.get("consoleproxy.uniquename"); - if (consoleProxyTmpltName == null) { - consoleProxyTmpltName = "routing"; - } - if (s_logger.isDebugEnabled()) { - s_logger.debug("Use console proxy template : " + consoleProxyTmpltName); - } - - UniqueNameSearch = createSearchBuilder(); - UniqueNameSearch.and("uniqueName", UniqueNameSearch.entity().getUniqueName(), SearchCriteria.Op.EQ); - NameSearch = createSearchBuilder(); - NameSearch.and("name", NameSearch.entity().getName(), SearchCriteria.Op.EQ); - - NameAccountIdSearch = createSearchBuilder(); - NameAccountIdSearch.and("name", NameAccountIdSearch.entity().getName(), SearchCriteria.Op.EQ); - NameAccountIdSearch.and("accountId", NameAccountIdSearch.entity().getAccountId(), SearchCriteria.Op.EQ); - - PublicIsoSearch = createSearchBuilder(); - PublicIsoSearch.and("public", PublicIsoSearch.entity().isPublicTemplate(), SearchCriteria.Op.EQ); - PublicIsoSearch.and("format", PublicIsoSearch.entity().getFormat(), SearchCriteria.Op.EQ); - PublicIsoSearch.and("type", PublicIsoSearch.entity().getTemplateType(), SearchCriteria.Op.EQ); - PublicIsoSearch.and("bootable", PublicIsoSearch.entity().isBootable(), SearchCriteria.Op.EQ); - PublicIsoSearch.and("removed", PublicIsoSearch.entity().getRemoved(), SearchCriteria.Op.EQ); - - UserIsoSearch = createSearchBuilder(); - UserIsoSearch.and("format", UserIsoSearch.entity().getFormat(), SearchCriteria.Op.EQ); - UserIsoSearch.and("type", UserIsoSearch.entity().getTemplateType(), SearchCriteria.Op.EQ); - UserIsoSearch.and("removed", UserIsoSearch.entity().getRemoved(), SearchCriteria.Op.EQ); - - tmpltTypeHyperSearch = createSearchBuilder(); - tmpltTypeHyperSearch.and("templateType", tmpltTypeHyperSearch.entity().getTemplateType(), SearchCriteria.Op.EQ); - SearchBuilder hostHyperSearch = hostDao.createSearchBuilder(); - hostHyperSearch.and("type", hostHyperSearch.entity().getType(), SearchCriteria.Op.EQ); - hostHyperSearch.and("zoneId", hostHyperSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); - hostHyperSearch.groupBy(hostHyperSearch.entity().getHypervisorType()); - - tmpltTypeHyperSearch.join("tmplHyper", hostHyperSearch, hostHyperSearch.entity().getHypervisorType(), tmpltTypeHyperSearch.entity().getHypervisorType(), JoinBuilder.JoinType.INNER); - hostHyperSearch.done(); - tmpltTypeHyperSearch.done(); - - tmpltTypeHyperSearch2 = createSearchBuilder(); - tmpltTypeHyperSearch2.and("templateType", tmpltTypeHyperSearch2.entity().getTemplateType(), SearchCriteria.Op.EQ); - tmpltTypeHyperSearch2.and("hypervisorType", tmpltTypeHyperSearch2.entity().getHypervisorType(), SearchCriteria.Op.EQ); - - tmpltTypeSearch = createSearchBuilder(); - tmpltTypeSearch.and("removed", tmpltTypeSearch.entity().getRemoved(), SearchCriteria.Op.NULL); - tmpltTypeSearch.and("templateType", tmpltTypeSearch.entity().getTemplateType(), SearchCriteria.Op.EQ); - - AccountIdSearch = createSearchBuilder(); - AccountIdSearch.and("accountId", AccountIdSearch.entity().getAccountId(), SearchCriteria.Op.EQ); - AccountIdSearch.and("publicTemplate", AccountIdSearch.entity().isPublicTemplate(), SearchCriteria.Op.EQ); - AccountIdSearch.done(); - - SearchBuilder tmpltZoneSearch = templateZoneDao.createSearchBuilder(); - tmpltZoneSearch.and("removed", tmpltZoneSearch.entity().getRemoved(), SearchCriteria.Op.NULL); - tmpltZoneSearch.and("zoneId", tmpltZoneSearch.entity().getZoneId(), SearchCriteria.Op.EQ); - - TmpltsInZoneSearch = createSearchBuilder(); - TmpltsInZoneSearch.and("removed", TmpltsInZoneSearch.entity().getRemoved(), SearchCriteria.Op.NULL); - TmpltsInZoneSearch.and().op("avoidtype", TmpltsInZoneSearch.entity().getTemplateType(), SearchCriteria.Op.NEQ); - TmpltsInZoneSearch.or("templateType", TmpltsInZoneSearch.entity().getTemplateType(), SearchCriteria.Op.NULL); - TmpltsInZoneSearch.cp(); - TmpltsInZoneSearch.join("tmpltzone", tmpltZoneSearch, tmpltZoneSearch.entity().getTemplateId(), TmpltsInZoneSearch.entity().getId(), JoinBuilder.JoinType.INNER); - tmpltZoneSearch.done(); - TmpltsInZoneSearch.done(); - - CountTemplatesByAccount = createSearchBuilder(Long.class); - CountTemplatesByAccount.select(null, Func.COUNT, null); - CountTemplatesByAccount.and("account", CountTemplatesByAccount.entity().getAccountId(), SearchCriteria.Op.EQ); - CountTemplatesByAccount.and("removed", CountTemplatesByAccount.entity().getRemoved(), SearchCriteria.Op.NULL); - CountTemplatesByAccount.done(); - - updateStateSearch = this.createSearchBuilder(); - updateStateSearch.and("id", updateStateSearch.entity().getId(), Op.EQ); - updateStateSearch.and("state", updateStateSearch.entity().getState(), Op.EQ); - updateStateSearch.and("updatedCount", updateStateSearch.entity().getUpdatedCount(), Op.EQ); - updateStateSearch.done(); - return result; - } - - @Override - public String getRoutingTemplateUniqueName() { - return routerTmpltName; - } - - @Override - public Set> searchSwiftTemplates(String name, String keyword, TemplateFilter templateFilter, boolean isIso, List hypers, Boolean bootable, DomainVO domain, - Long pageSize, Long startIndex, Long zoneId, HypervisorType hyperType, boolean onlyReady, boolean showDomr, List permittedAccounts, Account caller, Map tags) { - - StringBuilder builder = new StringBuilder(); - if (!permittedAccounts.isEmpty()) { - for (Account permittedAccount : permittedAccounts) { - builder.append(permittedAccount.getAccountId() + ","); - } - } - - String permittedAccountsStr = builder.toString(); - - if (permittedAccountsStr.length() > 0) { - // chop the "," off - permittedAccountsStr = permittedAccountsStr.substring(0, permittedAccountsStr.length() - 1); - } - - Transaction txn = Transaction.currentTxn(); - txn.start(); - - Set> templateZonePairList = new HashSet>(); - PreparedStatement pstmt = null; - ResultSet rs = null; - String sql = SELECT_TEMPLATE_SWIFT_REF; - try { - String joinClause = ""; - String whereClause = " WHERE t.removed IS NULL"; - - if (isIso) { - whereClause += " AND t.format = 'ISO'"; - if (!hyperType.equals(HypervisorType.None)) { - joinClause = " INNER JOIN guest_os guestOS on (guestOS.id = t.guest_os_id) INNER JOIN guest_os_hypervisor goh on ( goh.guest_os_id = guestOS.id) "; - whereClause += " AND goh.hypervisor_type = '" + hyperType.toString() + "'"; - } - } else { - whereClause += " AND t.format <> 'ISO'"; - if (hypers.isEmpty()) { - return templateZonePairList; - } else { - StringBuilder relatedHypers = new StringBuilder(); - for (HypervisorType hyper : hypers) { - relatedHypers.append("'"); - relatedHypers.append(hyper.toString()); - relatedHypers.append("'"); - relatedHypers.append(","); - } - relatedHypers.setLength(relatedHypers.length() - 1); - whereClause += " AND t.hypervisor_type IN (" + relatedHypers + ")"; - } - } - joinClause += " INNER JOIN template_swift_ref tsr on (t.id = tsr.template_id)"; - if (keyword != null) { - whereClause += " AND t.name LIKE \"%" + keyword + "%\""; - } else if (name != null) { - whereClause += " AND t.name LIKE \"%" + name + "%\""; - } - - if (bootable != null) { - whereClause += " AND t.bootable = " + bootable; - } - - if (!showDomr) { - whereClause += " AND t.type != '" + Storage.TemplateType.SYSTEM.toString() + "'"; - } - - if (templateFilter == TemplateFilter.featured) { - whereClause += " AND t.public = 1 AND t.featured = 1"; - } else if ((templateFilter == TemplateFilter.self || templateFilter == TemplateFilter.selfexecutable) && caller.getType() != Account.ACCOUNT_TYPE_ADMIN) { - if (caller.getType() == Account.ACCOUNT_TYPE_DOMAIN_ADMIN || caller.getType() == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN) { - joinClause += " INNER JOIN account a on (t.account_id = a.id) INNER JOIN domain d on (a.domain_id = d.id)"; - whereClause += " AND d.path LIKE '" + domain.getPath() + "%'"; - } else { - whereClause += " AND t.account_id IN (" + permittedAccountsStr + ")"; - } - } else if (templateFilter == TemplateFilter.sharedexecutable && caller.getType() != Account.ACCOUNT_TYPE_ADMIN) { - if (caller.getType() == Account.ACCOUNT_TYPE_NORMAL) { - joinClause += " LEFT JOIN launch_permission lp ON t.id = lp.template_id WHERE" + " (t.account_id IN (" + permittedAccountsStr + ") OR" + " lp.account_id IN (" - + permittedAccountsStr + "))"; - } else { - joinClause += " INNER JOIN account a on (t.account_id = a.id) "; - } - } else if (templateFilter == TemplateFilter.executable && !permittedAccounts.isEmpty()) { - whereClause += " AND (t.public = 1 OR t.account_id IN (" + permittedAccountsStr + "))"; - } else if (templateFilter == TemplateFilter.community) { - whereClause += " AND t.public = 1 AND t.featured = 0"; - } else if (templateFilter == TemplateFilter.all && caller.getType() == Account.ACCOUNT_TYPE_ADMIN) { - } else if (caller.getType() != Account.ACCOUNT_TYPE_ADMIN) { - return templateZonePairList; - } - - sql += joinClause + whereClause + getOrderByLimit(pageSize, startIndex); - pstmt = txn.prepareStatement(sql); - rs = pstmt.executeQuery(); - while (rs.next()) { - Pair templateZonePair = new Pair(rs.getLong(1), -1L); - templateZonePairList.add(templateZonePair); - } - - } catch (Exception e) { - s_logger.warn("Error listing templates", e); - } finally { - try { - if (rs != null) { - rs.close(); - } - if (pstmt != null) { - pstmt.close(); - } - txn.commit(); - } catch (SQLException sqle) { - s_logger.warn("Error in cleaning up", sqle); - } - } - - return templateZonePairList; - } - - @Override - public Set> searchTemplates(String name, String keyword, TemplateFilter templateFilter, boolean isIso, List hypers, Boolean bootable, DomainVO domain, - Long pageSize, Long startIndex, Long zoneId, HypervisorType hyperType, boolean onlyReady, boolean showDomr, List permittedAccounts, Account caller, - ListProjectResourcesCriteria listProjectResourcesCriteria, Map tags) { - StringBuilder builder = new StringBuilder(); - if (!permittedAccounts.isEmpty()) { - for (Account permittedAccount : permittedAccounts) { - builder.append(permittedAccount.getAccountId() + ","); - } - } - - String permittedAccountsStr = builder.toString(); - - if (permittedAccountsStr.length() > 0) { - // chop the "," off - permittedAccountsStr = permittedAccountsStr.substring(0, permittedAccountsStr.length() - 1); - } - - Transaction txn = Transaction.currentTxn(); - txn.start(); - - /* Use LinkedHashSet here to guarantee iteration order */ - Set> templateZonePairList = new LinkedHashSet>(); - PreparedStatement pstmt = null; - ResultSet rs = null; - StringBuilder relatedDomainIds = new StringBuilder(); - String sql = SELECT_TEMPLATE_ZONE_REF; - String groupByClause = ""; - try { - // short accountType; - // String accountId = null; - String guestOSJoin = ""; - StringBuilder templateHostRefJoin = new StringBuilder(); - String dataCenterJoin = "", lpjoin = ""; - String tagsJoin = ""; - - if (isIso && !hyperType.equals(HypervisorType.None)) { - guestOSJoin = " INNER JOIN guest_os guestOS on (guestOS.id = t.guest_os_id) INNER JOIN guest_os_hypervisor goh on ( goh.guest_os_id = guestOS.id) "; - } - if (onlyReady) { - templateHostRefJoin.append(" INNER JOIN template_host_ref thr on (t.id = thr.template_id) INNER JOIN host h on (thr.host_id = h.id)"); - sql = SELECT_TEMPLATE_HOST_REF; - groupByClause = " GROUP BY t.id, h.data_center_id "; - } - if ((templateFilter == TemplateFilter.featured) || (templateFilter == TemplateFilter.community)) { - dataCenterJoin = " INNER JOIN data_center dc on (h.data_center_id = dc.id)"; - } - - if (templateFilter == TemplateFilter.sharedexecutable) { - lpjoin = " INNER JOIN launch_permission lp ON t.id = lp.template_id "; - } - - if (tags != null && !tags.isEmpty()) { - tagsJoin = " INNER JOIN resource_tags r ON t.id = r.resource_id "; - } - - sql += guestOSJoin + templateHostRefJoin + dataCenterJoin + lpjoin + tagsJoin; - String whereClause = ""; - - // All joins have to be made before we start setting the condition - // settings - if ((listProjectResourcesCriteria == ListProjectResourcesCriteria.SkipProjectResources || (!permittedAccounts.isEmpty() && !(templateFilter == TemplateFilter.community || templateFilter == TemplateFilter.featured))) - && !(caller.getType() != Account.ACCOUNT_TYPE_NORMAL && templateFilter == TemplateFilter.all)) { - whereClause += " INNER JOIN account a on (t.account_id = a.id)"; - if ((templateFilter == TemplateFilter.self || templateFilter == TemplateFilter.selfexecutable) - && (caller.getType() == Account.ACCOUNT_TYPE_DOMAIN_ADMIN || caller.getType() == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN)) { - whereClause += " INNER JOIN domain d on (a.domain_id = d.id) WHERE d.path LIKE '" + domain.getPath() + "%'"; - if (listProjectResourcesCriteria == ListProjectResourcesCriteria.SkipProjectResources) { - whereClause += " AND a.type != " + Account.ACCOUNT_TYPE_PROJECT; - } - } else if (listProjectResourcesCriteria == ListProjectResourcesCriteria.SkipProjectResources) { - whereClause += " WHERE a.type != " + Account.ACCOUNT_TYPE_PROJECT; - } - } - - if (!permittedAccounts.isEmpty()) { - for (Account account : permittedAccounts) { - // accountType = account.getType(); - // accountId = Long.toString(account.getId()); - DomainVO accountDomain = domainDao.findById(account.getDomainId()); - - // get all parent domain ID's all the way till root domain - DomainVO domainTreeNode = accountDomain; - while (true) { - relatedDomainIds.append(domainTreeNode.getId()); - relatedDomainIds.append(","); - if (domainTreeNode.getParent() != null) { - domainTreeNode = domainDao.findById(domainTreeNode.getParent()); - } else { - break; - } - } - - // get all child domain ID's - if (isAdmin(account.getType())) { - List allChildDomains = domainDao.findAllChildren(accountDomain.getPath(), accountDomain.getId()); - for (DomainVO childDomain : allChildDomains) { - relatedDomainIds.append(childDomain.getId()); - relatedDomainIds.append(","); - } - } - relatedDomainIds.setLength(relatedDomainIds.length() - 1); - } - } - - String attr = " AND "; - if (whereClause.endsWith(" WHERE ")) { - attr += " WHERE "; - } - - if (!isIso) { - if (hypers.isEmpty()) { - return templateZonePairList; - } else { - StringBuilder relatedHypers = new StringBuilder(); - for (HypervisorType hyper : hypers) { - relatedHypers.append("'"); - relatedHypers.append(hyper.toString()); - relatedHypers.append("'"); - relatedHypers.append(","); - } - relatedHypers.setLength(relatedHypers.length() - 1); - whereClause += attr + " t.hypervisor_type IN (" + relatedHypers + ")"; - } - } - - if (!permittedAccounts.isEmpty() && !(templateFilter == TemplateFilter.featured || templateFilter == TemplateFilter.community || templateFilter == TemplateFilter.executable) - && !isAdmin(caller.getType())) { - whereClause += attr + "t.account_id IN (" + permittedAccountsStr + ")"; - } - - if (templateFilter == TemplateFilter.featured) { - whereClause += attr + "t.public = 1 AND t.featured = 1"; - if (!permittedAccounts.isEmpty()) { - whereClause += attr + "(dc.domain_id IN (" + relatedDomainIds + ") OR dc.domain_id is NULL)"; - } - } else if (templateFilter == TemplateFilter.self || templateFilter == TemplateFilter.selfexecutable) { - whereClause += " AND t.account_id IN (" + permittedAccountsStr + ")"; - } else if (templateFilter == TemplateFilter.sharedexecutable) { - whereClause += " AND " + " (t.account_id IN (" + permittedAccountsStr + ") OR" + " lp.account_id IN (" + permittedAccountsStr + "))"; - } else if (templateFilter == TemplateFilter.executable && !permittedAccounts.isEmpty()) { - whereClause += attr + "(t.public = 1 OR t.account_id IN (" + permittedAccountsStr + "))"; - } else if (templateFilter == TemplateFilter.community) { - whereClause += attr + "t.public = 1 AND t.featured = 0"; - if (!permittedAccounts.isEmpty()) { - whereClause += attr + "(dc.domain_id IN (" + relatedDomainIds + ") OR dc.domain_id is NULL)"; - } - } else if (caller.getType() != Account.ACCOUNT_TYPE_ADMIN && !isIso) { - return templateZonePairList; - } - - if (tags != null && !tags.isEmpty()) { - whereClause += " AND ("; - boolean first = true; - for (String key : tags.keySet()) { - if (!first) { - whereClause += " OR "; - } - whereClause += "(r.key=\"" + key + "\" and r.value=\"" + tags.get(key) + "\")"; - first = false; - } - whereClause += ")"; - } - - if (whereClause.equals("")) { - whereClause += " WHERE "; - } else if (!whereClause.equals(" WHERE ")) { - whereClause += " AND "; - } - - sql += whereClause + getExtrasWhere(templateFilter, name, keyword, isIso, bootable, hyperType, zoneId, onlyReady, showDomr) + groupByClause + getOrderByLimit(pageSize, startIndex); - - pstmt = txn.prepareStatement(sql); - rs = pstmt.executeQuery(); - - while (rs.next()) { - Pair templateZonePair = new Pair(rs.getLong(1), rs.getLong(2)); - templateZonePairList.add(templateZonePair); - } - // for now, defaulting pageSize to a large val if null; may need to - // revisit post 2.2RC2 - if (isIso && - templateZonePairList.size() < (pageSize != null ? pageSize : 500) && - templateFilter != TemplateFilter.community && - !(templateFilter == TemplateFilter.self) /* TODO: Fix this! && !BaseCmd.isRootAdmin(caller.getType())*/) { // evaluates - // to - // true - // If - // root - // admin - // and - // filter=self - - List publicIsos = publicIsoSearch(bootable, false, tags); - List userIsos = userIsoSearch(false); - - // Listing the ISOs according to the page size.Restricting the - // total no. of ISOs on a page - // to be less than or equal to the pageSize parameter - - int i = 0; - - if (startIndex > userIsos.size()) { - i = (int) (startIndex - userIsos.size()); - } - - for (; i < publicIsos.size(); i++) { - if (templateZonePairList.size() >= pageSize) { - break; - } else { - if (keyword != null && publicIsos.get(i).getName().contains(keyword)) { - templateZonePairList.add(new Pair(publicIsos.get(i).getId(), null)); - continue; - } else if (name != null && publicIsos.get(i).getName().contains(name)) { - templateZonePairList.add(new Pair(publicIsos.get(i).getId(), null)); - continue; - } else if (keyword == null && name == null) { - templateZonePairList.add(new Pair(publicIsos.get(i).getId(), null)); - } - } - } - } - } catch (Exception e) { - s_logger.warn("Error listing templates", e); - } finally { - try { - if (rs != null) { - rs.close(); - } - if (pstmt != null) { - pstmt.close(); - } - txn.commit(); - } catch (SQLException sqle) { - s_logger.warn("Error in cleaning up", sqle); - } - } - - return templateZonePairList; - } - - private String getExtrasWhere(TemplateFilter templateFilter, String name, String keyword, boolean isIso, Boolean bootable, HypervisorType hyperType, Long zoneId, boolean onlyReady, - boolean showDomr) { - String sql = ""; - if (keyword != null) { - sql += " t.name LIKE \"%" + keyword + "%\" AND"; - } else if (name != null) { - sql += " t.name LIKE \"%" + name + "%\" AND"; - } - - if (isIso) { - sql += " t.format = 'ISO'"; - if (!hyperType.equals(HypervisorType.None)) { - sql += " AND goh.hypervisor_type = '" + hyperType.toString() + "'"; - } - } else { - sql += " t.format <> 'ISO'"; - if (!hyperType.equals(HypervisorType.None)) { - sql += " AND t.hypervisor_type = '" + hyperType.toString() + "'"; - } - } - - if (bootable != null) { - sql += " AND t.bootable = " + bootable; - } - - if (onlyReady) { - sql += " AND thr.download_state = '" + Status.DOWNLOADED.toString() + "'" + " AND thr.destroyed=0 "; - if (zoneId != null) { - sql += " AND h.data_center_id = " + zoneId; - } - } else if (zoneId != null) { - sql += " AND tzr.zone_id = " + zoneId + " AND tzr.removed is null"; - } else { - sql += " AND tzr.removed is null "; - } - if (!showDomr) { - sql += " AND t.type != '" + Storage.TemplateType.SYSTEM.toString() + "'"; - } - - sql += " AND t.removed IS NULL"; - - return sql; - } - - private String getOrderByLimit(Long pageSize, Long startIndex) { - Boolean isAscending = Boolean.parseBoolean(configDao.getValue("sortkey.algorithm")); - isAscending = (isAscending == null ? true : isAscending); - - String sql; - if (isAscending) { - sql = " ORDER BY t.sort_key ASC"; - } else { - sql = " ORDER BY t.sort_key DESC"; - } - - if ((pageSize != null) && (startIndex != null)) { - sql += " LIMIT " + startIndex.toString() + "," + pageSize.toString(); - } - return sql; - } - - @Override - @DB - public long addTemplateToZone(ImageDataVO tmplt, long zoneId) { - Transaction txn = Transaction.currentTxn(); - txn.start(); - ImageDataVO tmplt2 = findById(tmplt.getId()); - if (tmplt2 == null) { - if (persist(tmplt) == null) { - throw new CloudRuntimeException("Failed to persist the template " + tmplt); - } - if (tmplt.getDetails() != null) { - templateDetailsDao.persist(tmplt.getId(), tmplt.getDetails()); - } - } - VMTemplateZoneVO tmpltZoneVO = templateZoneDao.findByZoneTemplate(zoneId, tmplt.getId()); - if (tmpltZoneVO == null) { - tmpltZoneVO = new VMTemplateZoneVO(zoneId, tmplt.getId(), new Date()); - templateZoneDao.persist(tmpltZoneVO); - } else { - tmpltZoneVO.setRemoved(null); - tmpltZoneVO.setLastUpdated(new Date()); - templateZoneDao.update(tmpltZoneVO.getId(), tmpltZoneVO); - } - txn.commit(); - - return tmplt.getId(); - } - - @Override - @DB - public List listAllInZone(long dataCenterId) { - SearchCriteria sc = TmpltsInZoneSearch.create(); - sc.setParameters("avoidtype", TemplateType.PERHOST.toString()); - sc.setJoinParameters("tmpltzone", "zoneId", dataCenterId); - return listBy(sc); - } - - @Override - public List listDefaultBuiltinTemplates() { - SearchCriteria sc = tmpltTypeSearch.create(); - sc.setParameters("templateType", Storage.TemplateType.BUILTIN); - return listBy(sc); - } - - @Override - public ImageDataVO findSystemVMTemplate(long zoneId) { - SearchCriteria sc = tmpltTypeHyperSearch.create(); - sc.setParameters("templateType", Storage.TemplateType.SYSTEM); - sc.setJoinParameters("tmplHyper", "type", Host.Type.Routing); - sc.setJoinParameters("tmplHyper", "zoneId", zoneId); - - // order by descending order of id and select the first (this is going - // to be the latest) - List tmplts = listBy(sc, new Filter(ImageDataVO.class, "id", false, null, 1l)); - - if (tmplts.size() > 0) { - return tmplts.get(0); - } else { - return null; - } - } - - @Override - public ImageDataVO findSystemVMTemplate(long zoneId, HypervisorType hType) { - SearchCriteria sc = tmpltTypeHyperSearch.create(); - sc.setParameters("templateType", Storage.TemplateType.SYSTEM); - sc.setJoinParameters("tmplHyper", "type", Host.Type.Routing); - sc.setJoinParameters("tmplHyper", "zoneId", zoneId); - - // order by descending order of id - List tmplts = listBy(sc, new Filter(ImageDataVO.class, "id", false, null, null)); - - for (ImageDataVO tmplt : tmplts) { - if (tmplt.getHypervisorType() == hType) { - return tmplt; - } - } - if (tmplts.size() > 0 && hType == HypervisorType.Any) { - return tmplts.get(0); - } - return null; - } - - @Override - public ImageDataVO findRoutingTemplate(HypervisorType hType) { - SearchCriteria sc = tmpltTypeHyperSearch2.create(); - sc.setParameters("templateType", Storage.TemplateType.SYSTEM); - sc.setParameters("hypervisorType", hType); - - // order by descending order of id and select the first (this is going - // to be the latest) - List tmplts = listBy(sc, new Filter(ImageDataVO.class, "id", false, null, 1l)); - - if (tmplts.size() > 0) { - return tmplts.get(0); - } else { - return null; - } - } - - @Override - public Long countTemplatesForAccount(long accountId) { - SearchCriteria sc = CountTemplatesByAccount.create(); - sc.setParameters("account", accountId); - return customSearch(sc, null).get(0); - } - - @Override - @DB - public boolean remove(Long id) { - Transaction txn = Transaction.currentTxn(); - txn.start(); - ImageDataVO template = createForUpdate(); - template.setRemoved(new Date()); - - ImageDataVO vo = findById(id); - if (vo != null) { - if (vo.getFormat().equalsIgnoreCase(new ISO().toString())) { - _tagsDao.removeByIdAndType(id, TaggedResourceType.ISO); - } else { - _tagsDao.removeByIdAndType(id, TaggedResourceType.Template); - } - } - - boolean result = update(id, template); - txn.commit(); - return result; - } - - private boolean isAdmin(short accountType) { - return ((accountType == Account.ACCOUNT_TYPE_ADMIN) || (accountType == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN) || (accountType == Account.ACCOUNT_TYPE_DOMAIN_ADMIN) || (accountType == Account.ACCOUNT_TYPE_READ_ONLY_ADMIN)); - } - - @Override - public boolean updateState(TemplateState currentState, TemplateEvent event, - TemplateState nextState, ImageDataVO vo, Object data) { - Long oldUpdated = vo.getUpdatedCount(); - Date oldUpdatedTime = vo.getUpdated(); - - - SearchCriteria sc = updateStateSearch.create(); - sc.setParameters("id", vo.getId()); - sc.setParameters("state", currentState); - sc.setParameters("updatedCount", vo.getUpdatedCount()); - - vo.incrUpdatedCount(); - - UpdateBuilder builder = getUpdateBuilder(vo); - builder.set(vo, "state", nextState); - builder.set(vo, "updated", new Date()); - - int rows = update((ImageDataVO) vo, sc); - if (rows == 0 && s_logger.isDebugEnabled()) { - ImageDataVO dbVol = findByIdIncludingRemoved(vo.getId()); - if (dbVol != null) { - StringBuilder str = new StringBuilder("Unable to update ").append(vo.toString()); - str.append(": DB Data={id=").append(dbVol.getId()).append("; state=").append(dbVol.getState()).append("; updatecount=").append(dbVol.getUpdatedCount()).append(";updatedTime=") - .append(dbVol.getUpdated()); - str.append(": New Data={id=").append(vo.getId()).append("; state=").append(nextState).append("; event=").append(event).append("; updatecount=").append(vo.getUpdatedCount()) - .append("; updatedTime=").append(vo.getUpdated()); - str.append(": stale Data={id=").append(vo.getId()).append("; state=").append(currentState).append("; event=").append(event).append("; updatecount=").append(oldUpdated) - .append("; updatedTime=").append(oldUpdatedTime); - } else { - s_logger.debug("Unable to update objectIndatastore: id=" + vo.getId() + ", as there is no such object exists in the database anymore"); - } - } - return rows > 0; - } -} \ No newline at end of file diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java index f2a999330ad..fbfade6c6aa 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java @@ -77,7 +77,7 @@ public class DefaultPrimaryDataStore implements PrimaryDataStore { private VolumeDao volumeDao; - protected DefaultPrimaryDataStore() { + public DefaultPrimaryDataStore() { } diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeEntityImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeEntityImpl.java index f8d50437d14..d3e8c543b54 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeEntityImpl.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeEntityImpl.java @@ -39,7 +39,7 @@ public class VolumeEntityImpl implements VolumeEntity { private final VolumeService vs; private VolumeApiResult result; - protected VolumeEntityImpl() { + public VolumeEntityImpl() { this.vs = null; } diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java index 6ad6cc9486f..ceadb253976 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java @@ -51,7 +51,7 @@ public class VolumeObject implements VolumeInfo { ObjectInDataStoreManager ojbectInStoreMgr; private Object payload; - protected VolumeObject() { + public VolumeObject() { _volStateMachine = Volume.State.getStateMachine(); } diff --git a/utils/src/com/cloud/utils/component/ComponentContext.java b/utils/src/com/cloud/utils/component/ComponentContext.java index 82fe90db2f8..407ad7a7529 100644 --- a/utils/src/com/cloud/utils/component/ComponentContext.java +++ b/utils/src/com/cloud/utils/component/ComponentContext.java @@ -55,15 +55,6 @@ public class ComponentContext implements ApplicationContextAware { private static ApplicationContext s_appContext; - private static Advisor s_advisor; - private static ProxyFactory s_pf; - static { - s_advisor = new DefaultPointcutAdvisor(new MatchAnyMethodPointcut(), - new TransactionContextBuilder()); - s_pf = new ProxyFactory(); - s_pf.addAdvisor(s_advisor); - } - @Override public void setApplicationContext(ApplicationContext applicationContext) { s_logger.info("Setup Spring Application context"); @@ -216,8 +207,17 @@ public class ComponentContext implements ApplicationContextAware { } public static T inject(Class clz) { - T instance = s_appContext.getAutowireCapableBeanFactory().createBean(clz); - return instance; + T instance; + try { + instance = clz.newInstance(); + return inject(instance); + } catch (InstantiationException e) { + s_logger.error("Unhandled InstantiationException", e); + throw new RuntimeException("Unable to instantiate object of class " + clz.getName() + ", make sure it has public constructor"); + } catch (IllegalAccessException e) { + s_logger.error("Unhandled IllegalAccessException", e); + throw new RuntimeException("Unable to instantiate object of class " + clz.getName() + ", make sure it has public constructor"); + } } public static T inject(Object instance) { @@ -225,9 +225,5 @@ public class ComponentContext implements ApplicationContextAware { AutowireCapableBeanFactory beanFactory = s_appContext.getAutowireCapableBeanFactory(); beanFactory.autowireBean(instance); return (T)instance; -/* - s_pf.setTarget(instance); - return (T)s_pf.getProxy(); -*/ } } From f077fd9b29007cf986ca24eca7b20d5f7b06c1dc Mon Sep 17 00:00:00 2001 From: Kelven Yang Date: Tue, 5 Mar 2013 18:01:44 -0500 Subject: [PATCH 12/26] Make RecreatableFencer's constructor public so that it can instantiated through reflection --- server/src/com/cloud/ha/RecreatableFencer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/com/cloud/ha/RecreatableFencer.java b/server/src/com/cloud/ha/RecreatableFencer.java index 52ab34f05cd..dd3e71c77b9 100644 --- a/server/src/com/cloud/ha/RecreatableFencer.java +++ b/server/src/com/cloud/ha/RecreatableFencer.java @@ -39,7 +39,7 @@ public class RecreatableFencer extends AdapterBase implements FenceBuilder { @Inject VolumeDao _volsDao; @Inject StoragePoolDao _poolDao; - protected RecreatableFencer() { + public RecreatableFencer() { super(); } @@ -56,7 +56,7 @@ public class RecreatableFencer extends AdapterBase implements FenceBuilder { for (VolumeVO vol : vols) { if (!vol.isRecreatable()) { if (s_logger.isDebugEnabled()) { - s_logger.debug("Unable to fence off volumes that are not recreatable: " + vol); + s_logger.debug("Unable to f ence off volumes that are not recreatable: " + vol); } return null; } From 0b84958a66dae95624f2ecb64dd044985699f65d Mon Sep 17 00:00:00 2001 From: Kelven Yang Date: Tue, 5 Mar 2013 19:47:37 -0500 Subject: [PATCH 13/26] Fix an out-dated unit test assertion --- .../com/cloud/utils/log/CglibThrowableRendererTest.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/utils/test/com/cloud/utils/log/CglibThrowableRendererTest.java b/utils/test/com/cloud/utils/log/CglibThrowableRendererTest.java index 2a05a00dee5..ae50f5b786b 100644 --- a/utils/test/com/cloud/utils/log/CglibThrowableRendererTest.java +++ b/utils/test/com/cloud/utils/log/CglibThrowableRendererTest.java @@ -40,6 +40,10 @@ public class CglibThrowableRendererTest extends TestCase { private final static Logger s_logger = Logger.getLogger(CglibThrowableRendererTest.class); public static class TestClass { + + public TestClass() { + } + @DB public void exception1() { throw new IllegalArgumentException("What a bad exception"); @@ -83,7 +87,7 @@ public class CglibThrowableRendererTest extends TestCase { alt.warn("exception caught", e); } // first check that we actually have some call traces containing "" - assertTrue(w.toString().contains("")); + // assertTrue(w.toString().contains("")); w = new CharArrayWriter(); alt = getAlternateLogger(w, new CglibThrowableRenderer()); From cdae53a28914507b32545b37b836ea5aca8bbd83 Mon Sep 17 00:00:00 2001 From: Venkata Swamybabu Budumuru Date: Tue, 5 Mar 2013 13:42:07 -0500 Subject: [PATCH 14/26] CLOUDSTACK-1514 : Unable to remove secondary ips though there are no PF rules associated with it Fixed the search filter in PortForwardingRulesDaoImpl.java. Earlier we were passing a wrong filter parameter "address" in listByDestIpAddr which doesn't exist. Changed this to the right search criteria that uses dstIp as filter parameter. Signed-off-by: Venkata Swamybabu Budumuru Signed-off-by: Sateesh Chodapuneedi --- .../com/cloud/network/rules/dao/PortForwardingRulesDaoImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/com/cloud/network/rules/dao/PortForwardingRulesDaoImpl.java b/server/src/com/cloud/network/rules/dao/PortForwardingRulesDaoImpl.java index 5d0b01cabed..cc780cbd446 100644 --- a/server/src/com/cloud/network/rules/dao/PortForwardingRulesDaoImpl.java +++ b/server/src/com/cloud/network/rules/dao/PortForwardingRulesDaoImpl.java @@ -155,7 +155,7 @@ public class PortForwardingRulesDaoImpl extends GenericDaoBase listByDestIpAddr(String ip4Address) { SearchCriteria sc = AllFieldsSearch.create(); - sc.setParameters("address", ip4Address); + sc.setParameters("dstIp", ip4Address); return listBy(sc); } From 00cd9d5d6fd0901dc00b9f685897ef8e8736453e Mon Sep 17 00:00:00 2001 From: Radhika PC Date: Tue, 5 Mar 2013 16:00:13 +0530 Subject: [PATCH 15/26] cloudstack-890 and cloudstack 815 --- docs/en-US/add-remove-nic.xml | 127 ++++++++++++++++++++++++++ docs/en-US/added-API-commands-4-1.xml | 28 ++++++ docs/en-US/whats-new.xml | 1 + 3 files changed, 156 insertions(+) create mode 100644 docs/en-US/add-remove-nic.xml 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 index f635e9dfdd8..aa5529e41ff 100644 --- a/docs/en-US/added-API-commands-4-1.xml +++ b/docs/en-US/added-API-commands-4-1.xml @@ -37,5 +37,33 @@ 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/whats-new.xml b/docs/en-US/whats-new.xml index 29ae1f68903..761d7a2eb37 100644 --- a/docs/en-US/whats-new.xml +++ b/docs/en-US/whats-new.xml @@ -24,6 +24,7 @@ API usage.
What's New in the API for 4.1 + From dad20a27537f424abc528a723fe1d308b88ab5ad Mon Sep 17 00:00:00 2001 From: Min Chen Date: Tue, 5 Mar 2013 21:54:21 -0800 Subject: [PATCH 16/26] Temporarily disable the code to retrieve session cookie from WS call for volume snapshot functionality to make vmware code compilable from JDK7. --- .../hypervisor/vmware/util/VmwareContext.java | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareContext.java b/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareContext.java index 091ce770836..c1139ee9903 100755 --- a/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareContext.java +++ b/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareContext.java @@ -38,8 +38,8 @@ import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLSession; import javax.xml.ws.BindingProvider; -import com.sun.xml.internal.ws.transport.http.client.CookieJar; -import com.sun.xml.internal.ws.client.BindingProviderProperties; +//import com.sun.xml.internal.ws.transport.http.client.CookieJar; +//import com.sun.xml.internal.ws.client.BindingProviderProperties; import org.apache.log4j.Logger; @@ -381,12 +381,14 @@ public class VmwareContext { long totalBytesDownloaded, ActionDelegate progressUpdater) throws Exception { HttpURLConnection conn = getRawHTTPConnection(urlString); + /* TODO: need to find a way working for JDK7 since CookieJar is not available in JDK7. CookieJar cookie = getServiceCookie(); if ( cookie == null ){ s_logger.error("No cookie is found in vwware web service request context!"); throw new Exception("No cookie is found in vmware web service request context!"); } cookie.applyRelevantCookies(conn); + */ conn.setDoInput(true); conn.setDoOutput(true); conn.setAllowUserInteraction(true); @@ -537,11 +539,7 @@ public class VmwareContext { } public HttpURLConnection getHTTPConnection(String urlString, String httpMethod) throws Exception { - CookieJar cookie = getServiceCookie(); - if ( cookie == null ){ - s_logger.error("No cookie is found in vmware web service request context!"); - throw new Exception("No cookie is found in vmware web service request context!"); - } + HostnameVerifier hv = new HostnameVerifier() { @Override public boolean verify(String urlHostName, SSLSession session) { @@ -556,7 +554,14 @@ public class VmwareContext { conn.setDoInput(true); conn.setDoOutput(true); conn.setAllowUserInteraction(true); + /* TODO: need to find a way to work for JDK7 since CookieJar is not available in JDK7. + CookieJar cookie = getServiceCookie(); + if ( cookie == null ){ + s_logger.error("No cookie is found in vmware web service request context!"); + throw new Exception("No cookie is found in vmware web service request context!"); + } cookie.applyRelevantCookies(conn); + */ conn.setRequestMethod(httpMethod); connectWithRetry(conn); return conn; @@ -575,11 +580,13 @@ public class VmwareContext { return (HttpURLConnection)url.openConnection(); } + /*TODO: find a way to get session cookie from a WS call private CookieJar getServiceCookie() throws Exception { VimPortType port = getService(); Map ctxt = ((BindingProvider) port).getRequestContext(); return (CookieJar)ctxt.get(BindingProviderProperties.HTTP_COOKIE_JAR); } + */ private static void connectWithRetry(HttpURLConnection conn) throws Exception { boolean connected = false; From 9aa624a039dfe751398a28d006f605a033b33703 Mon Sep 17 00:00:00 2001 From: Min Chen Date: Tue, 5 Mar 2013 22:02:27 -0800 Subject: [PATCH 17/26] Revert "Temporarily disable the code to retrieve session cookie from WS call for" This reverts commit dad20a27537f424abc528a723fe1d308b88ab5ad. --- .../hypervisor/vmware/util/VmwareContext.java | 21 +++++++------------ 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareContext.java b/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareContext.java index c1139ee9903..091ce770836 100755 --- a/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareContext.java +++ b/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareContext.java @@ -38,8 +38,8 @@ import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLSession; import javax.xml.ws.BindingProvider; -//import com.sun.xml.internal.ws.transport.http.client.CookieJar; -//import com.sun.xml.internal.ws.client.BindingProviderProperties; +import com.sun.xml.internal.ws.transport.http.client.CookieJar; +import com.sun.xml.internal.ws.client.BindingProviderProperties; import org.apache.log4j.Logger; @@ -381,14 +381,12 @@ public class VmwareContext { long totalBytesDownloaded, ActionDelegate progressUpdater) throws Exception { HttpURLConnection conn = getRawHTTPConnection(urlString); - /* TODO: need to find a way working for JDK7 since CookieJar is not available in JDK7. CookieJar cookie = getServiceCookie(); if ( cookie == null ){ s_logger.error("No cookie is found in vwware web service request context!"); throw new Exception("No cookie is found in vmware web service request context!"); } cookie.applyRelevantCookies(conn); - */ conn.setDoInput(true); conn.setDoOutput(true); conn.setAllowUserInteraction(true); @@ -539,7 +537,11 @@ public class VmwareContext { } public HttpURLConnection getHTTPConnection(String urlString, String httpMethod) throws Exception { - + CookieJar cookie = getServiceCookie(); + if ( cookie == null ){ + s_logger.error("No cookie is found in vmware web service request context!"); + throw new Exception("No cookie is found in vmware web service request context!"); + } HostnameVerifier hv = new HostnameVerifier() { @Override public boolean verify(String urlHostName, SSLSession session) { @@ -554,14 +556,7 @@ public class VmwareContext { conn.setDoInput(true); conn.setDoOutput(true); conn.setAllowUserInteraction(true); - /* TODO: need to find a way to work for JDK7 since CookieJar is not available in JDK7. - CookieJar cookie = getServiceCookie(); - if ( cookie == null ){ - s_logger.error("No cookie is found in vmware web service request context!"); - throw new Exception("No cookie is found in vmware web service request context!"); - } cookie.applyRelevantCookies(conn); - */ conn.setRequestMethod(httpMethod); connectWithRetry(conn); return conn; @@ -580,13 +575,11 @@ public class VmwareContext { return (HttpURLConnection)url.openConnection(); } - /*TODO: find a way to get session cookie from a WS call private CookieJar getServiceCookie() throws Exception { VimPortType port = getService(); Map ctxt = ((BindingProvider) port).getRequestContext(); return (CookieJar)ctxt.get(BindingProviderProperties.HTTP_COOKIE_JAR); } - */ private static void connectWithRetry(HttpURLConnection conn) throws Exception { boolean connected = false; From 0fd30af5f87a0c3f1eb9496a2c0a409d7987028b Mon Sep 17 00:00:00 2001 From: Hiroaki Kawai Date: Tue, 5 Mar 2013 22:12:31 -0800 Subject: [PATCH 18/26] Remove invalid use of internal library class in VmwareContext. --- .../hypervisor/vmware/util/VmwareClient.java | 31 +++++++++++++++++++ .../hypervisor/vmware/util/VmwareContext.java | 16 +++------- 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareClient.java b/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareClient.java index 344fbddc318..cbae5a95819 100644 --- a/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareClient.java +++ b/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareClient.java @@ -17,6 +17,7 @@ package com.cloud.hypervisor.vmware.util; import java.lang.reflect.Method; +import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -26,6 +27,12 @@ import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLSession; import javax.net.ssl.HttpsURLConnection; import javax.xml.ws.BindingProvider; +import javax.xml.ws.handler.MessageContext; + +import org.apache.http.cookie.Cookie; +import org.apache.http.cookie.CookieOrigin; +import org.apache.http.impl.cookie.BrowserCompatSpec; +import org.apache.http.message.BasicHeader; import com.vmware.vim25.DynamicProperty; import com.vmware.vim25.InvalidCollectorVersionFaultMsg; @@ -94,6 +101,7 @@ public class VmwareClient { private VimService vimService; private VimPortType vimPort; private ServiceContent serviceContent; + private String serviceCookie; private final String SVC_INST_NAME = "ServiceInstance"; private boolean isConnected = false; @@ -133,6 +141,22 @@ public class VmwareClient { ctxt.put("com.sun.xml.internal.ws.connect.timeout", 600000); serviceContent = vimPort.retrieveServiceContent(SVC_INST_REF); + + // Extract a cookie. See vmware sample program com.vmware.httpfileaccess.GetVMFiles + URL urlUrl = new URL(url); + Map> headers = (Map>) ((BindingProvider) vimPort) + .getResponseContext().get(MessageContext.HTTP_RESPONSE_HEADERS); + for (String header_raw_value : (List) headers.get("Set-cookie")) { + List cookies = new BrowserCompatSpec().parse( + new BasicHeader("Set-cookie", header_raw_value), + new CookieOrigin(urlUrl.getHost(), urlUrl.getPort(), + urlUrl.getPath(), true)); + if (cookies.size() > 0) { + serviceCookie = cookies.get(0).getValue(); + break; + } + } + vimPort.login(serviceContent.getSessionManager(), userName, password, null); isConnected = true; @@ -166,6 +190,13 @@ public class VmwareClient { return serviceContent; } + /** + * @return cookie used in service connection + */ + public String getServiceCookie() { + return serviceCookie; + } + /** * @return Service property collector */ diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareContext.java b/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareContext.java index 091ce770836..265fa647d21 100755 --- a/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareContext.java +++ b/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareContext.java @@ -38,8 +38,6 @@ import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLSession; import javax.xml.ws.BindingProvider; -import com.sun.xml.internal.ws.transport.http.client.CookieJar; -import com.sun.xml.internal.ws.client.BindingProviderProperties; import org.apache.log4j.Logger; @@ -381,12 +379,12 @@ public class VmwareContext { long totalBytesDownloaded, ActionDelegate progressUpdater) throws Exception { HttpURLConnection conn = getRawHTTPConnection(urlString); - CookieJar cookie = getServiceCookie(); + String cookie = _vimClient.getServiceCookie(); if ( cookie == null ){ s_logger.error("No cookie is found in vwware web service request context!"); throw new Exception("No cookie is found in vmware web service request context!"); } - cookie.applyRelevantCookies(conn); + conn.addRequestProperty("Cookie", cookie); conn.setDoInput(true); conn.setDoOutput(true); conn.setAllowUserInteraction(true); @@ -537,7 +535,7 @@ public class VmwareContext { } public HttpURLConnection getHTTPConnection(String urlString, String httpMethod) throws Exception { - CookieJar cookie = getServiceCookie(); + String cookie = _vimClient.getServiceCookie(); if ( cookie == null ){ s_logger.error("No cookie is found in vmware web service request context!"); throw new Exception("No cookie is found in vmware web service request context!"); @@ -556,7 +554,7 @@ public class VmwareContext { conn.setDoInput(true); conn.setDoOutput(true); conn.setAllowUserInteraction(true); - cookie.applyRelevantCookies(conn); + conn.addRequestProperty("Cookie", cookie); conn.setRequestMethod(httpMethod); connectWithRetry(conn); return conn; @@ -575,12 +573,6 @@ public class VmwareContext { return (HttpURLConnection)url.openConnection(); } - private CookieJar getServiceCookie() throws Exception { - VimPortType port = getService(); - Map ctxt = ((BindingProvider) port).getRequestContext(); - return (CookieJar)ctxt.get(BindingProviderProperties.HTTP_COOKIE_JAR); - } - private static void connectWithRetry(HttpURLConnection conn) throws Exception { boolean connected = false; for(int i = 0; i < MAX_CONNECT_RETRY && !connected; i++) { From 713dff537b3291c54dc6b5f8be86647f1059a249 Mon Sep 17 00:00:00 2001 From: Hugo Trippaers Date: Wed, 6 Mar 2013 08:30:12 +0100 Subject: [PATCH 19/26] Fix rpm build after commit 4d7dced2f892f6bd42df097e6d556ca1f26e8ec6 --- packaging/centos63/cloud.spec | 1 - 1 file changed, 1 deletion(-) diff --git a/packaging/centos63/cloud.spec b/packaging/centos63/cloud.spec index f4970cfdffc..369ff7f11de 100644 --- a/packaging/centos63/cloud.spec +++ b/packaging/centos63/cloud.spec @@ -394,7 +394,6 @@ fi %attr(0755,root,root) %{_sysconfdir}/init.d/%{name}-agent %config(noreplace) %{_sysconfdir}/%{name}/agent %dir %{_localstatedir}/log/%{name}/agent -%attr(0644,root,root) %{_datadir}/%{name}-agent/*.jar %attr(0644,root,root) %{_datadir}/%{name}-agent/lib/*.jar %doc LICENSE %doc NOTICE From 9342f561f73bc860a24c99ab1405152e070359a0 Mon Sep 17 00:00:00 2001 From: Talluri Date: Wed, 6 Mar 2013 17:20:25 +0530 Subject: [PATCH 20/26] CLOUDSTACK-1530: Fix integration test scripts in the components folder for imports and ostypeid Fix the integration scripts for nose import and ostypeid corrections from nose.plugins.attrib import attr "ostype": 'CentOS 5.3 (64-bit)', template = get_template( cls.api_client, cls.zone.id, cls.services["ostype"] ) Signed-off-by: Talluri Signed-off-by: Prasanna Santhanam --- test/integration/component/test_accounts.py | 5 ++-- .../component/test_allocation_states.py | 5 ++-- .../component/test_blocker_bugs.py | 14 +++++------ .../component/test_egress_rules.py | 24 +++++++++---------- test/integration/component/test_eip_elb.py | 6 ++--- .../component/test_network_offering.py | 10 ++++---- .../component/test_project_configs.py | 4 ++-- .../component/test_project_limits.py | 8 +++---- .../component/test_project_resources.py | 16 ++++++------- .../component/test_project_usage.py | 22 ++++++++--------- test/integration/component/test_projects.py | 4 ++-- .../component/test_resource_limits.py | 10 ++++---- test/integration/component/test_routers.py | 10 ++++---- .../component/test_security_groups.py | 16 ++++++------- test/integration/component/test_templates.py | 8 +++---- test/integration/component/test_usage.py | 22 ++++++++--------- test/integration/component/test_volumes.py | 14 +++++------ 17 files changed, 100 insertions(+), 98 deletions(-) diff --git a/test/integration/component/test_accounts.py b/test/integration/component/test_accounts.py index d0b4434bb4e..cdb3e58dd94 100644 --- a/test/integration/component/test_accounts.py +++ b/test/integration/component/test_accounts.py @@ -23,6 +23,7 @@ from marvin.integration.lib.utils import * from marvin.integration.lib.base import * from marvin.integration.lib.common import * from marvin import remoteSSHClient +from nose.plugins.attrib import attr import datetime @@ -90,7 +91,7 @@ class Services: "privateport": 22, "protocol": 'TCP', }, - "ostypeid": 'bc66ada0-99e7-483b-befc-8fb0c2129b70', + "ostype": 'CentOS 5.3 (64-bit)', # Cent OS 5.3 (64 bit) "sleep": 60, "timeout": 10, @@ -112,7 +113,7 @@ class TestAccounts(cloudstackTestCase): cls.template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["virtual_machine"]["zoneid"] = cls.zone.id cls.services["virtual_machine"]["template"] = cls.template.id diff --git a/test/integration/component/test_allocation_states.py b/test/integration/component/test_allocation_states.py index 006f8795fbf..103cb10c0cc 100644 --- a/test/integration/component/test_allocation_states.py +++ b/test/integration/component/test_allocation_states.py @@ -22,6 +22,7 @@ from marvin.cloudstackAPI import * from marvin.integration.lib.utils import * from marvin.integration.lib.base import * from marvin.integration.lib.common import * +from nose.plugins.attrib import attr import datetime @@ -74,7 +75,7 @@ class Services: "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', "templatefilter": 'self', }, - "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', + "ostype": 'CentOS 5.3 (64-bit)', # Cent OS 5.3 (64 bit) "sleep": 60, "timeout": 10, @@ -87,7 +88,7 @@ class TestAllocationState(cloudstackTestCase): @classmethod def setUpClass(cls): cls.api_client = super( - TestResources, + TestAllocationState, cls ).getClsTestClient().getApiClient() cls.services = Services().services diff --git a/test/integration/component/test_blocker_bugs.py b/test/integration/component/test_blocker_bugs.py index cc5da0ace4a..33e4a73f712 100644 --- a/test/integration/component/test_blocker_bugs.py +++ b/test/integration/component/test_blocker_bugs.py @@ -76,7 +76,7 @@ class Services: "templates": { "displaytext": 'Template from snapshot', "name": 'Template from snapshot', - "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', + "ostype": 'CentOS 5.3 (64-bit)', "templatefilter": 'self', "url": "http://download.cloud.com/releases/2.0.0/UbuntuServer-10-04-64bit.vhd.bz2", "hypervisor": 'XenServer', @@ -98,7 +98,7 @@ class Services: "endport": 22, "protocol": "TCP" }, - "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', + "ostype": 'CentOS 5.3 (64-bit)', # Cent OS 5.3 (64 bit) "sleep": 60, "mode": 'advanced', @@ -122,7 +122,7 @@ class TestSnapshots(cloudstackTestCase): cls.template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["virtual_machine"]["zoneid"] = cls.zone.id cls.services["volume"]["zoneid"] = cls.zone.id @@ -546,7 +546,7 @@ class TestNATRules(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) #Create an account, network, VM and IP addresses cls.account = Account.create( @@ -740,7 +740,7 @@ class TestRouters(cloudstackTestCase): cls.template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) # Create an account, domain etc @@ -866,7 +866,7 @@ class TestRouterRestart(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["virtual_machine"]["zoneid"] = cls.zone.id @@ -996,7 +996,7 @@ class TestTemplates(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["virtual_machine"]["zoneid"] = cls.zone.id cls.account = Account.create( diff --git a/test/integration/component/test_egress_rules.py b/test/integration/component/test_egress_rules.py index 73a91f41bfe..6b9cd4f25fc 100644 --- a/test/integration/component/test_egress_rules.py +++ b/test/integration/component/test_egress_rules.py @@ -118,7 +118,7 @@ class Services: "password": "password", "ipaddress": "192.168.100.21" }, - "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', + "ostype": 'CentOS 5.3 (64-bit)', # CentOS 5.3 (64-bit) "sleep": 60, "timeout": 10, @@ -160,7 +160,7 @@ class TestDefaultSecurityGroupEgress(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["domainid"] = cls.domain.id cls.services["virtual_machine"]["zoneid"] = cls.zone.id @@ -318,7 +318,7 @@ class TestAuthorizeIngressRule(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["domainid"] = cls.domain.id cls.services["virtual_machine"]["zoneid"] = cls.zone.id @@ -475,7 +475,7 @@ class TestDefaultGroupEgress(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["domainid"] = cls.domain.id cls.services["virtual_machine"]["zoneid"] = cls.zone.id @@ -675,7 +675,7 @@ class TestDefaultGroupEgressAfterDeploy(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["domainid"] = cls.domain.id cls.services["virtual_machine"]["zoneid"] = cls.zone.id @@ -857,7 +857,7 @@ class TestRevokeEgressRule(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["domainid"] = cls.domain.id cls.services["virtual_machine"]["zoneid"] = cls.zone.id @@ -1118,7 +1118,7 @@ class TestInvalidAccountAuthroize(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["domainid"] = cls.domain.id cls.services["virtual_machine"]["zoneid"] = cls.zone.id @@ -1239,7 +1239,7 @@ class TestMultipleAccountsEgressRuleNeg(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["domainid"] = cls.domain.id cls.services["virtual_machine"]["zoneid"] = cls.zone.id @@ -1486,7 +1486,7 @@ class TestMultipleAccountsEgressRule(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["domainid"] = cls.domain.id cls.services["virtual_machine"]["zoneid"] = cls.zone.id @@ -1782,7 +1782,7 @@ class TestStartStopVMWithEgressRule(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["domainid"] = cls.domain.id cls.services["virtual_machine"]["zoneid"] = cls.zone.id @@ -1993,7 +1993,7 @@ class TestInvalidParametersForEgress(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["domainid"] = cls.domain.id cls.services["virtual_machine"]["zoneid"] = cls.zone.id @@ -2179,7 +2179,7 @@ class TestEgressAfterHostMaintainance(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["domainid"] = cls.domain.id cls.services["virtual_machine"]["zoneid"] = cls.zone.id diff --git a/test/integration/component/test_eip_elb.py b/test/integration/component/test_eip_elb.py index 4c8dcbe2c07..89fdd25fb25 100644 --- a/test/integration/component/test_eip_elb.py +++ b/test/integration/component/test_eip_elb.py @@ -81,7 +81,7 @@ class Services: "username": 'nsroot', "password": 'nsroot' }, - "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', + "ostype": 'CentOS 5.3 (64-bit)', # Cent OS 5.3 (64 bit) "sleep": 60, "timeout": 10, @@ -100,7 +100,7 @@ class TestEIP(cloudstackTestCase): cls.template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["virtual_machine"]["zoneid"] = cls.zone.id cls.services["virtual_machine"]["template"] = cls.template.id @@ -922,7 +922,7 @@ class TestELB(cloudstackTestCase): cls.template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["virtual_machine"]["zoneid"] = cls.zone.id cls.services["virtual_machine"]["template"] = cls.template.id diff --git a/test/integration/component/test_network_offering.py b/test/integration/component/test_network_offering.py index c1a518b458a..0de03aa0938 100644 --- a/test/integration/component/test_network_offering.py +++ b/test/integration/component/test_network_offering.py @@ -138,7 +138,7 @@ class Services: "publicport": 22, "protocol": 'TCP', }, - "ostypeid": 'bc66ada0-99e7-483b-befc-8fb0c2129b70', + "ostype": 'CentOS 5.3 (64-bit)', # Cent OS 5.3 (64 bit) "sleep": 60, "timeout": 10, @@ -161,7 +161,7 @@ class TestNOVirtualRouter(cloudstackTestCase): cls.template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["virtual_machine"]["zoneid"] = cls.zone.id cls.services["virtual_machine"]["template"] = cls.template.id @@ -739,7 +739,7 @@ class TestNOWithNetscaler(cloudstackTestCase): cls.template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["virtual_machine"]["zoneid"] = cls.zone.id cls.services["virtual_machine"]["template"] = cls.template.id @@ -1374,7 +1374,7 @@ class TestNetworkUpgrade(cloudstackTestCase): cls.template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["virtual_machine"]["zoneid"] = cls.zone.id cls.services["virtual_machine"]["template"] = cls.template.id @@ -1830,7 +1830,7 @@ class TestSharedNetworkWithoutIp(cloudstackTestCase): cls.template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["virtual_machine"]["zoneid"] = cls.zone.id cls.services["virtual_machine"]["template"] = cls.template.id diff --git a/test/integration/component/test_project_configs.py b/test/integration/component/test_project_configs.py index d5ce9d6024d..854b5a42853 100644 --- a/test/integration/component/test_project_configs.py +++ b/test/integration/component/test_project_configs.py @@ -87,7 +87,7 @@ class Services: "template": { "displaytext": "Public Template", "name": "Public template", - "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', + "ostype": 'CentOS 5.3 (64-bit)', "url": "http://download.cloud.com/releases/2.0.0/UbuntuServer-10-04-64bit.vhd.bz2", "hypervisor": 'XenServer', "format": 'VHD', @@ -98,7 +98,7 @@ class Services: "configs": { "project.invite.timeout": 300, }, - "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', + "ostype": 'CentOS 5.3 (64-bit)', # Cent OS 5.3 (64 bit) "sleep": 60, "timeout": 10, diff --git a/test/integration/component/test_project_limits.py b/test/integration/component/test_project_limits.py index 8f7c1281b23..afae1808d04 100644 --- a/test/integration/component/test_project_limits.py +++ b/test/integration/component/test_project_limits.py @@ -86,7 +86,7 @@ class Services: "template": { "displaytext": "Cent OS Template", "name": "Cent OS Template", - "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', + "ostype": 'CentOS 5.3 (64-bit)', "templatefilter": 'self', }, "network_offering": { @@ -112,7 +112,7 @@ class Services: "name": "Test Network", "displaytext": "Test Network", }, - "ostypeid": 'bc66ada0-99e7-483b-befc-8fb0c2129b70', + "ostype": 'CentOS 5.3 (64-bit)', # Cent OS 5.3 (64 bit) "sleep": 60, "timeout": 10, @@ -485,7 +485,7 @@ class TestResourceLimitsProject(cloudstackTestCase): cls.template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["server"]["zoneid"] = cls.zone.id @@ -924,7 +924,7 @@ class TestMaxProjectNetworks(cloudstackTestCase): cls.template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.service_offering = ServiceOffering.create( cls.api_client, diff --git a/test/integration/component/test_project_resources.py b/test/integration/component/test_project_resources.py index 27452be811f..24091d2f89c 100644 --- a/test/integration/component/test_project_resources.py +++ b/test/integration/component/test_project_resources.py @@ -87,7 +87,7 @@ class Services: "template": { "displaytext": "Cent OS Template", "name": "Cent OS Template", - "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', + "ostype": 'CentOS 5.3 (64-bit)', "templatefilter": 'self', "ispublic": False, }, @@ -130,7 +130,7 @@ class Services: "endport": 22, "cidrlist": '0.0.0.0/0', }, - "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', + "ostype": 'CentOS 5.3 (64-bit)', # Cent OS 5.3 (64 bit) "sleep": 60, "timeout": 10, @@ -152,7 +152,7 @@ class TestOfferings(cloudstackTestCase): cls.template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["server"]["zoneid"] = cls.zone.id @@ -332,7 +332,7 @@ class TestNetwork(cloudstackTestCase): cls.template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["server"]["zoneid"] = cls.zone.id @@ -520,7 +520,7 @@ class TestTemplates(cloudstackTestCase): cls.template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["server"]["zoneid"] = cls.zone.id @@ -749,7 +749,7 @@ class TestSnapshots(cloudstackTestCase): cls.template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["server"]["zoneid"] = cls.zone.id @@ -895,7 +895,7 @@ class TestPublicIpAddress(cloudstackTestCase): cls.template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["server"]["zoneid"] = cls.zone.id @@ -1194,7 +1194,7 @@ class TestSecurityGroup(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["domainid"] = cls.domain.id cls.services["server"]["zoneid"] = cls.zone.id diff --git a/test/integration/component/test_project_usage.py b/test/integration/component/test_project_usage.py index 4561576543c..16d51068deb 100644 --- a/test/integration/component/test_project_usage.py +++ b/test/integration/component/test_project_usage.py @@ -75,7 +75,7 @@ class Services: "templates": { "displaytext": 'Template', "name": 'Template', - "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', + "ostype": 'CentOS 5.3 (64-bit)', "templatefilter": 'self', "url": "http://download.cloud.com/releases/2.0.0/UbuntuServer-10-04-64bit.qcow2.bz2" }, @@ -87,7 +87,7 @@ class Services: "isextractable": True, "isfeatured": True, "ispublic": True, - "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', + "ostype": 'CentOS 5.3 (64-bit)', }, "lbrule": { "name": "SSH", @@ -105,7 +105,7 @@ class Services: "username": "test", "password": "test", }, - "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', + "ostype": 'CentOS 5.3 (64-bit)', # Cent OS 5.3 (64 bit) "sleep": 60, "timeout": 10, @@ -129,7 +129,7 @@ class TestVmUsage(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["server"]["zoneid"] = cls.zone.id @@ -323,7 +323,7 @@ class TestPublicIPUsage(cloudstackTestCase): cls.template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["server"]["zoneid"] = cls.zone.id @@ -497,7 +497,7 @@ class TestVolumeUsage(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["server"]["zoneid"] = cls.zone.id cls.services["server"]["diskoffering"] = cls.disk_offering.id @@ -678,7 +678,7 @@ class TestTemplateUsage(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["server"]["zoneid"] = cls.zone.id cls.account = Account.create( @@ -996,7 +996,7 @@ class TestLBRuleUsage(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["server"]["zoneid"] = cls.zone.id @@ -1179,7 +1179,7 @@ class TestSnapshotUsage(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["server"]["zoneid"] = cls.zone.id @@ -1355,7 +1355,7 @@ class TestNatRuleUsage(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["server"]["zoneid"] = cls.zone.id @@ -1537,7 +1537,7 @@ class TestVpnUsage(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["server"]["zoneid"] = cls.zone.id diff --git a/test/integration/component/test_projects.py b/test/integration/component/test_projects.py index 811d092d18e..3e45cae6651 100644 --- a/test/integration/component/test_projects.py +++ b/test/integration/component/test_projects.py @@ -92,7 +92,7 @@ class Services: "publicport": 22, "protocol": 'TCP', }, - "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', + "ostype": 'CentOS 5.3 (64-bit)', # Cent OS 5.3 (64 bit) "sleep": 60, "timeout": 10, @@ -1451,7 +1451,7 @@ class TestProjectSuspendActivate(cloudstackTestCase): cls.template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) configs = Configurations.list( cls.api_client, diff --git a/test/integration/component/test_resource_limits.py b/test/integration/component/test_resource_limits.py index cd007f1595e..c20770ab24f 100644 --- a/test/integration/component/test_resource_limits.py +++ b/test/integration/component/test_resource_limits.py @@ -75,7 +75,7 @@ class Services: "template": { "displaytext": "Cent OS Template", "name": "Cent OS Template", - "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', + "ostype": 'CentOS 5.3 (64-bit)', "templatefilter": 'self', }, "network_offering": { @@ -101,7 +101,7 @@ class Services: "name": "test network", "displaytext": "test network" }, - "ostypeid": 'bc66ada0-99e7-483b-befc-8fb0c2129b70', + "ostype": 'CentOS 5.3 (64-bit)', # Cent OS 5.3 (64 bit) "sleep": 60, "timeout": 10, @@ -122,7 +122,7 @@ class TestResourceLimitsAccount(cloudstackTestCase): cls.template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["server"]["zoneid"] = cls.zone.id @@ -885,7 +885,7 @@ class TestResourceLimitsDomain(cloudstackTestCase): cls.template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["server"]["zoneid"] = cls.zone.id @@ -1341,7 +1341,7 @@ class TestMaxAccountNetworks(cloudstackTestCase): cls.template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.service_offering = ServiceOffering.create( diff --git a/test/integration/component/test_routers.py b/test/integration/component/test_routers.py index a65c5c34005..02a08dee91c 100644 --- a/test/integration/component/test_routers.py +++ b/test/integration/component/test_routers.py @@ -89,7 +89,7 @@ class Services: "cidr": '55.55.0.0/11', # Any network (For creating FW rule }, - "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', + "ostype": 'CentOS 5.3 (64-bit)', # Used for Get_Template : CentOS 5.3 (64 bit) "mode": 'advanced', # Networking mode: Advanced, basic } @@ -108,7 +108,7 @@ class TestRouterServices(cloudstackTestCase): cls.template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["virtual_machine"]["zoneid"] = cls.zone.id @@ -595,7 +595,7 @@ class TestRouterStopCreatePF(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["virtual_machine"]["zoneid"] = cls.zone.id @@ -806,7 +806,7 @@ class TestRouterStopCreateLB(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["virtual_machine"]["zoneid"] = cls.zone.id @@ -1017,7 +1017,7 @@ class TestRouterStopCreateFW(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["virtual_machine"]["zoneid"] = cls.zone.id diff --git a/test/integration/component/test_security_groups.py b/test/integration/component/test_security_groups.py index 13a87b67c83..39f6d6fcd26 100644 --- a/test/integration/component/test_security_groups.py +++ b/test/integration/component/test_security_groups.py @@ -90,7 +90,7 @@ class Services: "endport": -1, "cidrlist": '0.0.0.0/0', }, - "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', + "ostype": 'CentOS 5.3 (64-bit)', # CentOS 5.3 (64-bit) "sleep": 60, "timeout": 10, @@ -129,7 +129,7 @@ class TestDefaultSecurityGroup(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["domainid"] = cls.domain.id cls.services["virtual_machine"]["zoneid"] = cls.zone.id @@ -401,7 +401,7 @@ class TestAuthorizeIngressRule(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["domainid"] = cls.domain.id cls.services["virtual_machine"]["zoneid"] = cls.zone.id @@ -536,7 +536,7 @@ class TestRevokeIngressRule(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["domainid"] = cls.domain.id cls.services["virtual_machine"]["zoneid"] = cls.zone.id @@ -694,7 +694,7 @@ class TestDhcpOnlyRouter(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["domainid"] = cls.domain.id @@ -830,7 +830,7 @@ class TestdeployVMWithUserData(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["domainid"] = cls.domain.id @@ -989,7 +989,7 @@ class TestDeleteSecurityGroup(cloudstackTestCase): template = get_template( self.apiclient, self.zone.id, - self.services["ostypeid"] + self.services["ostype"] ) self.services["domainid"] = self.domain.id @@ -1234,7 +1234,7 @@ class TestIngressRule(cloudstackTestCase): template = get_template( self.apiclient, self.zone.id, - self.services["ostypeid"] + self.services["ostype"] ) self.services["domainid"] = self.domain.id diff --git a/test/integration/component/test_templates.py b/test/integration/component/test_templates.py index e9be63d66b8..65d9fe0a764 100644 --- a/test/integration/component/test_templates.py +++ b/test/integration/component/test_templates.py @@ -77,7 +77,7 @@ class Services: 0: { "displaytext": "Public Template", "name": "Public template", - "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', + "ostype": 'CentOS 5.3 (64-bit)', "url": "http://download.cloud.com/releases/2.0.0/UbuntuServer-10-04-64bit.vhd.bz2", "hypervisor": 'XenServer', "format": 'VHD', @@ -89,12 +89,12 @@ class Services: "template": { "displaytext": "Cent OS Template", "name": "Cent OS Template", - "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', + "ostype": 'CentOS 5.3 (64-bit)', "templatefilter": 'self', }, "templatefilter": 'self', "destzoneid": 2, # For Copy template (Destination zone) - "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', + "ostype": 'CentOS 5.3 (64-bit)', "sleep": 60, "timeout": 10, "mode": 'advanced', # Networking mode: Advanced, basic @@ -294,7 +294,7 @@ class TestTemplates(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["virtual_machine"]["zoneid"] = cls.zone.id cls.account = Account.create( diff --git a/test/integration/component/test_usage.py b/test/integration/component/test_usage.py index 34dbc3780d0..4251eab9555 100644 --- a/test/integration/component/test_usage.py +++ b/test/integration/component/test_usage.py @@ -71,7 +71,7 @@ class Services: "templates": { "displaytext": 'Template', "name": 'Template', - "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', + "ostype": 'CentOS 5.3 (64-bit)', "templatefilter": 'self', "url": "http://download.cloud.com/releases/2.0.0/UbuntuServer-10-04-64bit.qcow2.bz2" }, @@ -83,7 +83,7 @@ class Services: "isextractable": True, "isfeatured": True, "ispublic": True, - "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', + "ostype": 'CentOS 5.3 (64-bit)', }, "lbrule": { "name": "SSH", @@ -101,7 +101,7 @@ class Services: "username": "test", "password": "test", }, - "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', + "ostype": 'CentOS 5.3 (64-bit)', # Cent OS 5.3 (64 bit) "sleep": 60, "timeout": 10, @@ -122,7 +122,7 @@ class TestVmUsage(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["server"]["zoneid"] = cls.zone.id @@ -305,7 +305,7 @@ class TestPublicIPUsage(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["server"]["zoneid"] = cls.zone.id @@ -459,7 +459,7 @@ class TestVolumeUsage(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["server"]["zoneid"] = cls.zone.id cls.services["server"]["diskoffering"] = cls.disk_offering.id @@ -629,7 +629,7 @@ class TestTemplateUsage(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["server"]["zoneid"] = cls.zone.id cls.account = Account.create( @@ -928,7 +928,7 @@ class TestLBRuleUsage(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["server"]["zoneid"] = cls.zone.id @@ -1090,7 +1090,7 @@ class TestSnapshotUsage(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["server"]["zoneid"] = cls.zone.id @@ -1255,7 +1255,7 @@ class TestNatRuleUsage(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["server"]["zoneid"] = cls.zone.id @@ -1416,7 +1416,7 @@ class TestVpnUsage(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["server"]["zoneid"] = cls.zone.id diff --git a/test/integration/component/test_volumes.py b/test/integration/component/test_volumes.py index 5819001e1b9..0a7813065ae 100644 --- a/test/integration/component/test_volumes.py +++ b/test/integration/component/test_volumes.py @@ -79,14 +79,14 @@ class Services: "name": "testISO", "url": "http://iso.linuxquestions.org/download/504/1819/http/gd4.tuwien.ac.at/dsl-4.4.10.iso", # Source URL where ISO is located - "ostypeid": 'bc66ada0-99e7-483b-befc-8fb0c2129b70', + "ostype": 'CentOS 5.3 (64-bit)', }, "custom_volume": { "customdisksize": 2, "diskname": "Custom disk", }, "sleep": 50, - "ostypeid": 'bc66ada0-99e7-483b-befc-8fb0c2129b70', + "ostype": 'CentOS 5.3 (64-bit)', "mode": 'advanced', } @@ -108,7 +108,7 @@ class TestAttachVolume(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["zoneid"] = cls.zone.id cls.services["virtual_machine"]["zoneid"] = cls.zone.id @@ -378,7 +378,7 @@ class TestAttachDetachVolume(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["zoneid"] = cls.zone.id cls.services["virtual_machine"]["zoneid"] = cls.zone.id @@ -623,7 +623,7 @@ class TestAttachVolumeISO(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["zoneid"] = cls.zone.id cls.services["virtual_machine"]["zoneid"] = cls.zone.id @@ -814,7 +814,7 @@ class TestVolumes(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["zoneid"] = cls.zone.id cls.services["virtual_machine"]["zoneid"] = cls.zone.id @@ -1054,7 +1054,7 @@ class TestDeployVmWithCustomDisk(cloudstackTestCase): template = get_template( cls.api_client, cls.zone.id, - cls.services["ostypeid"] + cls.services["ostype"] ) cls.services["zoneid"] = cls.zone.id cls.services["virtual_machine"]["zoneid"] = cls.zone.id From bb2c7dc7284fe1887be209b18813df72d96edbbb Mon Sep 17 00:00:00 2001 From: Rohit Yadav Date: Wed, 6 Mar 2013 14:19:33 +0530 Subject: [PATCH 21/26] CLOUDSTACK-1340: Fix grub2 cfg to boot without waiting, fix locale Thanks to Marcus for testing and helping on KVM template, adding locale fix as per Marcus's suggestion. Tested with latest build on my local vbox. Signed-off-by: Rohit Yadav --- tools/appliance/definitions/systemvmtemplate/base.sh | 2 +- tools/appliance/definitions/systemvmtemplate/postinstall.sh | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/appliance/definitions/systemvmtemplate/base.sh b/tools/appliance/definitions/systemvmtemplate/base.sh index d8f6901a07a..4d6092a5995 100644 --- a/tools/appliance/definitions/systemvmtemplate/base.sh +++ b/tools/appliance/definitions/systemvmtemplate/base.sh @@ -13,7 +13,7 @@ echo 'cloud ALL=NOPASSWD:ALL' > /etc/sudoers.d/cloud echo 'UseDNS no' >> /etc/ssh/sshd_config # Remove 5s grub timeout to speed up booting -echo < /etc/default/grub +cat < /etc/default/grub # If you change this file, run 'update-grub' afterwards to update # /boot/grub/grub.cfg. diff --git a/tools/appliance/definitions/systemvmtemplate/postinstall.sh b/tools/appliance/definitions/systemvmtemplate/postinstall.sh index dd07e6ebc97..8e745eb1ba9 100644 --- a/tools/appliance/definitions/systemvmtemplate/postinstall.sh +++ b/tools/appliance/definitions/systemvmtemplate/postinstall.sh @@ -136,6 +136,8 @@ EOF cat >> /etc/locale.gen << EOF en_US.UTF-8 UTF-8 EOF + + locale-gen en_US.UTF-8 } do_fixes() { From 38aec6fc4d490f9aecaf9dd56116f45cd1eb60ed Mon Sep 17 00:00:00 2001 From: Milamber Date: Tue, 5 Mar 2013 22:43:16 +0000 Subject: [PATCH 22/26] CLOUDSTACK-465 - French language file quotes are dropping javascript syntax errors --- .../resources/messages_fr_FR.properties | 2446 ++++++++--------- 1 file changed, 1197 insertions(+), 1249 deletions(-) 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 From cc9b7d4c208ac68dc25f8507c6162f395400a8a7 Mon Sep 17 00:00:00 2001 From: Rohit Yadav Date: Wed, 6 Mar 2013 17:20:40 +0530 Subject: [PATCH 23/26] cloudmonkey: print sync stats, asks users to use sync Signed-off-by: Rohit Yadav --- tools/cli/cloudmonkey/cloudmonkey.py | 9 ++++++--- tools/cli/cloudmonkey/config.py | 1 + 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/tools/cli/cloudmonkey/cloudmonkey.py b/tools/cli/cloudmonkey/cloudmonkey.py index b5b185f2d6c..25422412613 100644 --- a/tools/cli/cloudmonkey/cloudmonkey.py +++ b/tools/cli/cloudmonkey/cloudmonkey.py @@ -42,7 +42,7 @@ except ImportError, e: try: from precache import apicache except ImportError: - apicache = {} + apicache = {'count': 0, 'verbs': [], 'asyncapis': []} try: import readline @@ -327,11 +327,14 @@ class CloudMonkeyShell(cmd.Cmd, object): it rollbacks last datastore or api precached datastore. """ response = self.make_request("listApis") - self.apicache = monkeycache(response) if response is None: - monkeyprint("Failed to sync apis, check your config") + monkeyprint("Failed to sync apis, please check your config?") + monkeyprint("Note: `sync` requires api discovery service enabled" + + " on the CloudStack management server") return + self.apicache = monkeycache(response) savecache(self.apicache, self.cache_file) + monkeyprint("%s APIs discovered and cached" % self.apicache["count"]) self.loadcache() def do_api(self, args): diff --git a/tools/cli/cloudmonkey/config.py b/tools/cli/cloudmonkey/config.py index 5dfe09bf85d..6a5feab8d12 100644 --- a/tools/cli/cloudmonkey/config.py +++ b/tools/cli/cloudmonkey/config.py @@ -99,6 +99,7 @@ def read_config(get_attr, set_attr): print "Welcome! Using `set` configure the necessary settings:" print " ".join(sorted(config_options)) print "Config file:", config_file + print "After setting up, run the `sync` command to sync apis\n" missing_keys = [] for section in config_fields.keys(): From 15b5b7e7a3c1cf00cffc9a15a22b405db96e9748 Mon Sep 17 00:00:00 2001 From: Rohit Yadav Date: Wed, 6 Mar 2013 17:47:37 +0530 Subject: [PATCH 24/26] CLOUDSTACK-1417: cosmetics, print param name, value for uuid->id translate error Signed-off-by: Rohit Yadav --- server/src/com/cloud/api/ApiDispatcher.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/com/cloud/api/ApiDispatcher.java b/server/src/com/cloud/api/ApiDispatcher.java index 552dea568ad..764b3aeceaa 100755 --- a/server/src/com/cloud/api/ApiDispatcher.java +++ b/server/src/com/cloud/api/ApiDispatcher.java @@ -372,8 +372,8 @@ public class ApiDispatcher { if (internalId == null) { if (s_logger.isDebugEnabled()) s_logger.debug("Object entity uuid = " + uuid + " does not exist in the database."); - throw new InvalidParameterValueException("Invalid parameter value=" + uuid - + " due to incorrect long value format, or entity was not found as it may have been deleted, or due to incorrect parameter annotation for the field in api cmd."); + throw new InvalidParameterValueException("Invalid parameter " + annotation.name() + " value=" + uuid + + " due to incorrect long value format, or entity does not exist or due to incorrect parameter annotation for the field in api cmd class."); } return internalId; } From a1ca7e09caab2dd69ee24fcd1dbe42918bf169a5 Mon Sep 17 00:00:00 2001 From: Rohit Yadav Date: Wed, 6 Mar 2013 18:46:33 +0530 Subject: [PATCH 25/26] rat: Fix license header on DataCenterLinkLocalIpAddressDao.java Signed-off-by: Rohit Yadav --- .../dc/dao/DataCenterLinkLocalIpAddressDao.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/server/src/com/cloud/dc/dao/DataCenterLinkLocalIpAddressDao.java b/server/src/com/cloud/dc/dao/DataCenterLinkLocalIpAddressDao.java index 64fabfbadb4..7fe946762c6 100644 --- a/server/src/com/cloud/dc/dao/DataCenterLinkLocalIpAddressDao.java +++ b/server/src/com/cloud/dc/dao/DataCenterLinkLocalIpAddressDao.java @@ -1,3 +1,19 @@ +// 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.dc.dao; import java.util.List; From a4521551a35cadd19a95752d3d93af8c2a9edd5b Mon Sep 17 00:00:00 2001 From: Wido den Hollander Date: Wed, 6 Mar 2013 16:41:39 +0100 Subject: [PATCH 26/26] agent: Log4j should not be initialized in the main method Since we use JSVC we don't execute the main method, but it is still there for manually running the Agent. Initializing log4j in the start method makes sure it also works with JSVC --- agent/src/com/cloud/agent/AgentShell.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/agent/src/com/cloud/agent/AgentShell.java b/agent/src/com/cloud/agent/AgentShell.java index 7297ab285e5..9cb3c3db3ff 100644 --- a/agent/src/com/cloud/agent/AgentShell.java +++ b/agent/src/com/cloud/agent/AgentShell.java @@ -553,6 +553,9 @@ public class AgentShell implements IAgentShell { public void start() { try { + /* By default we only search for log4j.xml */ + LogUtils.initLog4j("log4j-cloud.xml"); + System.setProperty("java.net.preferIPv4Stack", "true"); String instance = getProperty(null, "instance"); @@ -612,8 +615,6 @@ public class AgentShell implements IAgentShell { public static void main(String[] args) { try { - LogUtils.initLog4j("log4j-cloud.xml"); - AgentShell shell = new AgentShell(); shell.init(args); shell.start();