Merge branch 'master' into ui-vm-affinity

Conflicts:
	client/WEB-INF/classes/resources/messages.properties
	ui/scripts/cloudStack.js
	ui/scripts/instanceWizard.js
This commit is contained in:
Brian Federle 2013-04-22 13:45:29 -07:00
commit 7b011e7ef4
272 changed files with 16221 additions and 7952 deletions

385
CHANGES
View File

@ -1,7 +1,387 @@
Apache CloudStack (Incubating) CHANGES
Apache CloudStack CHANGES
======================================
Full release notes for each release are located in the project's documentation website: http://cloudstack.apache.org/docs
Full release notes for each release are located in the project's documentation website:
http://cloudstack.apache.org/docs
Version 4.2.0
------------------------
In progress
Version 4.1.0
------------------------
This is the second major release of CloudStack from within the Apache Software Foundation, and the
first major release as a Top-Level Project (TLP).
Build Tool Changes:
* The project now uses Maven 3 exclusively to build.
New Features:
* CLOUDSTACK-101: OVS support in KVM
* CLOUDSTACK-132: Mash up marvin into an interactive auto-completing API shell for CloudStack
* CLOUDSTACK-241: AWS Style Regions
* CLOUDSTACK-297: Reset SSH Key to access VM (similar to reset password)
* CLOUDSTACK-299: Egress firewall rules for guest network
* CLOUDSTACK-306: Support SRX & F5 inline mode
* CLOUDSTACK-618: API request throttling to avoid malicious attacks on MS per account through frequent API request.
* CLOUDSTACK-637: AutoScale
* CLOUDSTACK-644: Resize volumes feature
* CLOUDSTACK-706: Persistent Networks without running a VM
* CLOUDSTACK-726: Implement L3 Router functionality in Nicira Nvp Plugin
* CLOUDSTACK-780: Additional VMX Settings
* CLOUDSTACK-926: ApiDiscoverService: Implement a plugin mechanism that exposes the list of APIs through a discovery service on the management server
Bug Fixes:
* CLOUDSTACK-1600 Typo in dpkg-buildpackage command
* CLOUDSTACK-1574 updateResourceCount API is failed saying to specify valida resource type even after parsing the valid resource type
* CLOUDSTACK-1562 Replace the short-cut solution of supportting @DB with the formal one
* CLOUDSTACK-1541 NPE while deleting snapshot :Unexpected exception while executing org.apache.cloudstack.api.command.user.snapshot.DeleteSnapshotCmd
* CLOUDSTACK-1521 Redundant router: Services are not stopped when switch to BACKUP state
* CLOUDSTACK-1509 Failed to implement network elements and resources while provisioning for persistent network(createVlanIpRange to an account]
* CLOUDSTACK-1496 List API Performance: listAccounts failing with OOME for high values of pagesize (>1000 )
* CLOUDSTACK-1487 cloudstack-setup-agent fails to set private.network.device on KVM host add
* CLOUDSTACK-1485 Add Baremetal Provider back to 4.1 branch
* CLOUDSTACK-1484 "API Throttling : api.throttling.enabled, Global setting missing"
* CLOUDSTACK-1473 deleteDomain is failing with NPE
* CLOUDSTACK-1470 unhandled exception executing api command: deployVirtualMachine
* CLOUDSTACK-1469 kvm agent: agent service fails to start up
* CLOUDSTACK-1465 List Zones returns null under create instance when logged is as user
* CLOUDSTACK-1449 listAccounts and listProjectAccounts API lists all the users not account-specific users for each account returned
* CLOUDSTACK-1447 [UI]Persistent Status is not displayed for VPC Tiers
* CLOUDSTACK-1436 4.1 management server fails to start from RPM build artifacts
* CLOUDSTACK-1429 single account is unable to use same vnet across multiple physical networks
* CLOUDSTACK-1425 unhandled exception executing api command: migrateVirtualMachine & recoverVirtualMachine
* CLOUDSTACK-1420 Ensure trademarks are properly attributed in publican brand.
* CLOUDSTACK-1419 Apache-ify and apply trademark logos in the UI
* CLOUDSTACK-1418 "As regular user , we are not allowed to deploy VM on a shared network."
* CLOUDSTACK-1417 "When invalid values are passed to createNetwork() , error message does not indicate the parameter name that has invalid values."
* CLOUDSTACK-1414 Redundant router: BACKUP switch cancelled due to lock timeout after a glitch in network
* CLOUDSTACK-1403 Storage and console-proxy related error
* CLOUDSTACK-1402 listRouters API response doesn't return linklocal IP and public IP details
* CLOUDSTACK-1399 Unhandled exception executing api command: stopVirtualMachine
* CLOUDSTACK-1397 Static Nat configuration is failing with NPE
* CLOUDSTACK-1391 EventBus is not getting injected after javelin merge
* CLOUDSTACK-1383 Deploying basic zone on 4.1 fails in NPE
* CLOUDSTACK-1382 "vm deploy fails with Error ""cannot find DeployPlannerSelector for vm"""
* CLOUDSTACK-1375 deploydb failing with acs master
* CLOUDSTACK-1369 "Ipv6 - In dual Stack network , guest VM does not have the Ipv6 address of the router programmed in /etc/resolv.conf for DNS resolution."
* CLOUDSTACK-1367 NPE noticed in logs while AgentMonitor is monitoring the host ping interval
* CLOUDSTACK-1357 "Autoscale: Provisioned VMs from Netscaler not being added to lb vserver, provserver fails with provserver_err_asynctaskpoll"
* CLOUDSTACK-1350 Management server Stop and start causes previously downloaded ISOs and templates to redownload & reinstall
* CLOUDSTACK-1347 "Not able to delete network. Error - ""Unable to insert queue item into database, DB is full?"""
* CLOUDSTACK-1346 "Check to see if external devices are used in the network, is hardcoded for specific devices"
* CLOUDSTACK-1345 BigSwitch plugin introduces 'VNS' isolation in UI without backend implementation
* CLOUDSTACK-1344 Typo in use.external.dns setting description
* CLOUDSTACK-1343 Porting Baremetal related UI changes to ACS
* CLOUDSTACK-1341 URL for the KEYs file is wrong in the installation guide
* CLOUDSTACK-1339 ASF 4.1: Management server becomes unresponsive
* CLOUDSTACK-1338 Deploy VM failed using ISO
* CLOUDSTACK-1334 vmware.root.disk.controller doesn't work.
* CLOUDSTACK-1332 IPV6 - Router and guest Vms should be able to use an IPV6 address for external DNS entry.
* CLOUDSTACK-1331 Upgrade fails for a 2.2.14 Zone having multiple guest networks using network_tags and Public Vlan
* CLOUDSTACK-1330 ec2-run-instances - When -n option is used to deploy multiple Vms API returns error even though few of the Vms have been deployed successfully.
* CLOUDSTACK-1320 Routers naming convention is changed to hostname
* CLOUDSTACK-1319 createCustomerVpnGateway response gives TypeError: json.createvpncustomergatewayresponse is undefined
* CLOUDSTACK-1315 [F5-SRX-InlineMode] Network implement failed with Run time Exception during network upgrade from VR to SRX-F5
* CLOUDSTACK-1313 Working with Volumes Section Is Missing
* CLOUDSTACK-1312 "Fix rolling upgrades from 4.0 to 4.1 in 4.1 release, fix db schemas to be same as 4.0"
* CLOUDSTACK-1307 Noticed NPE when we put host in maintenance mode in clustered management setup
* CLOUDSTACK-1303 Ipv6 - java.lang.NullPointerException when executing listnetworks() and deployVirtualMachine() after extending the Ipv4 range of a dual stack network.
* CLOUDSTACK-1300 section in wrong order in installation guide
* CLOUDSTACK-1299 Errors in 4.5.5 section of installation guide
* CLOUDSTACK-1295 NPE in usage parsers due to missing @Component inject
* CLOUDSTACK-1289 [F5-SRX-InlineMode] Usage stats are not generated for Juniper SRX Firewall in inlinemode
* CLOUDSTACK-1288 [F5-SRX-InlineMode] classCastException during network restart with cleanup option true
* CLOUDSTACK-1277 ApiResponseHelper.createUserVmResponse failed to populate password field set from UserVm object
* CLOUDSTACK-1272 Autoscale: createAutoScaleVmProfile fails due to unable to retrieve Service Offering id
* CLOUDSTACK-1267 KVM's cloudstack-agent service doesn't log (log4j)
* CLOUDSTACK-1265 logrotate dnsmasq configuration is wrong
* CLOUDSTACK-1262 "Failed to Prepare Secondary Storage in VMware,"
* CLOUDSTACK-1251 Baremetal zone doesn't need primary/secondary storage in UI wizard
* CLOUDSTACK-1243 Failed to cleanup account :java.lang.NullPointerException
* CLOUDSTACK-1242 [F5-SRX-InlineMode] Failed to create LB rule with F5-SRX inlinemode deployement
* CLOUDSTACK-1241 Network apply rules logic is broken
* CLOUDSTACK-1237 "Register Template fails with ""Cannot find template adapter for XenServer"""
* CLOUDSTACK-1234 Unable to start KVM agent with 4.1 build
* CLOUDSTACK-1233 Veewee configuration files are inappropriately identified as ASLv2 licensed files
* CLOUDSTACK-1232 "Ipv6 - Guest Vms are not able to get Ipaddress when executing dhclient command when using ""/96"" network."
* CLOUDSTACK-1226 Error while running Cloudstack-setup-databases
* CLOUDSTACK-1223 Exception while starting jetty server: org.springframework.beans.factory.BeanCreationException Error creating bean with name 'apiServer':
* CLOUDSTACK-1222 API rate limit configs: removed double quote in upgrade script
* CLOUDSTACK-1220 Ipv6 - Better error message when deploy Vm fails to get a free Ip address.
* CLOUDSTACK-1219 Ipv6 - Provide better error messages when deploying a Vm with Ip an address that is outside the network's ip range / if the ip address already is assigned to another Vm.
* CLOUDSTACK-1216 UUID is null for admin and failed to register user key with 4.1
* CLOUDSTACK-1210 Make all pluggable services return list of api cmd classes
* CLOUDSTACK-1206 Failure in Copy of System templates
* CLOUDSTACK-1205 Ipv6 - Ubuntu 12.10 guest Vms looses default route (after it expiration time ~ 30 mts) when ipv6.autoconfig parameters are disabled except for net.ipv6.conf.lo.autoconf which is enabled.
* CLOUDSTACK-1204 Fail to create advance zone due to fail to add host
* CLOUDSTACK-1201 "Failed to create ssh key for user ""cloud"" /var/lib/cloud/management/.ssh/id_rsa and failed to start management server"
* CLOUDSTACK-1190 Make APIChecker interface throw a single sensible exception
* CLOUDSTACK-1181 mvn deploy db failing with NPE
* CLOUDSTACK-1176 Issue with snapshots(create/list)
* CLOUDSTACK-1174 Snapshots related SQL error
* CLOUDSTACK-1173 ConsoleProxyResource instantiation exception
* CLOUDSTACK-1168 Create firewall rule broken
* CLOUDSTACK-1163 Failed with NPE while creating firewall rule
* CLOUDSTACK-1161 Differences between 4.1 and master in ongoing-config-of-external-firewalls-lb.xml
* CLOUDSTACK-1154 Account/Users related API failed due to RegionService inject exception
* CLOUDSTACK-1153 "Ipv6 - Vm deployment fails with ""n must be positive"" error."
* CLOUDSTACK-1152 Missing tag in host-add.xml
* CLOUDSTACK-1141 "Ipv6 - After network restart (and reboot router) , we do not see the existing vms dnsentries not being programmed in the router."
* CLOUDSTACK-1138 "Providing invalid values for gateway, netmask etc in the zoneWizard blocks the VLAN container to load , throwing an error"
* CLOUDSTACK-1123 ListStoragePools API broken by refactor
* CLOUDSTACK-1113 "Ipv6 - Not able to deploy a new VM in this network because of ""Unable to allocate Unique Ipv6 address"""
* CLOUDSTACK-1112 "Errors in ""Prepare the System VM Template"""
* CLOUDSTACK-1111 Ipv6 - listRouters() does not return guestipaddress/
* CLOUDSTACK-1109 "Ipv6 - Unable to expunge User Vms that are ""Destroyed""."
* CLOUDSTACK-1108 Ipv6 - Not able to restart Networks.
* CLOUDSTACK-1107 Ipv6 - Unable to extend Ip range for a Ipv6 network using craeteVlanIpRange() command - Error code 530 returned.
* CLOUDSTACK-1105 "IpV6 - listVirtualMachines() does not return netmask ,gateway,ipaddress."
* CLOUDSTACK-1104 Ipv6 - listVlanIpRanges() returns error 530.
* CLOUDSTACK-1103 "IpV6 - listNetwork() command does not retrun gateway,netmask,cidr"
* CLOUDSTACK-1095 Ipv6 - dhclient command needs to be run manually on the Vms to get the Ipv6 address.
* CLOUDSTACK-1088 EnableStaticNat error will clear the data in database
* CLOUDSTACK-1087 Update the Developer Guide for ASFCS 4.1 Release
* CLOUDSTACK-1083 listUsageRecords api: removed project results in NPE
* CLOUDSTACK-1082 UI doesn't throw any error message when trying to delete ip range from a network that is in use
* CLOUDSTACK-1079 Deploying AWSAPI with mvn -pl :cloud-awsapi jetty:run fails
* CLOUDSTACK-1070 javelin: NPE on executing registerIso API
* CLOUDSTACK-1064 A type error occurs when trying to add account/register template....
* CLOUDSTACK-1063 "SG Enabled Advanced Zone - ""Add Guest Networks"" - When user tries to add a guest Network with scope as ""Account"" , he should NOT be presented with ""Offering for shared security group enabled"""
* CLOUDSTACK-1057 regression of changeServiceForVirtualMachine API - fails to find service offering by serviceOfferingId parameter
* CLOUDSTACK-1056 S3 secondary storage fails to upload systemvm template due to KVMHA directory
* CLOUDSTACK-1055 "The overlay still exists when the ""Recurring Snapshots"" dialog is canceled by pressing esc key."
* CLOUDSTACK-1051 API dispatcher unable to find objectVO corresponding to DeleteTemplatecmd
* CLOUDSTACK-1050 No Documentation on Adding a Load Balancer Rule
* CLOUDSTACK-1037 "Make cloudmonkey awesome-er: Online help docs and api discovery, better colored output, parameter value autocompletion"
* CLOUDSTACK-1029 Enter the token to specified project is malfunctioned
* CLOUDSTACK-1027 """Update SSL certificate"" button should properly reflect it's functionality"
* CLOUDSTACK-1024 Regression: Unable to add Xenserver host with latest build
* CLOUDSTACK-1021 the vlan is not creat to right nic. when i creat multi guest network.
* CLOUDSTACK-1016 Not able to deploy VM.
* CLOUDSTACK-1014 Merge ManagementServer and ManagementServerExt
* CLOUDSTACK-1013 running cloudstack overwrites default public/private ssh keys
* CLOUDSTACK-1011 KVM host getting disconnected in cluster environment
* CLOUDSTACK-1010 Host count and Secondary storage count always shows 1 in UI
* CLOUDSTACK-1002 Not able to start VM.
* CLOUDSTACK-995 Not able to add the KVM host.
* CLOUDSTACK-993 """admin"" user is not getting created when management server is started."
* CLOUDSTACK-987 Sections missing in Working With Snapshots
* CLOUDSTACK-985 Different MAC address for RvR caused issue in short term network outrage
* CLOUDSTACK-978 TypeError: instance.displayname is undefined while adding VM's to the LB rule.
* CLOUDSTACK-968 marvin: vlan should be an attribute of the physical_network and not the zone
* CLOUDSTACK-959 Missing sub-sections in document section System Service Offerings
* CLOUDSTACK-938 s2s VPN trouble
* CLOUDSTACK-928 [Simulator] Latency for Agent Commands - change unit of wait from seconds to milliseconds
* CLOUDSTACK-863 Non-printable characters (ASCII control character) such as %00 or %0025 are getting stored in raw/non encoded form in the database.
* CLOUDSTACK-819 Create Account/User API logging password in access logs
* CLOUDSTACK-799 [Load Test] Check router statistics falls behind in gathering stats by more than 2 times the set value
* CLOUDSTACK-798 Move usage related cmd classes from cloud-server to cloud-api
* CLOUDSTACK-736 Integration smoke tests: Fix check for vm name for the deployvm smoke test
* CLOUDSTACK-734 api_refactoring: CreateAccountCmd fails to send response due to NPE in service layer
* CLOUDSTACK-725 UI: Error when the Egress rules tab is selected for a network
* CLOUDSTACK-721 Bytes sent/received in user statistics is empty (CloudStack 4.0)
* CLOUDSTACK-720 Fail to load a png image when accessing the web console
* CLOUDSTACK-717 cloudmonkey fails to parse/print response
* CLOUDSTACK-693 Adding a VPC virtual router to a NiciraNVP enabled network fails
* CLOUDSTACK-691 A warning dialog box shows after reloading the welcome page
* CLOUDSTACK-689 RVR: Stop pending flag is not cleared when user start the disconnected router from another host
* CLOUDSTACK-683 Image Is Missing in the Accessing VM Section
* CLOUDSTACK-660 Network Traffic Labels are not functional in Marvin
* CLOUDSTACK-648 The normal users could change their own login password
* CLOUDSTACK-639 API Refactoring: Adapters for ACL
* CLOUDSTACK-617 Unable to edit a Sub domain
* CLOUDSTACK-614 "ListTemplates API is not returning ""Enable SSH Key"" attribute for any given template"
* CLOUDSTACK-606 Starting VM fails with 'ConcurrentOperationException' in a clustered MS scenario
* CLOUDSTACK-605 Host physical CPU is incorrectly calculated for Vmware hosts
* CLOUDSTACK-599 DhcpEntryCommand fails on Router VM on CS4.0 and vSphere5 with Advanced Network Zone
* CLOUDSTACK-596 DeployVM command takes a lot of time to return job id
* CLOUDSTACK-584 "typos in ""Apache_CloudStack-4.0.0-incubating-CloudStack_Nicira_NVP_Guide-en-US"""
* CLOUDSTACK-573 "NPE at ""com.cloud.network.NetworkManagerImpl.networkOfferingIsConfiguredForExternalNetworking(NetworkManagerImpl.java:4345)"" when create network from the network offering having NULL provider for the service"
* CLOUDSTACK-572 SG Enabled Advanced Zone - Not able to deploy a VM in an account specific shared network.
* CLOUDSTACK-560 Usage server doesn't work in 4.0.0 due to missing db changes
* CLOUDSTACK-556 Erratic window behavior in Quick View tooltip
* CLOUDSTACK-553 "SRX - When adding SRX device make ""Public Network"" - default to ""untrusted"" and ""Private Network"" - default to ""trusted"" as un-editable fields."
* CLOUDSTACK-552 ]Quick view details for a volume displays scroll bar in place of name of the volume when the name of the volume has more no of characters
* CLOUDSTACK-539 Cropped Text in UI under Quick View
* CLOUDSTACK-536 remove citrix cloudpatform from 4.0 build - CloudStack is ASF project
* CLOUDSTACK-527 List API performance optimization by using DB views and removing UUID conversion.
* CLOUDSTACK-522 Log requests in cloudmonkey's log file
* CLOUDSTACK-520 Dependency jar names mismatch with install-non-oss.sh
* CLOUDSTACK-518 API refactoring -- change @Parameter annotation and remove the @IdentityMapper annotation
* CLOUDSTACK-514 Marvin and Cloudmonkey don't work when an API target uses https or an alternate path
* CLOUDSTACK-510 Add button not visible when adding public IPs to physical network
* CLOUDSTACK-508 CLVM copies template to primary storage unnecessarily
* CLOUDSTACK-507 fix api docs for listSSHKeyPairs
* CLOUDSTACK-504 Duplicate guest password scripts in codebase
* CLOUDSTACK-501 Apidocs and marvin does not know how to handle Autoscaling docs
* CLOUDSTACK-500 Passwd-server iptables rules are dropped on domr on fresh start or on reboot
* CLOUDSTACK-499 cloudmonkey CLI can't accept complex parameters
* CLOUDSTACK-493 2.2.x-3.0 DB upgrade support for Advance SG enabled networks
* CLOUDSTACK-481 Installation Guide Doc Error
* CLOUDSTACK-467 Developer's Guide points to cloud.com for API reference
* CLOUDSTACK-465 French language file quotes are dropping javascript syntax errors
* CLOUDSTACK-464 "Regression in AWSAPI docs, entire sections removed"
* CLOUDSTACK-462 A few corrections to make to the 4.0.0 installation guide
* CLOUDSTACK-459 [Optional Public IP assignment for EIP with Basic Zone] Associate IP Checkbox in Create Network Offering Dialog is Displayed When Elastic LB is Selected
* CLOUDSTACK-456 License tag in SPEC isn't what RPM is expecting
* CLOUDSTACK-448 SSVM bootstrap failure on XenServer hosts with E3 CPU
* CLOUDSTACK-446 "Host going to alert state, if you are adding already added host"
* CLOUDSTACK-441 Running mgmt server using jetty fails to start api server
* CLOUDSTACK-435 Vmware network labels are ignored when creating a Zone using basic networking
* CLOUDSTACK-427 Change hardcoded step number references to dynamic links
* CLOUDSTACK-424 Updated userdata not propagating to the VR.
* CLOUDSTACK-417 Handle password server securely to run on port 8080 on VR
* CLOUDSTACK-416 XCP 1.6beta2 (61002c) - can't add a host
* CLOUDSTACK-404 Update docs on the usage of cloud-setup-databases
* CLOUDSTACK-398 Install Guide: Section 11.17.3 (Using VPN with Mac OSX): Not complete?
* CLOUDSTACK-397 Install Guide: Section 11.1 (Guest Traffic): Diagram is the wrong diagram
* CLOUDSTACK-390 Install Guide: Section 4.5.7 (Prepare the System VM Template): Links go to cloud.com
* CLOUDSTACK-378 mavenize marvin on master
* CLOUDSTACK-377 provide deployment config access to marvin's testcase
* CLOUDSTACK-373 "static NAT and Firewall is not working on external firewall device SRX, it needs to be implemented"
* CLOUDSTACK-369 ASF 4.0 - unable to support XenServer 6.1 host
* CLOUDSTACK-364 Docs point to download.cloud.com for AWS API script
* CLOUDSTACK-361 Wrong creation of guest networks on a KVM host in Multiple Physical Networks with guest traffic
* CLOUDSTACK-359 PropagateResourceEventCommand failes in cluster configuration
* CLOUDSTACK-357 "ISOs can be deleted while still attached to a running VM, and they subsequently cannot be detached from a running VM"
* CLOUDSTACK-355 "Fix ""count"" in a bunch of API commands"
* CLOUDSTACK-348 deleteNetwork does not clean up network resource count correctly
* CLOUDSTACK-347 listNetworks API: return vlan information only when the caller is ROOT admin
* CLOUDSTACK-346 Cannot add Vmware cluster with class loader conflict exception
* CLOUDSTACK-335 KVM VPC load balancer not working
* CLOUDSTACK-333 When Datacenter name in VCenter has spaces Primary Storage (VMFS) discovery will fail
* CLOUDSTACK-332 """count"" property in list* API response should be equal to how many entries in database, not how many objects in API response"
* CLOUDSTACK-318 Adding XenServer Host Fails - 6.0.2 fails with 4.0.0
* CLOUDSTACK-304 Add synchronization for createSnapshot command per host basis
* CLOUDSTACK-293 "We do awful, hacky things in our spec file for client"
* CLOUDSTACK-290 3.0.0 template also needed for 2.2.14 to 3.0.5 direct upgrade.
* CLOUDSTACK-284 listVirtualMachines does not return deleted machines when zone is specified
* CLOUDSTACK-279 deleteProject fails when executed by the regular user (works fine for root/domain admin)
* CLOUDSTACK-274 Two error codes mapped to same value in API
* CLOUDSTACK-271 updatePhysicalNetwork dies with an NPE when the vlan range is empty
* CLOUDSTACK-256 "vpn:As an admin user , not able to delete VPN user which is present in a regular user's network."
* CLOUDSTACK-250 Incorrect description of maintenance mode in admin guide
* CLOUDSTACK-249 Add host id to failed VM deploy alerts
* CLOUDSTACK-235 Network rate can be set in 2 places. Clarify docs on how this works.
* CLOUDSTACK-232 Zone infrastructure chart -- disable resource total display
* CLOUDSTACK-228 UI provides an option to reconnect a disconnected host - ServerApiException is thrown on an attempt
* CLOUDSTACK-227 ReconnectHostCmd: NullPointerException: Unable to get host Information for XenServer 6.0.2 host - on intentionally changing the traffic labels on the physical network
* CLOUDSTACK-226 UpdatePhysicalNetworkcommand failed due to java.sql.BatchUpdateException ; Tried to extend the existing Guest VLAN Range of one physical network into the Guest VLAN range of the other physical network
* CLOUDSTACK-225 API Docs: Request params repeated with different descriptions
* CLOUDSTACK-222 Admin UI prompts to restart Management server with cancel edit operation
* CLOUDSTACK-178 Expose name parameter of VM in list Vm view.
* CLOUDSTACK-130 Clarify docs on tags parameter in API reference
* CLOUDSTACK-119 Move Agent-Simulator in to the hypervisor plugin model
* CLOUDSTACK-118 "Status of host resorce stuck in ""ErrorInMaintenance"""
* CLOUDSTACK-95 IP address allocation not working when a user tries to allocate IP addresses in a Project.
* CLOUDSTACK-70 Improve Network Restart Behaviour for Basic Zone: Restarting Network Fails
* CLOUDSTACK-46 Remnants of mycloud remain
Security Fixes:
* CVE-2012-4501: Apache CloudStack configuration vulnerability
Version 4.0.2
------------------------
This is a maintenance release for the Apache CloudStack 4.0.x series, with no new features.
Issues fixed in this release:
* CLOUDSTACK-354: Display of storage statistics is wrong.
* CLOUDSTACK-397: Install Guide: Section 11.1 (Guest Traffic): Diagram is the wrong diagram
* CLOUDSTACK-398: Install Guide: Section 11.17.3 (Using VPN with Mac OSX): Not complete?
* CLOUDSTACK-462: A few corrections to make to the 4.0.0 installation guide
* CLOUDSTACK-524: http proxy used by ssvm (secstorage.proxy) NOT working
* CLOUDSTACK-587: MEMORY_CONSTRAINT_VIOLATIONMemory limits must satisfy:
* CLOUDSTACK-803: HA gets triggered even when the host investigator is unable to determine the state of the host
* CLOUDSTACK-810: Make DirectAgent thread pool size configurable
* CLOUDSTACK-976: unable to start cloudstack (error: "java.lang.NoSuchMethodError: org.apache.commons.codec.binary.Base64.encodeBase64URLSafeString([B)Ljava/lang/String;")
* CLOUDSTACK-988: HV version must be updated in hypervisor_version column of host table
* CLOUDSTACK-990: Documentation issue with libvirtd.conf tcp_port configuration
* CLOUDSTACK-1088: EnableStaticNat error will clear the data in database
* CLOUDSTACK-1106: Missing documentation for cloud-setup-databases
* CLOUDSTACK-1110: Documentation missing "Management Server Load Balancing"
* CLOUDSTACK-1112: Errors in "Prepare the System VM Template"
* CLOUDSTACK-1137: Force reconnect of a disconnected state complains about the state of the host.
* CLOUDSTACK-1150: Documentation for libvirt on Ubuntu 12.04
* CLOUDSTACK-1151: vmware systemVm template upgrade is missing in 4.0 upgrade
* CLOUDSTACK-1211: Network operations are Blocked for the Read-only file system of Virtual Router
* CLOUDSTACK-1265: logrotate dnsmasq configuration is wrong
* CLOUDSTACK-1291: duplicate arguments in commands.xml prevents cloudapis.py to run to completion
* CLOUDSTACK-1298: typo in deb package setup
* CLOUDSTACK-1299: Errors in 4.5.5 section of installation guide
* CLOUDSTACK-1300: section in wrong order in installation guide
* CLOUDSTACK-1341: URL for the KEYs file is wrong in the installation guide
* CLOUDSTACK-1419: Apache-ify and apply trademark logos in the UI
* CLOUDSTACK-1420: Ensure trademarks are properly attributed in publican brand.
* CLOUDSTACK-1589: Ubuntu 4.0 packages depend on non-existent chkconfig
* CLOUDSTACK-1629: Need to move location or conflict with antlr
* CLOUDSTACK-1642: Add support CentOS 6.4
* CLOUDSTACK-1648: Unable to add KVM host
* CLOUDSTACK-1652: /etc/hosts error in virtual router when deploy instance with the name same to previous instances
* CLOUDSTACK-1666: KVM VPC NetworkUsage doesnot work
* CLOUDSTACK-1668: IP conflict in VPC tier
* CLOUDSTACK-1761: Available local storage disk capacity incorrectly reported in KVM to manager.
* CLOUDSTACK-1845: KVM - storage migration often fails
* CLOUDSTACK-1846: KVM - storage pools can silently fail to be unregistered, leading to failure to register later
* CLOUDSTACK-2003: Deleting domain while deleted account is cleaning up leaves VMs expunging forever due to 'Failed to update resource count'
* CLOUDSTACK-2090: Upgrade from version 4.0.1 to version 4.0.2 triggers the 4.0.0 to 4.0.1.
* CLOUDSTACK-2091: Error in API documentation for 4.0.x.
Version 4.0.1-incubating
------------------------
This is a bugfix release for Apache CloudStack 4.0.0-incubating, with no new features.
Security Fixes:
* CVE-2012-5616: Local Information Disclosure Vulnerability (See CLOUDSTACK-505)
Bugs fixed in this release:
* CLOUDSTACK-359: PropagateResourceEventCommand fails in cluster configuration
* CLOUDSTACK-374: When running cloud-setup-databases, it auto chooses the highest priority nic (lowest number ie: eth0)
* CLOUDSTACK-389: Install Guide: Section 4.5.5 (Prepare NFS Shares): Confusing statement about iSCSI
* CLOUDSTACK-395: Primary Storage and Secondary Storage sections missing sub-sections
* CLOUDSTACK-411: Add another step during kvm agent installation on Ubuntu machine
* CLOUDSTACK-415: restartNetwork call causes VM to be unreachable when Nicira based SDN is used.
* CLOUDSTACK-422: XSL files missing license header.
* CLOUDSTACK-426: SetVPCStaticNatRules unimplemented for KVM.
* CLOUDSTACK-448: SSVM bootstrap failure on XenServer hosts with E3 CPU.
* CLOUDSTACK-465: French language file quotes are dropping javascript syntax errors.
* CLOUDSTACK-473: API Doc for uploadCustomCertificate doesn't explain how to use the optional parameters well.
* CLOUDSTACK-480: Installation Documentation error: Section 4.5.5.2 needs to mention nfs-kernel-server.
* CLOUDSTACK-481: Installation Guide Doc Error
* CLOUDSTACK-498: Missing dependency in RPM of KVM Agent.
* CLOUDSTACK-502: VPC router needs to resolve its hostname.
* CLOUDSTACK-505: cloudstack logs the private key in plaintext.
* CLOUDSTACK-507: fix api docs for listSSHKeyPairs.
* CLOUDSTACK-515: NVP installation.
* CLOUDSTACK-536: remove citrix cloudpatform from 4.0 build - CloudStack is ASF project.
* CLOUDSTACK-560: Usage server doesn't work in 4.0.0 due to missing db changes.
* CLOUDSTACK-580: Packages are named with 4.0 with 4.0.1 build.
* CLOUDSTACK-591: Wrong vnet in iptables on KVM hypervisors after VM reboot.
* CLOUDSTACK-595: Recreate root volume scenarios doesn't work in VMware
* CLOUDSTACK-603: Upgrade from 4.0 to 4.0.1 is not enabled.
* CLOUDSTACK-605: Host physical CPU is incorrectly calculated for VMware host
* CLOUDSTACK-622: In the add primary storage dialog in the ui the RBD fields don't disappear when changing from RBD to another protocol.
* CLOUDSTACK-683: Image is missing in the Accessing VM Section
* CLOUDSTACK-685: CloudStack 4.0 Network Usage is ZERO
* CLOUDSTACK-938: s2s VPN trouble
* CLOUDSTACK-961: Installation docs don't detail dependencies for building RPMs
* CLOUDSTACK-995: Not able to add the KVM host
Version 4.0.0-incubating
------------------------
@ -34,4 +414,3 @@ New Features:
Security Fixes:
* CVE-2012-4501: Apache CloudStack configuration vulnerability

View File

@ -1,8 +1,8 @@
Apache CloudStack (Incubating) Version 4.0.0
Apache CloudStack Version 4.2.0
# About Apache CloudStack (Incubating)
# About Apache CloudStack
Apache CloudStack (Incubating) is software designed to deploy
Apache CloudStack is software designed to deploy
and manage large networks of virtual machines, as a highly
available, highly scalable Infrastructure as a Service (IaaS)
cloud computing platform. CloudStack is used by a number of

View File

@ -19,6 +19,7 @@ package com.cloud.agent.api;
import com.cloud.agent.api.LogLevel.Log4jLevel;
import com.cloud.agent.api.to.S3TO;
import com.cloud.agent.api.to.SwiftTO;
import com.cloud.storage.StoragePool;
/**
* This command encapsulates a primitive operation which enables coalescing the backed up VHD snapshots on the secondary server
@ -78,7 +79,8 @@ public class DeleteSnapshotBackupCommand extends SnapshotCommand {
* @param backupUUID The VHD which has to be deleted
* @param childUUID The child VHD file of the backup whose parent is reset to its grandparent.
*/
public DeleteSnapshotBackupCommand(SwiftTO swift,
public DeleteSnapshotBackupCommand(StoragePool pool,
SwiftTO swift,
S3TO s3,
String secondaryStoragePoolURL,
Long dcId,
@ -86,7 +88,7 @@ public class DeleteSnapshotBackupCommand extends SnapshotCommand {
Long volumeId,
String backupUUID, Boolean all)
{
super(null, secondaryStoragePoolURL, backupUUID, null, dcId, accountId, volumeId);
super(pool, secondaryStoragePoolURL, backupUUID, null, dcId, accountId, volumeId);
setSwift(swift);
this.s3 = s3;
setAll(all);

View File

@ -0,0 +1,39 @@
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package com.cloud.agent.api;
import java.util.List;
import com.cloud.agent.api.to.VolumeTO;
public class MigrateWithStorageAnswer extends Answer {
List<VolumeTO> volumeTos;
public MigrateWithStorageAnswer(MigrateWithStorageCommand cmd, Exception ex) {
super(cmd, ex);
volumeTos = null;
}
public MigrateWithStorageAnswer(MigrateWithStorageCommand cmd, List<VolumeTO> volumeTos) {
super(cmd, true, null);
this.volumeTos = volumeTos;
}
public List<VolumeTO> getVolumeTos() {
return volumeTos;
}
}

View File

@ -0,0 +1,45 @@
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package com.cloud.agent.api;
import java.util.Map;
import com.cloud.agent.api.to.VirtualMachineTO;
import com.cloud.agent.api.to.VolumeTO;
import com.cloud.agent.api.to.StorageFilerTO;
public class MigrateWithStorageCommand extends Command {
VirtualMachineTO vm;
Map<VolumeTO, StorageFilerTO> volumeToFiler;
public MigrateWithStorageCommand(VirtualMachineTO vm, Map<VolumeTO, StorageFilerTO> volumeToFiler) {
this.vm = vm;
this.volumeToFiler = volumeToFiler;
}
public VirtualMachineTO getVirtualMachine() {
return vm;
}
public Map<VolumeTO, StorageFilerTO> getVolumeToFiler() {
return volumeToFiler;
}
@Override
public boolean executeInSequence() {
return true;
}
}

View File

@ -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.agent.api;
import java.util.List;
import com.cloud.agent.api.to.VolumeTO;
public class MigrateWithStorageCompleteAnswer extends Answer {
List<VolumeTO> volumeTos;
public MigrateWithStorageCompleteAnswer(MigrateWithStorageCompleteCommand cmd, Exception ex) {
super(cmd, ex);
volumeTos = null;
}
public MigrateWithStorageCompleteAnswer(MigrateWithStorageCompleteCommand cmd, List<VolumeTO> volumeTos) {
super(cmd, true, null);
this.volumeTos = volumeTos;
}
public List<VolumeTO> getVolumeTos() {
return volumeTos;
}
}

View File

@ -0,0 +1,36 @@
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package com.cloud.agent.api;
import com.cloud.agent.api.to.VirtualMachineTO;
public class MigrateWithStorageCompleteCommand extends Command {
VirtualMachineTO vm;
public MigrateWithStorageCompleteCommand(VirtualMachineTO vm) {
this.vm = vm;
}
public VirtualMachineTO getVirtualMachine() {
return vm;
}
@Override
public boolean executeInSequence() {
return false;
}
}

View File

@ -0,0 +1,55 @@
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package com.cloud.agent.api;
import java.util.Map;
import com.cloud.agent.api.to.VolumeTO;
import com.cloud.agent.api.to.NicTO;
public class MigrateWithStorageReceiveAnswer extends Answer {
Map<VolumeTO, Object> volumeToSr;
Map<NicTO, Object> nicToNetwork;
Map<String, String> token;
public MigrateWithStorageReceiveAnswer(MigrateWithStorageReceiveCommand cmd, Exception ex) {
super(cmd, ex);
volumeToSr = null;
nicToNetwork = null;
token = null;
}
public MigrateWithStorageReceiveAnswer(MigrateWithStorageReceiveCommand cmd, Map<VolumeTO, Object> volumeToSr,
Map<NicTO, Object> nicToNetwork, Map<String, String> token) {
super(cmd, true, null);
this.volumeToSr = volumeToSr;
this.nicToNetwork = nicToNetwork;
this.token = token;
}
public Map<VolumeTO, Object> getVolumeToSr() {
return volumeToSr;
}
public Map<NicTO, Object> getNicToNetwork() {
return nicToNetwork;
}
public Map<String, String> getToken() {
return token;
}
}

View File

@ -0,0 +1,45 @@
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package com.cloud.agent.api;
import java.util.Map;
import com.cloud.agent.api.to.VirtualMachineTO;
import com.cloud.agent.api.to.VolumeTO;
import com.cloud.agent.api.to.StorageFilerTO;
public class MigrateWithStorageReceiveCommand extends Command {
VirtualMachineTO vm;
Map<VolumeTO, StorageFilerTO> volumeToFiler;
public MigrateWithStorageReceiveCommand(VirtualMachineTO vm, Map<VolumeTO, StorageFilerTO> volumeToFiler) {
this.vm = vm;
this.volumeToFiler = volumeToFiler;
}
public VirtualMachineTO getVirtualMachine() {
return vm;
}
public Map<VolumeTO, StorageFilerTO> getVolumeToFiler() {
return volumeToFiler;
}
@Override
public boolean executeInSequence() {
return true;
}
}

View File

@ -0,0 +1,39 @@
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package com.cloud.agent.api;
import java.util.Set;
import com.cloud.agent.api.to.VolumeTO;
public class MigrateWithStorageSendAnswer extends Answer {
Set<VolumeTO> volumeToSet;
public MigrateWithStorageSendAnswer(MigrateWithStorageSendCommand cmd, Exception ex) {
super(cmd, ex);
volumeToSet = null;
}
public MigrateWithStorageSendAnswer(MigrateWithStorageSendCommand cmd, Set<VolumeTO> volumeToSet) {
super(cmd, true, null);
this.volumeToSet = volumeToSet;
}
public Set<VolumeTO> getVolumeToSet() {
return volumeToSet;
}
}

View File

@ -0,0 +1,58 @@
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package com.cloud.agent.api;
import java.util.Map;
import com.cloud.agent.api.to.VirtualMachineTO;
import com.cloud.agent.api.to.VolumeTO;
import com.cloud.agent.api.to.NicTO;
public class MigrateWithStorageSendCommand extends Command {
VirtualMachineTO vm;
Map<VolumeTO, Object> volumeToSr;
Map<NicTO, Object> nicToNetwork;
Map<String, String> token;
public MigrateWithStorageSendCommand(VirtualMachineTO vm, Map<VolumeTO, Object> volumeToSr,
Map<NicTO, Object> nicToNetwork, Map<String, String> token) {
this.vm = vm;
this.volumeToSr = volumeToSr;
this.nicToNetwork = nicToNetwork;
this.token = token;
}
public VirtualMachineTO getVirtualMachine() {
return vm;
}
public Map<VolumeTO, Object> getVolumeToSr() {
return volumeToSr;
}
public Map<NicTO, Object> getNicToNetwork() {
return nicToNetwork;
}
public Map<String, String> getToken() {
return token;
}
@Override
public boolean executeInSequence() {
return true;
}
}

View File

@ -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.agent.api.storage;
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.Command;
public class MigrateVolumeAnswer extends Answer {
private String volumePath;
public MigrateVolumeAnswer(Command command, boolean success, String details, String volumePath) {
super(command, success, details);
this.volumePath = volumePath;
}
public MigrateVolumeAnswer(Command command) {
super(command);
this.volumePath = null;
}
public String getVolumePath() {
return volumePath;
}
}

View File

@ -0,0 +1,51 @@
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package com.cloud.agent.api.storage;
import com.cloud.agent.api.Command;
import com.cloud.agent.api.to.StorageFilerTO;
import com.cloud.storage.StoragePool;
public class MigrateVolumeCommand extends Command {
long volumeId;
String volumePath;
StorageFilerTO pool;
public MigrateVolumeCommand(long volumeId, String volumePath, StoragePool pool) {
this.volumeId = volumeId;
this.volumePath = volumePath;
this.pool = new StorageFilerTO(pool);
}
@Override
public boolean executeInSequence() {
return true;
}
public String getVolumePath() {
return volumePath;
}
public long getVolumeId() {
return volumeId;
}
public StorageFilerTO getPool() {
return pool;
}
}

View File

@ -52,4 +52,6 @@ public interface HypervisorCapabilities extends Identity, InternalIdentity{
*/
Integer getMaxHostsPerCluster();
boolean isStorageMotionSupported();
}

View File

@ -78,16 +78,7 @@ public interface IpAddress extends ControlledEntity, Identity, InternalIdentity
boolean getSystem();
/**
* @return
*/
Long getVpcId();
/**
* @param vpcId
*/
void setVpcId(Long vpcId);
String getVmIp();
void setVmIp(String vmIp);
}

View File

@ -16,24 +16,11 @@
// under the License.
package com.cloud.network;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.apache.cloudstack.acl.ControlledEntity;
import org.apache.cloudstack.api.Identity;
import org.apache.cloudstack.api.InternalIdentity;
import com.cloud.network.Networks.BroadcastDomainType;
import com.cloud.network.Networks.Mode;
import com.cloud.network.Networks.TrafficType;
import com.cloud.network.Networks.BroadcastDomainType;
import com.cloud.network.Networks.Mode;
import com.cloud.network.Networks.TrafficType;
import com.cloud.utils.fsm.StateMachine2;
import com.cloud.utils.fsm.StateObject;
import org.apache.cloudstack.acl.ControlledEntity;
import org.apache.cloudstack.api.Identity;
import org.apache.cloudstack.api.InternalIdentity;
@ -183,6 +170,7 @@ public interface Network extends ControlledEntity, StateObject<Network.State>, I
public static final Capability AllowDnsSuffixModification = new Capability("AllowDnsSuffixModification");
public static final Capability RedundantRouter = new Capability("RedundantRouter");
public static final Capability ElasticIp = new Capability("ElasticIp");
public static final Capability AssociatePublicIP = new Capability("AssociatePublicIP");
public static final Capability ElasticLb = new Capability("ElasticLb");
public static final Capability AutoScaleCounters = new Capability("AutoScaleCounters");
public static final Capability InlineMode = new Capability("InlineMode");

View File

@ -79,7 +79,7 @@ public interface NetworkService {
Long startIndex, Long pageSize, String name);
PhysicalNetwork updatePhysicalNetwork(Long id, String networkSpeed, List<String> tags,
String newVnetRangeString, String state);
String newVnetRangeString, String state, String removeVlan);
boolean deletePhysicalNetwork(Long id);

View File

@ -18,6 +18,7 @@ package com.cloud.network;
import java.util.List;
import com.cloud.utils.Pair;
import org.apache.cloudstack.api.Identity;
import org.apache.cloudstack.api.InternalIdentity;
@ -59,7 +60,9 @@ public interface PhysicalNetwork extends Identity, InternalIdentity {
Long getDomainId();
String getVnet();
List<Pair<Integer,Integer>> getVnet();
String getVnetString();
String getSpeed();

View File

@ -30,7 +30,4 @@ public interface PublicIpAddress extends ControlledEntity, IpAddress, Vlan, Inte
public String getNetmask();
public String getGateway();
@Override
public String getVlanTag();
}

View File

@ -28,7 +28,11 @@ import com.cloud.utils.component.Adapter;
public interface IpDeployer extends Adapter{
/**
* Apply ip addresses to this network
* Modify ip addresses on this network
* Depending on the State of the ip addresses the element should take
* appropriate action.
* If state is Releasing the ip address should be de-allocated
* If state is Allocating or Allocated the ip address should be provisioned
* @param network
* @param ipAddress
* @return

View File

@ -107,6 +107,8 @@ public interface NetworkOffering extends InfrastructureEntity, InternalIdentity,
boolean getElasticIp();
boolean getAssociatePublicIP();
boolean getElasticLb();
boolean getSpecifyIpRanges();

View File

@ -75,9 +75,11 @@ import com.cloud.network.IpAddress;
import com.cloud.org.Cluster;
import com.cloud.storage.GuestOS;
import com.cloud.storage.GuestOsCategory;
import com.cloud.storage.StoragePool;
import com.cloud.template.VirtualMachineTemplate;
import com.cloud.user.SSHKeyPair;
import com.cloud.utils.Pair;
import com.cloud.utils.Ternary;
import com.cloud.vm.InstanceGroup;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachine.Type;
@ -388,10 +390,21 @@ public interface ManagementService {
* @param Long
* vmId
* Id of The VM to migrate
* @return Pair<List<? extends Host>, List<? extends Host>> List of all Hosts in VM's cluster and list of Hosts with
* enough capacity
* @return Ternary<List<? extends Host>, List<? extends Host>, Map<Host, Boolean>> List of all Hosts to which a VM
* can be migrated, list of Hosts with enough capacity and hosts requiring storage motion for migration.
*/
Pair<Pair<List<? extends Host>, Integer>, List<? extends Host>> listHostsForMigrationOfVM(Long vmId, Long startIndex, Long pageSize);
Ternary<Pair<List<? extends Host>, Integer>, List<? extends Host>, Map<Host, Boolean>> listHostsForMigrationOfVM(
Long vmId, Long startIndex, Long pageSize);
/**
* List storage pools for live migrating of a volume. The API returns list of all pools in the cluster to which the
* volume can be migrated. Current pool is not included in the list.
*
* @param Long volumeId
* @return Pair<List<? extends StoragePool>, List<? extends StoragePool>> List of storage pools in cluster and list
* of pools with enough capacity.
*/
Pair<List<? extends StoragePool>, List<? extends StoragePool>> listStoragePoolsForMigrationOfVolume(Long volumeId);
String[] listEventTypes();
@ -407,6 +420,4 @@ public interface ManagementService {
*/
List<? extends Capacity> listTopConsumedResources(ListCapacityCmd cmd);
List<String> listDeploymentPlanners();
}

View File

@ -22,6 +22,7 @@ import org.apache.cloudstack.acl.ControlledEntity;
import org.apache.cloudstack.api.Identity;
import org.apache.cloudstack.api.InternalIdentity;
public interface Account extends ControlledEntity, InternalIdentity, Identity {
public enum Type {
Normal,
@ -64,4 +65,7 @@ public interface Account extends ControlledEntity, InternalIdentity, Identity {
public Long getDefaultZoneId();
public String getUuid();
boolean isDefault();
}

View File

@ -73,4 +73,6 @@ public interface User extends OwnedBy, InternalIdentity {
boolean isRegistered();
boolean isDefault();
}

View File

@ -405,6 +405,33 @@ public interface UserVmService {
*/
VirtualMachine migrateVirtualMachine(Long vmId, Host destinationHost) throws ResourceUnavailableException, ConcurrentOperationException, ManagementServerException, VirtualMachineMigrationException;
/**
* Migrate the given VM with its volumes to the destination host. The API returns the migrated VM if it succeeds.
* Only root admin can migrate a VM.
*
* @param destinationStorage
* TODO
* @param Long
* vmId of The VM to migrate
* @param Host
* destinationHost to migrate the VM
* @param Map
* A map of volume to which pool it should be migrated
*
* @return VirtualMachine migrated VM
* @throws ManagementServerException
* in case we get error finding the VM or host or access errors or other internal errors.
* @throws ConcurrentOperationException
* if there are multiple users working on the same VM.
* @throws ResourceUnavailableException
* if the destination host to migrate the VM is not currently available.
* @throws VirtualMachineMigrationException
* if the VM to be migrated is not in Running state
*/
VirtualMachine migrateVirtualMachineWithVolume(Long vmId, Host destinationHost, Map<String, String> volumeToPool)
throws ResourceUnavailableException, ConcurrentOperationException, ManagementServerException,
VirtualMachineMigrationException;
UserVm moveVMToUser(AssignVMCmd moveUserVMCmd) throws ResourceAllocationException, ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException;
VirtualMachine vmStorageMigration(Long vmId, StoragePool destPool);

View File

@ -64,7 +64,6 @@ public class AffinityGroupResponse extends BaseResponse implements ControlledVie
private List<String> vmIdList;
public AffinityGroupResponse() {
this.vmIdList = new ArrayList<String>();
}
@Override
@ -149,6 +148,10 @@ public class AffinityGroupResponse extends BaseResponse implements ControlledVie
}
public void addVMId(String vmId) {
if (this.vmIdList == null) {
this.vmIdList = new ArrayList<String>();
}
this.vmIdList.add(vmId);
}

View File

@ -221,6 +221,7 @@ public class ApiConstants {
public static final String VIRTUAL_MACHINE_ID = "virtualmachineid";
public static final String VIRTUAL_MACHINE_IDS = "virtualmachineids";
public static final String VLAN = "vlan";
public static final String REMOVE_VLAN="removevlan";
public static final String VLAN_ID = "vlanid";
public static final String VM_AVAILABLE = "vmavailable";
public static final String VM_LIMIT = "vmlimit";
@ -230,6 +231,7 @@ public class ApiConstants {
public static final String VOLUME_ID = "volumeid";
public static final String ZONE_ID = "zoneid";
public static final String ZONE_NAME = "zonename";
public static final String ZONE_TYPE = "zonetype";
public static final String NETWORK_TYPE = "networktype";
public static final String PAGE = "page";
public static final String PAGE_SIZE = "pagesize";
@ -364,6 +366,8 @@ public class ApiConstants {
public static final String HA_HOST = "hahost";
public static final String CUSTOM_DISK_OFF_MAX_SIZE = "customdiskofferingmaxsize";
public static final String DEFAULT_ZONE_ID = "defaultzoneid";
public static final String LIVE_MIGRATE = "livemigrate";
public static final String MIGRATE_TO = "migrateto";
public static final String GUID = "guid";
public static final String VSWITCH_TYPE_GUEST_TRAFFIC = "guestvswitchtype";
public static final String VSWITCH_TYPE_PUBLIC_TRAFFIC = "publicvswitchtype";
@ -475,8 +479,8 @@ public class ApiConstants {
public static final String HEALTHCHECK_PINGPATH = "pingpath";
public static final String AFFINITY_GROUP_IDS = "affinitygroupids";
public static final String AFFINITY_GROUP_NAMES = "affinitygroupnames";
public static final String DEPLOYMENT_PLANNER = "deploymentplanner";
public static final String ASA_INSIDE_PORT_PROFILE = "insideportprofile";
public static final String AFFINITY_GROUP_ID = "affinitygroupid";
public enum HostDetails {
all, capacity, events, stats, min;

View File

@ -189,6 +189,10 @@ public interface ResponseGenerator {
HostResponse createHostResponse(Host host);
HostForMigrationResponse createHostForMigrationResponse(Host host);
HostForMigrationResponse createHostForMigrationResponse(Host host, EnumSet<HostDetails> details);
VlanIpRangeResponse createVlanIpRangeResponse(Vlan vlan);
IPAddressResponse createIPAddressResponse(IpAddress ipAddress);
@ -216,6 +220,8 @@ public interface ResponseGenerator {
StoragePoolResponse createStoragePoolResponse(StoragePool pool);
StoragePoolForMigrationResponse createStoragePoolForMigrationResponse(StoragePool pool);
ClusterResponse createClusterResponse(Cluster cluster, Boolean showCapacities);
FirewallRuleResponse createPortForwardingRuleResponse(PortForwardingRule fwRule);

View File

@ -23,8 +23,7 @@ import org.apache.cloudstack.api.APICommand;
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.api.BaseListCmd;
import org.apache.cloudstack.api.Parameter;
import org.apache.cloudstack.api.response.ConfigurationResponse;
import org.apache.cloudstack.api.response.ListResponse;
import org.apache.cloudstack.api.response.*;
import org.apache.log4j.Logger;
import com.cloud.configuration.Configuration;
@ -46,6 +45,13 @@ public class ListCfgsByCmd extends BaseListCmd {
@Parameter(name = ApiConstants.NAME, type = CommandType.STRING, description = "lists configuration by name")
private String configName;
@Parameter(name=ApiConstants.SCOPE, type = CommandType.STRING, description = "scope(zone/cluster/pool/account) of the parameter that needs to be updated")
private String scope;
@Parameter(name=ApiConstants.ID, type = CommandType.UUID, entityType = {ZoneResponse.class, ClusterResponse.class, StoragePoolResponse.class, AccountResponse.class}, description = "corresponding ID of the scope")
private Long id;
// ///////////////////////////////////////////////////
// ///////////////// Accessors ///////////////////////
// ///////////////////////////////////////////////////
@ -58,6 +64,15 @@ public class ListCfgsByCmd extends BaseListCmd {
return configName;
}
public String getScope() {
return scope;
}
public Long getId() {
return id;
}
@Override
public Long getPageSizeVal() {
Long pageSizeVal = 500L;
@ -85,6 +100,11 @@ public class ListCfgsByCmd extends BaseListCmd {
for (Configuration cfg : result.first()) {
ConfigurationResponse cfgResponse = _responseGenerator.createConfigurationResponse(cfg);
cfgResponse.setObjectName("configuration");
if (scope != null) {
cfgResponse.setScope(scope);
} else {
cfgResponse.setScope("global");
}
configResponses.add(cfgResponse);
}

View File

@ -1,71 +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.api.command.admin.config;
import java.util.ArrayList;
import java.util.List;
import org.apache.cloudstack.api.APICommand;
import org.apache.cloudstack.api.BaseListCmd;
import org.apache.cloudstack.api.response.DeploymentPlannersResponse;
import org.apache.cloudstack.api.response.ListResponse;
import org.apache.log4j.Logger;
@APICommand(name = "listDeploymentPlanners", description = "Lists all DeploymentPlanners available.", responseObject = DeploymentPlannersResponse.class)
public class ListDeploymentPlannersCmd extends BaseListCmd {
public static final Logger s_logger = Logger.getLogger(ListDeploymentPlannersCmd.class.getName());
private static final String s_name = "listdeploymentplannersresponse";
/////////////////////////////////////////////////////
//////////////// API parameters /////////////////////
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
/////////////////// Accessors ///////////////////////
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
/////////////// API Implementation///////////////////
/////////////////////////////////////////////////////
@Override
public String getCommandName() {
return s_name;
}
@Override
public void execute(){
List<String> planners = _mgr.listDeploymentPlanners();
ListResponse<DeploymentPlannersResponse> response = new ListResponse<DeploymentPlannersResponse>();
List<DeploymentPlannersResponse> plannerResponses = new ArrayList<DeploymentPlannersResponse>();
for (String planner : planners) {
DeploymentPlannersResponse plannerResponse = new DeploymentPlannersResponse();
plannerResponse.setName(planner);
plannerResponse.setObjectName("deploymentPlanner");
plannerResponses.add(plannerResponse);
}
response.setResponses(plannerResponses);
response.setResponseName(getCommandName());
this.setResponseObject(response);
}
}

View File

@ -22,7 +22,7 @@ import org.apache.cloudstack.api.ApiErrorCode;
import org.apache.cloudstack.api.BaseCmd;
import org.apache.cloudstack.api.Parameter;
import org.apache.cloudstack.api.ServerApiException;
import org.apache.cloudstack.api.response.ConfigurationResponse;
import org.apache.cloudstack.api.response.*;
import org.apache.log4j.Logger;
import com.cloud.configuration.Configuration;
@ -43,6 +43,12 @@ public class UpdateCfgCmd extends BaseCmd {
@Parameter(name=ApiConstants.VALUE, type=CommandType.STRING, description="the value of the configuration", length=4095)
private String value;
@Parameter(name=ApiConstants.SCOPE, type = CommandType.STRING, description = "scope(zone/cluster/pool/account) of the parameter that needs to be updated")
private String scope;
@Parameter(name=ApiConstants.ID, type = CommandType.UUID, entityType = {ZoneResponse.class, ClusterResponse.class, StoragePoolResponse.class, AccountResponse.class}, description = "corresponding ID of the scope")
private Long id;
/////////////////////////////////////////////////////
/////////////////// Accessors ///////////////////////
/////////////////////////////////////////////////////
@ -55,6 +61,14 @@ public class UpdateCfgCmd extends BaseCmd {
return value;
}
public String getScope() {
return scope;
}
public Long getId() {
return id;
}
/////////////////////////////////////////////////////
/////////////// API Implementation///////////////////
/////////////////////////////////////////////////////
@ -75,6 +89,12 @@ public class UpdateCfgCmd extends BaseCmd {
if (cfg != null) {
ConfigurationResponse response = _responseGenerator.createConfigurationResponse(cfg);
response.setResponseName(getCommandName());
if (scope != null) {
response.setScope(scope);
response.setValue(value);
} else {
response.setScope("global");
}
this.setResponseObject(response);
} else {
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to update config");

View File

@ -0,0 +1,107 @@
// 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.api.command.admin.host;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.cloudstack.api.APICommand;
import org.apache.log4j.Logger;
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.api.BaseListCmd;
import org.apache.cloudstack.api.Parameter;
import org.apache.cloudstack.api.response.HostForMigrationResponse;
import org.apache.cloudstack.api.response.ListResponse;
import org.apache.cloudstack.api.response.UserVmResponse;
import com.cloud.host.Host;
import com.cloud.utils.Pair;
import com.cloud.utils.Ternary;
@APICommand(name = "findHostsForMigration", description="Find hosts suitable for migrating a virtual machine.",
responseObject=HostForMigrationResponse.class)
public class FindHostsForMigrationCmd extends BaseListCmd {
public static final Logger s_logger = Logger.getLogger(FindHostsForMigrationCmd.class.getName());
private static final String s_name = "findhostsformigrationresponse";
/////////////////////////////////////////////////////
//////////////// API parameters /////////////////////
/////////////////////////////////////////////////////
@Parameter(name=ApiConstants.VIRTUAL_MACHINE_ID, type=CommandType.UUID, entityType = UserVmResponse.class,
required=false, description="find hosts to which this VM can be migrated and flag the hosts with enough " +
"CPU/RAM to host the VM")
private Long virtualMachineId;
/////////////////////////////////////////////////////
/////////////////// Accessors ///////////////////////
/////////////////////////////////////////////////////
public Long getVirtualMachineId() {
return virtualMachineId;
}
/////////////////////////////////////////////////////
/////////////// API Implementation///////////////////
/////////////////////////////////////////////////////
@Override
public String getCommandName() {
return s_name;
}
@Override
public void execute() {
ListResponse<HostForMigrationResponse> response = null;
Pair<List<? extends Host>,Integer> result;
List<? extends Host> hostsWithCapacity = new ArrayList<Host>();
Map<Host, Boolean> hostsRequiringStorageMotion;
Ternary<Pair<List<? extends Host>,Integer>, List<? extends Host>, Map<Host, Boolean>> hostsForMigration =
_mgr.listHostsForMigrationOfVM(getVirtualMachineId(), this.getStartIndex(), this.getPageSizeVal());
result = hostsForMigration.first();
hostsWithCapacity = hostsForMigration.second();
hostsRequiringStorageMotion = hostsForMigration.third();
response = new ListResponse<HostForMigrationResponse>();
List<HostForMigrationResponse> hostResponses = new ArrayList<HostForMigrationResponse>();
for (Host host : result.first()) {
HostForMigrationResponse hostResponse = _responseGenerator.createHostForMigrationResponse(host);
Boolean suitableForMigration = false;
if (hostsWithCapacity.contains(host)) {
suitableForMigration = true;
}
hostResponse.setSuitableForMigration(suitableForMigration);
Boolean requiresStorageMotion = hostsRequiringStorageMotion.get(host);
if (requiresStorageMotion != null && requiresStorageMotion) {
hostResponse.setRequiresStorageMotion(true);
} else {
hostResponse.setRequiresStorageMotion(false);
}
hostResponse.setObjectName("host");
hostResponses.add(hostResponse);
}
response.setResponses(hostResponses, result.second());
response.setResponseName(getCommandName());
this.setResponseObject(response);
}
}

View File

@ -19,6 +19,7 @@ package org.apache.cloudstack.api.command.admin.host;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.List;
import java.util.Map;
import org.apache.cloudstack.api.APICommand;
import org.apache.cloudstack.api.ApiConstants;
@ -37,6 +38,7 @@ import com.cloud.async.AsyncJob;
import com.cloud.exception.InvalidParameterValueException;
import com.cloud.host.Host;
import com.cloud.utils.Pair;
import com.cloud.utils.Ternary;
@APICommand(name = "listHosts", description="Lists hosts.", responseObject=HostResponse.class)
public class ListHostsCmd extends BaseListCmd {
@ -170,8 +172,8 @@ public class ListHostsCmd extends BaseListCmd {
} else {
Pair<List<? extends Host>,Integer> result;
List<? extends Host> hostsWithCapacity = new ArrayList<Host>();
Pair<Pair<List<? extends Host>,Integer>, List<? extends Host>> hostsForMigration = _mgr.listHostsForMigrationOfVM(getVirtualMachineId(), this.getStartIndex(), this.getPageSizeVal());
Ternary<Pair<List<? extends Host>,Integer>, List<? extends Host>, Map<Host, Boolean>> hostsForMigration =
_mgr.listHostsForMigrationOfVM(getVirtualMachineId(), this.getStartIndex(), this.getPageSizeVal());
result = hostsForMigration.first();
hostsWithCapacity = hostsForMigration.second();
@ -192,6 +194,5 @@ public class ListHostsCmd extends BaseListCmd {
}
response.setResponseName(getCommandName());
this.setResponseObject(response);
}
}

View File

@ -54,6 +54,8 @@ public class UpdatePhysicalNetworkCmd extends BaseAsyncCmd {
@Parameter(name=ApiConstants.VLAN, type=CommandType.STRING, description="the VLAN for the physical network")
private String vlan;
@Parameter(name=ApiConstants.REMOVE_VLAN, type = CommandType.STRING, description ="The vlan range we want to remove")
private String removevlan;
/////////////////////////////////////////////////////
/////////////////// Accessors ///////////////////////
@ -79,6 +81,10 @@ public class UpdatePhysicalNetworkCmd extends BaseAsyncCmd {
return vlan;
}
public String getRemoveVlan(){
return removevlan;
}
/////////////////////////////////////////////////////
/////////////// API Implementation///////////////////
/////////////////////////////////////////////////////
@ -95,7 +101,7 @@ public class UpdatePhysicalNetworkCmd extends BaseAsyncCmd {
@Override
public void execute(){
PhysicalNetwork result = _networkService.updatePhysicalNetwork(getId(),getNetworkSpeed(), getTags(), getVlan(), getState());
PhysicalNetwork result = _networkService.updatePhysicalNetwork(getId(),getNetworkSpeed(), getTags(), getVlan(), getState(), getRemoveVlan());
PhysicalNetworkResponse response = _responseGenerator.createPhysicalNetworkResponse(result);
response.setResponseName(getCommandName());
this.setResponseObject(response);

View File

@ -84,9 +84,6 @@ public class CreateServiceOfferingCmd extends BaseCmd {
@Parameter(name=ApiConstants.NETWORKRATE, type=CommandType.INTEGER, description="data transfer rate in megabits per second allowed. Supported only for non-System offering and system offerings having \"domainrouter\" systemvmtype")
private Integer networkRate;
@Parameter(name = ApiConstants.DEPLOYMENT_PLANNER, type = CommandType.STRING, description = "The deployment planner heuristics used to deploy a VM of this offering, default \"FirstFitPlanner\".")
private String deploymentPlanner;
/////////////////////////////////////////////////////
/////////////////// Accessors ///////////////////////
/////////////////////////////////////////////////////
@ -151,9 +148,6 @@ public class CreateServiceOfferingCmd extends BaseCmd {
return networkRate;
}
public String getDeploymentPlanner() {
return deploymentPlanner;
}
/////////////////////////////////////////////////////
/////////////// API Implementation///////////////////

View File

@ -0,0 +1,98 @@
// 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.api.command.admin.storage;
import java.util.ArrayList;
import java.util.List;
import org.apache.cloudstack.api.APICommand;
import org.apache.log4j.Logger;
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.api.BaseListCmd;
import org.apache.cloudstack.api.Parameter;
import org.apache.cloudstack.api.response.ListResponse;
import org.apache.cloudstack.api.response.StoragePoolForMigrationResponse;
import org.apache.cloudstack.api.response.VolumeResponse;
import com.cloud.async.AsyncJob;
import com.cloud.storage.StoragePool;
import com.cloud.utils.Pair;
@APICommand(name = "findStoragePoolsForMigration", description="Lists storage pools available for migration of a volume.",
responseObject=StoragePoolForMigrationResponse.class)
public class FindStoragePoolsForMigrationCmd extends BaseListCmd {
public static final Logger s_logger = Logger.getLogger(FindStoragePoolsForMigrationCmd.class.getName());
private static final String s_name = "findstoragepoolsformigrationresponse";
/////////////////////////////////////////////////////
//////////////// API parameters /////////////////////
/////////////////////////////////////////////////////
@Parameter(name=ApiConstants.ID, type=CommandType.UUID, entityType = VolumeResponse.class, required=true,
description="the ID of the volume")
private Long id;
/////////////////////////////////////////////////////
/////////////////// Accessors ///////////////////////
/////////////////////////////////////////////////////
public Long getId() {
return id;
}
/////////////////////////////////////////////////////
/////////////// API Implementation///////////////////
/////////////////////////////////////////////////////
@Override
public String getCommandName() {
return s_name;
}
public AsyncJob.Type getInstanceType() {
return AsyncJob.Type.StoragePool;
}
@Override
public void execute() {
Pair<List<? extends StoragePool>, List<? extends StoragePool>> pools =
_mgr.listStoragePoolsForMigrationOfVolume(getId());
ListResponse<StoragePoolForMigrationResponse> response = new ListResponse<StoragePoolForMigrationResponse>();
List<StoragePoolForMigrationResponse> poolResponses = new ArrayList<StoragePoolForMigrationResponse>();
List<? extends StoragePool> allPools = pools.first();
List<? extends StoragePool> suitablePoolList = pools.second();
for (StoragePool pool : allPools) {
StoragePoolForMigrationResponse poolResponse = _responseGenerator.createStoragePoolForMigrationResponse(pool);
Boolean suitableForMigration = false;
for (StoragePool suitablePool : suitablePoolList) {
if (suitablePool.getId() == pool.getId()) {
suitableForMigration = true;
break;
}
}
poolResponse.setSuitableForMigration(suitableForMigration);
poolResponse.setObjectName("storagepool");
poolResponses.add(poolResponse);
}
response.setResponses(poolResponses);
response.setResponseName(getCommandName());
this.setResponseObject(response);
}
}

View File

@ -0,0 +1,160 @@
// 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.api.command.admin.vm;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.apache.cloudstack.api.*;
import org.apache.log4j.Logger;
import org.apache.cloudstack.api.APICommand;
import org.apache.cloudstack.api.BaseCmd.CommandType;
import org.apache.cloudstack.api.response.HostResponse;
import org.apache.cloudstack.api.response.StoragePoolResponse;
import org.apache.cloudstack.api.response.UserVmResponse;
import com.cloud.event.EventTypes;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InvalidParameterValueException;
import com.cloud.exception.ManagementServerException;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.exception.VirtualMachineMigrationException;
import com.cloud.host.Host;
import com.cloud.storage.StoragePool;
import com.cloud.user.Account;
import com.cloud.user.UserContext;
import com.cloud.uservm.UserVm;
import com.cloud.vm.VirtualMachine;
@APICommand(name = "migrateVirtualMachineWithVolume", description="Attempts Migration of a VM with its volumes to a different host", responseObject=UserVmResponse.class)
public class MigrateVirtualMachineWithVolumeCmd extends BaseAsyncCmd {
public static final Logger s_logger = Logger.getLogger(MigrateVMCmd.class.getName());
private static final String s_name = "migratevirtualmachinewithvolumeresponse";
/////////////////////////////////////////////////////
//////////////// API parameters /////////////////////
/////////////////////////////////////////////////////
@Parameter(name=ApiConstants.HOST_ID, type=CommandType.UUID, entityType=HostResponse.class,
required=true, description="Destination Host ID to migrate VM to.")
private Long hostId;
@Parameter(name=ApiConstants.VIRTUAL_MACHINE_ID, type=CommandType.UUID, entityType=UserVmResponse.class,
required=true, description="the ID of the virtual machine")
private Long virtualMachineId;
@Parameter(name = ApiConstants.MIGRATE_TO, type = CommandType.MAP, required=false,
description = "Map of pool to which each volume should be migrated (volume/pool pair)")
private Map migrateVolumeTo;
/////////////////////////////////////////////////////
/////////////////// Accessors ///////////////////////
/////////////////////////////////////////////////////
public Long getHostId() {
return hostId;
}
public Long getVirtualMachineId() {
return virtualMachineId;
}
public Map<String, String> getVolumeToPool() {
Map<String, String> volumeToPoolMap = new HashMap<String, String>();
if (migrateVolumeTo != null && !migrateVolumeTo.isEmpty()) {
Collection<?> allValues = migrateVolumeTo.values();
Iterator<?> iter = allValues.iterator();
while (iter.hasNext()) {
HashMap<String, String> volumeToPool = (HashMap<String, String>) iter.next();
String volume = volumeToPool.get("volume");
String pool = volumeToPool.get("pool");
volumeToPoolMap.put(volume, pool);
}
}
return volumeToPoolMap;
}
/////////////////////////////////////////////////////
/////////////// API Implementation///////////////////
/////////////////////////////////////////////////////
@Override
public String getCommandName() {
return s_name;
}
@Override
public long getEntityOwnerId() {
UserVm userVm = _entityMgr.findById(UserVm.class, getVirtualMachineId());
if (userVm != null) {
return userVm.getAccountId();
}
return Account.ACCOUNT_ID_SYSTEM;
}
@Override
public String getEventType() {
return EventTypes.EVENT_VM_MIGRATE;
}
@Override
public String getEventDescription() {
return "Attempting to migrate VM Id: " + getVirtualMachineId() + " to host Id: "+ getHostId();
}
@Override
public void execute(){
UserVm userVm = _userVmService.getUserVm(getVirtualMachineId());
if (userVm == null) {
throw new InvalidParameterValueException("Unable to find the VM by id=" + getVirtualMachineId());
}
Host destinationHost = _resourceService.getHost(getHostId());
if (destinationHost == null) {
throw new InvalidParameterValueException("Unable to find the host to migrate the VM, host id =" + getHostId());
}
try{
VirtualMachine migratedVm = _userVmService.migrateVirtualMachineWithVolume(getVirtualMachineId(),
destinationHost, getVolumeToPool());
if (migratedVm != null) {
UserVmResponse response = _responseGenerator.createUserVmResponse("virtualmachine", (UserVm)migratedVm).get(0);
response.setResponseName(getCommandName());
this.setResponseObject(response);
} else {
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to migrate vm");
}
} catch (ResourceUnavailableException ex) {
s_logger.warn("Exception: ", ex);
throw new ServerApiException(ApiErrorCode.RESOURCE_UNAVAILABLE_ERROR, ex.getMessage());
} catch (ConcurrentOperationException e) {
s_logger.warn("Exception: ", e);
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, e.getMessage());
} catch (ManagementServerException e) {
s_logger.warn("Exception: ", e);
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, e.getMessage());
} catch (VirtualMachineMigrationException e) {
s_logger.warn("Exception: ", e);
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, e.getMessage());
}
}
}

View File

@ -35,7 +35,7 @@ import org.apache.log4j.Logger;
import com.cloud.event.EventTypes;
import com.cloud.server.ResourceTag;
import com.cloud.server.ResourceTag.TaggedResourceType;
@APICommand(name = "createTags", description = "Creates resource tag(s)", responseObject = SuccessResponse.class, since = "Burbank")
@APICommand(name = "createTags", description = "Creates resource tag(s)", responseObject = SuccessResponse.class, since = "4.0.0")
public class CreateTagsCmd extends BaseAsyncCmd{
public static final Logger s_logger = Logger.getLogger(CreateTagsCmd.class.getName());

View File

@ -34,7 +34,7 @@ import org.apache.log4j.Logger;
import com.cloud.event.EventTypes;
import com.cloud.server.ResourceTag.TaggedResourceType;
@APICommand(name = "deleteTags", description = "Deleting resource tag(s)", responseObject = SuccessResponse.class, since = "Burbank")
@APICommand(name = "deleteTags", description = "Deleting resource tag(s)", responseObject = SuccessResponse.class, since = "4.0.0")
public class DeleteTagsCmd extends BaseAsyncCmd{
public static final Logger s_logger = Logger.getLogger(DeleteTagsCmd.class.getName());

View File

@ -24,7 +24,7 @@ import org.apache.cloudstack.api.Parameter;
import org.apache.cloudstack.api.response.ListResponse;
import org.apache.cloudstack.api.response.ResourceTagResponse;
@APICommand(name = "listTags", description = "List resource tag(s)", responseObject = ResourceTagResponse.class, since = "Burbank")
@APICommand(name = "listTags", description = "List resource tag(s)", responseObject = ResourceTagResponse.class, since = "4.0.0")
public class ListTagsCmd extends BaseListProjectAndAccountResourcesCmd{
private static final String s_name = "listtagsresponse";

View File

@ -230,7 +230,7 @@ public class DeployVMCmd extends BaseAsyncCreateCmd {
for (String groupName : securityGroupNameList) {
Long groupId = _responseGenerator.getSecurityGroupId(groupName, getEntityOwnerId());
if (groupId == null) {
throw new InvalidParameterValueException("Unable to find group by name " + groupName + " for account " + getEntityOwnerId());
throw new InvalidParameterValueException("Unable to find group by name " + groupName);
} else {
securityGroupIds.add(groupId);
}
@ -344,8 +344,7 @@ public class DeployVMCmd extends BaseAsyncCreateCmd {
for (String groupName : affinityGroupNameList) {
Long groupId = _responseGenerator.getAffinityGroupId(groupName, getEntityOwnerId());
if (groupId == null) {
throw new InvalidParameterValueException("Unable to find group by name " + groupName
+ " for account " + getEntityOwnerId());
throw new InvalidParameterValueException("Unable to find affinity group by name " + groupName);
} else {
affinityGroupIds.add(groupId);
}

View File

@ -20,6 +20,7 @@ import java.util.ArrayList;
import java.util.EnumSet;
import java.util.List;
import org.apache.cloudstack.affinity.AffinityGroupResponse;
import org.apache.cloudstack.api.APICommand;
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.api.ApiConstants.VMDetails;
@ -95,7 +96,7 @@ public class ListVMsCmd extends BaseListTaggedResourcesCmd {
@Parameter(name=ApiConstants.DETAILS, type=CommandType.LIST, collectionType=CommandType.STRING,
description="comma separated list of host details requested, " +
"value can be a list of [all, group, nics, stats, secgrp, tmpl, servoff, iso, volume, min]." +
"value can be a list of [all, group, nics, stats, secgrp, tmpl, servoff, iso, volume, min, affgrp]." +
" If no parameter is passed in, the details will be defaulted to all" )
private List<String> viewDetails;
@ -110,6 +111,10 @@ public class ListVMsCmd extends BaseListTaggedResourcesCmd {
@Parameter(name=ApiConstants.VPC_ID, type=CommandType.UUID, entityType=VpcResponse.class,
description="list vms by vpc")
private Long vpcId;
@Parameter(name = ApiConstants.AFFINITY_GROUP_ID, type = CommandType.UUID, entityType = AffinityGroupResponse.class, description = "list vms by affinity group")
private Long affinityGroupId;
/////////////////////////////////////////////////////
/////////////////// Accessors ///////////////////////
/////////////////////////////////////////////////////
@ -174,6 +179,10 @@ public class ListVMsCmd extends BaseListTaggedResourcesCmd {
return vpcId;
}
public Long getAffinityGroupId() {
return affinityGroupId;
}
public EnumSet<VMDetails> getDetails() throws InvalidParameterValueException {
EnumSet<VMDetails> dv;
if (viewDetails==null || viewDetails.size() <=0){

View File

@ -47,6 +47,10 @@ public class MigrateVolumeCmd extends BaseAsyncCmd {
required=true, description="destination storage pool ID to migrate the volume to")
private Long storageId;
@Parameter(name=ApiConstants.LIVE_MIGRATE, type=CommandType.BOOLEAN, required=false,
description="if the volume should be live migrated when it is attached to a running vm")
private Boolean liveMigrate;
/////////////////////////////////////////////////////
/////////////////// Accessors ///////////////////////
/////////////////////////////////////////////////////
@ -58,6 +62,10 @@ public class MigrateVolumeCmd extends BaseAsyncCmd {
public Long getStoragePoolId() {
return storageId;
}
public boolean isLiveMigrate() {
return (liveMigrate != null) ? liveMigrate : false;
}
/////////////////////////////////////////////////////
/////////////// API Implementation///////////////////
/////////////////////////////////////////////////////

View File

@ -184,6 +184,9 @@ public class AccountResponse extends BaseResponse {
@SerializedName(ApiConstants.ACCOUNT_DETAILS) @Param(description="details for the account")
private Map<String, String> details;
@SerializedName(ApiConstants.IS_DEFAULT) @Param(description="true if account is default, false otherwise", since="4.2.0")
private Boolean isDefault;
@Override
public String getObjectId() {
@ -381,4 +384,8 @@ public class AccountResponse extends BaseResponse {
public void setDefaultZone(String defaultZoneId) {
this.defaultZoneId = defaultZoneId;
}
public void setIsDefault(Boolean isDefault) {
this.isDefault = isDefault;
}
}

View File

@ -32,9 +32,13 @@ public class ConfigurationResponse extends BaseResponse {
@SerializedName(ApiConstants.VALUE) @Param(description="the value of the configuration")
private String value;
@SerializedName(ApiConstants.SCOPE) @Param(description="scope(zone/cluster/pool/account) of the parameter that needs to be updated")
private String scope;
@SerializedName(ApiConstants.DESCRIPTION) @Param(description="the description of the configuration")
private String description;
public String getCategory() {
return category;
}
@ -66,4 +70,12 @@ public class ConfigurationResponse extends BaseResponse {
public void setDescription(String description) {
this.description = description;
}
public String getScope() {
return scope;
}
public void setScope(String scope) {
this.scope = scope;
}
}

View File

@ -0,0 +1,365 @@
// 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.api.response;
import java.util.Date;
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.api.BaseResponse;
import org.apache.cloudstack.api.EntityReference;
import com.cloud.host.Host;
import com.cloud.host.Status;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.serializer.Param;
import com.google.gson.annotations.SerializedName;
@EntityReference(value=Host.class)
public class HostForMigrationResponse extends BaseResponse {
@SerializedName(ApiConstants.ID) @Param(description="the ID of the host")
private String id;
@SerializedName(ApiConstants.NAME) @Param(description="the name of the host")
private String name;
@SerializedName(ApiConstants.STATE) @Param(description="the state of the host")
private Status state;
@SerializedName("disconnected") @Param(description="true if the host is disconnected. False otherwise.")
private Date disconnectedOn;
@SerializedName(ApiConstants.TYPE) @Param(description="the host type")
private Host.Type hostType;
@SerializedName("oscategoryid") @Param(description="the OS category ID of the host")
private String osCategoryId;
@SerializedName("oscategoryname") @Param(description="the OS category name of the host")
private String osCategoryName;
@SerializedName(ApiConstants.IP_ADDRESS) @Param(description="the IP address of the host")
private String ipAddress;
@SerializedName(ApiConstants.ZONE_ID) @Param(description="the Zone ID of the host")
private String zoneId;
@SerializedName(ApiConstants.ZONE_NAME) @Param(description="the Zone name of the host")
private String zoneName;
@SerializedName(ApiConstants.POD_ID) @Param(description="the Pod ID of the host")
private String podId;
@SerializedName("podname") @Param(description="the Pod name of the host")
private String podName;
@SerializedName("version") @Param(description="the host version")
private String version;
@SerializedName(ApiConstants.HYPERVISOR) @Param(description="the host hypervisor")
private HypervisorType hypervisor;
@SerializedName("cpunumber") @Param(description="the CPU number of the host")
private Integer cpuNumber;
@SerializedName("cpuspeed") @Param(description="the CPU speed of the host")
private Long cpuSpeed;
@SerializedName("cpuallocated") @Param(description="the amount of the host's CPU currently allocated")
private String cpuAllocated;
@SerializedName("cpuused") @Param(description="the amount of the host's CPU currently used")
private String cpuUsed;
@SerializedName("cpuwithoverprovisioning") @Param(description="the amount of the host's CPU after applying the cpu.overprovisioning.factor ")
private String cpuWithOverprovisioning;
@SerializedName("averageload") @Param(description="the cpu average load on the host")
private Long averageLoad;
@SerializedName("networkkbsread") @Param(description="the incoming network traffic on the host")
private Long networkKbsRead;
@SerializedName("networkkbswrite") @Param(description="the outgoing network traffic on the host")
private Long networkKbsWrite;
@SerializedName("memorytotal") @Param(description="the memory total of the host")
private Long memoryTotal;
@SerializedName("memoryallocated") @Param(description="the amount of the host's memory currently allocated")
private Long memoryAllocated;
@SerializedName("memoryused") @Param(description="the amount of the host's memory currently used")
private Long memoryUsed;
@SerializedName("disksizetotal") @Param(description="the total disk size of the host")
private Long diskSizeTotal;
@SerializedName("disksizeallocated") @Param(description="the host's currently allocated disk size")
private Long diskSizeAllocated;
@SerializedName("capabilities") @Param(description="capabilities of the host")
private String capabilities;
@SerializedName("lastpinged") @Param(description="the date and time the host was last pinged")
private Date lastPinged;
@SerializedName("managementserverid") @Param(description="the management server ID of the host")
private Long managementServerId;
@SerializedName("clusterid") @Param(description="the cluster ID of the host")
private String clusterId;
@SerializedName("clustername") @Param(description="the cluster name of the host")
private String clusterName;
@SerializedName("clustertype") @Param(description="the cluster type of the cluster that host belongs to")
private String clusterType;
@SerializedName("islocalstorageactive") @Param(description="true if local storage is active, false otherwise")
private Boolean localStorageActive;
@SerializedName(ApiConstants.CREATED) @Param(description="the date and time the host was created")
private Date created;
@SerializedName("removed") @Param(description="the date and time the host was removed")
private Date removed;
@SerializedName("events") @Param(description="events available for the host")
private String events;
@SerializedName("hosttags") @Param(description="comma-separated list of tags for the host")
private String hostTags;
@SerializedName("hasenoughcapacity") @Param(description="true if this host has enough CPU and RAM capacity to migrate a VM to it, false otherwise")
private Boolean hasEnoughCapacity;
@SerializedName("suitableformigration") @Param(description="true if this host is suitable(has enough capacity and satisfies all conditions like hosttags, max guests vm limit etc) to migrate a VM to it , false otherwise")
private Boolean suitableForMigration;
@SerializedName("requiresStorageMotion") @Param(description="true if migrating a vm to this host requires storage motion, false otherwise")
private Boolean requiresStorageMotion;
@SerializedName("resourcestate") @Param(description="the resource state of the host")
private String resourceState;
@SerializedName(ApiConstants.HYPERVISOR_VERSION) @Param(description="the hypervisor version")
private String hypervisorVersion;
@SerializedName(ApiConstants.HA_HOST) @Param(description="true if the host is Ha host (dedicated to vms started by HA process; false otherwise")
private Boolean haHost;
@Override
public String getObjectId() {
return this.getId();
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setState(Status state) {
this.state = state;
}
public void setDisconnectedOn(Date disconnectedOn) {
this.disconnectedOn = disconnectedOn;
}
public void setHostType(Host.Type hostType) {
this.hostType = hostType;
}
public void setOsCategoryId(String osCategoryId) {
this.osCategoryId = osCategoryId;
}
public void setOsCategoryName(String osCategoryName) {
this.osCategoryName = osCategoryName;
}
public void setIpAddress(String ipAddress) {
this.ipAddress = ipAddress;
}
public void setZoneId(String zoneId) {
this.zoneId = zoneId;
}
public void setZoneName(String zoneName) {
this.zoneName = zoneName;
}
public void setPodId(String podId) {
this.podId = podId;
}
public void setPodName(String podName) {
this.podName = podName;
}
public void setVersion(String version) {
this.version = version;
}
public void setHypervisor(HypervisorType hypervisor) {
this.hypervisor = hypervisor;
}
public void setCpuNumber(Integer cpuNumber) {
this.cpuNumber = cpuNumber;
}
public void setCpuSpeed(Long cpuSpeed) {
this.cpuSpeed = cpuSpeed;
}
public String getCpuAllocated() {
return cpuAllocated;
}
public void setCpuAllocated(String cpuAllocated) {
this.cpuAllocated = cpuAllocated;
}
public void setCpuUsed(String cpuUsed) {
this.cpuUsed = cpuUsed;
}
public void setAverageLoad(Long averageLoad) {
this.averageLoad = averageLoad;
}
public void setNetworkKbsRead(Long networkKbsRead) {
this.networkKbsRead = networkKbsRead;
}
public void setNetworkKbsWrite(Long networkKbsWrite) {
this.networkKbsWrite = networkKbsWrite;
}
public void setMemoryTotal(Long memoryTotal) {
this.memoryTotal = memoryTotal;
}
public void setMemoryAllocated(Long memoryAllocated) {
this.memoryAllocated = memoryAllocated;
}
public void setMemoryUsed(Long memoryUsed) {
this.memoryUsed = memoryUsed;
}
public void setDiskSizeTotal(Long diskSizeTotal) {
this.diskSizeTotal = diskSizeTotal;
}
public void setDiskSizeAllocated(Long diskSizeAllocated) {
this.diskSizeAllocated = diskSizeAllocated;
}
public void setCapabilities(String capabilities) {
this.capabilities = capabilities;
}
public void setLastPinged(Date lastPinged) {
this.lastPinged = lastPinged;
}
public void setManagementServerId(Long managementServerId) {
this.managementServerId = managementServerId;
}
public void setClusterId(String clusterId) {
this.clusterId = clusterId;
}
public void setClusterName(String clusterName) {
this.clusterName = clusterName;
}
public void setClusterType(String clusterType) {
this.clusterType = clusterType;
}
public void setLocalStorageActive(Boolean localStorageActive) {
this.localStorageActive = localStorageActive;
}
public void setCreated(Date created) {
this.created = created;
}
public void setRemoved(Date removed) {
this.removed = removed;
}
public void setEvents(String events) {
this.events = events;
}
public String getHostTags() {
return hostTags;
}
public void setHostTags(String hostTags) {
this.hostTags = hostTags;
}
public void setHasEnoughCapacity(Boolean hasEnoughCapacity) {
this.hasEnoughCapacity = hasEnoughCapacity;
}
public void setSuitableForMigration(Boolean suitableForMigration) {
this.suitableForMigration = suitableForMigration;
}
public void setRequiresStorageMotion(Boolean requiresStorageMotion) {
this.requiresStorageMotion = requiresStorageMotion;
}
public String getResourceState() {
return resourceState;
}
public void setResourceState(String resourceState) {
this.resourceState = resourceState;
}
public String getCpuWithOverprovisioning() {
return cpuWithOverprovisioning;
}
public void setCpuWithOverprovisioning(String cpuWithOverprovisioning) {
this.cpuWithOverprovisioning = cpuWithOverprovisioning;
}
public void setHypervisorVersion(String hypervisorVersion) {
this.hypervisorVersion = hypervisorVersion;
}
public void setHaHost(Boolean haHost) {
this.haHost = haHost;
}
}

View File

@ -330,7 +330,6 @@ public class HostResponse extends BaseResponse {
this.hasEnoughCapacity = hasEnoughCapacity;
}
public void setSuitableForMigration(Boolean suitableForMigration) {
this.suitableForMigration = suitableForMigration;
}

View File

@ -0,0 +1,248 @@
// 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.api.response;
import java.util.Date;
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.api.BaseResponse;
import org.apache.cloudstack.api.EntityReference;
import com.cloud.serializer.Param;
import com.cloud.storage.StoragePool;
import com.cloud.storage.StoragePoolStatus;
import com.google.gson.annotations.SerializedName;
@EntityReference(value=StoragePool.class)
public class StoragePoolForMigrationResponse extends BaseResponse {
@SerializedName("id") @Param(description="the ID of the storage pool")
private String id;
@SerializedName("zoneid") @Param(description="the Zone ID of the storage pool")
private String zoneId;
@SerializedName(ApiConstants.ZONE_NAME) @Param(description="the Zone name of the storage pool")
private String zoneName;
@SerializedName("podid") @Param(description="the Pod ID of the storage pool")
private String podId;
@SerializedName("podname") @Param(description="the Pod name of the storage pool")
private String podName;
@SerializedName("name") @Param(description="the name of the storage pool")
private String name;
@SerializedName("ipaddress") @Param(description="the IP address of the storage pool")
private String ipAddress;
@SerializedName("path") @Param(description="the storage pool path")
private String path;
@SerializedName("created") @Param(description="the date and time the storage pool was created")
private Date created;
@SerializedName("type") @Param(description="the storage pool type")
private String type;
@SerializedName("clusterid") @Param(description="the ID of the cluster for the storage pool")
private String clusterId;
@SerializedName("clustername") @Param(description="the name of the cluster for the storage pool")
private String clusterName;
@SerializedName("disksizetotal") @Param(description="the total disk size of the storage pool")
private Long diskSizeTotal;
@SerializedName("disksizeallocated") @Param(description="the host's currently allocated disk size")
private Long diskSizeAllocated;
@SerializedName("disksizeused") @Param(description="the host's currently used disk size")
private Long diskSizeUsed;
@SerializedName("tags") @Param(description="the tags for the storage pool")
private String tags;
@SerializedName(ApiConstants.STATE) @Param(description="the state of the storage pool")
private StoragePoolStatus state;
@SerializedName(ApiConstants.SCOPE) @Param(description="the scope of the storage pool")
private String scope;
@SerializedName("suitableformigration") @Param(description="true if this pool is suitable to migrate a volume," +
" false otherwise")
private Boolean suitableForMigration;
/**
* @return the scope
*/
public String getScope() {
return scope;
}
/**
* @param scope the scope to set
*/
public void setScope(String scope) {
this.scope = scope;
}
@Override
public String getObjectId() {
return this.getId();
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getZoneId() {
return zoneId;
}
public void setZoneId(String zoneId) {
this.zoneId = zoneId;
}
public String getZoneName() {
return zoneName;
}
public void setZoneName(String zoneName) {
this.zoneName = zoneName;
}
public String getPodId() {
return podId;
}
public void setPodId(String podId) {
this.podId = podId;
}
public String getPodName() {
return podName;
}
public void setPodName(String podName) {
this.podName = podName;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getIpAddress() {
return ipAddress;
}
public void setIpAddress(String ipAddress) {
this.ipAddress = ipAddress;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public Date getCreated() {
return created;
}
public void setCreated(Date created) {
this.created = created;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getClusterId() {
return clusterId;
}
public void setClusterId(String clusterId) {
this.clusterId = clusterId;
}
public String getClusterName() {
return clusterName;
}
public void setClusterName(String clusterName) {
this.clusterName = clusterName;
}
public Long getDiskSizeTotal() {
return diskSizeTotal;
}
public void setDiskSizeTotal(Long diskSizeTotal) {
this.diskSizeTotal = diskSizeTotal;
}
public Long getDiskSizeAllocated() {
return diskSizeAllocated;
}
public void setDiskSizeAllocated(Long diskSizeAllocated) {
this.diskSizeAllocated = diskSizeAllocated;
}
public Long getDiskSizeUsed() {
return diskSizeUsed;
}
public void setDiskSizeUsed(Long diskSizeUsed) {
this.diskSizeUsed = diskSizeUsed;
}
public String getTags() {
return tags;
}
public void setTags(String tags) {
this.tags = tags;
}
public StoragePoolStatus getState() {
return state;
}
public void setState(StoragePoolStatus state) {
this.state = state;
}
public void setSuitableForMigration(Boolean suitableForMigration) {
this.suitableForMigration = suitableForMigration;
}
}

View File

@ -83,8 +83,6 @@ public class StoragePoolResponse extends BaseResponse {
@SerializedName(ApiConstants.SCOPE) @Param(description="the scope of the storage pool")
private String scope;
/**
* @return the scope
*/
@ -239,5 +237,4 @@ public class StoragePoolResponse extends BaseResponse {
public void setState(StoragePoolStatus state) {
this.state = state;
}
}

View File

@ -18,6 +18,7 @@ package org.apache.cloudstack.api.response;
import java.util.Date;
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.api.BaseResponse;
import org.apache.cloudstack.api.EntityReference;
@ -75,6 +76,9 @@ public class UserResponse extends BaseResponse {
@SerializedName("iscallerchilddomain") @Param(description="the boolean value representing if the updating target is in caller's child domain")
private boolean isCallerChildDomain;
@SerializedName(ApiConstants.IS_DEFAULT) @Param(description="true if user is default, false otherwise", since="4.2.0")
private Boolean isDefault;
@Override
public String getObjectId() {
return this.getId();
@ -206,4 +210,8 @@ public class UserResponse extends BaseResponse {
public void setIsCallerChildDomain(boolean isCallerChildDomain) {
this.isCallerChildDomain = isCallerChildDomain;
}
public void setIsDefault(Boolean isDefault) {
this.isDefault = isDefault;
}
}

View File

@ -80,6 +80,9 @@ public class UserVmResponse extends BaseResponse implements ControlledEntityResp
@SerializedName(ApiConstants.ZONE_NAME) @Param(description="the name of the availability zone for the virtual machine")
private String zoneName;
@SerializedName(ApiConstants.ZONE_TYPE) @Param(description="the network type of the availability zone for the virtual machine")
private String zoneType;
@SerializedName(ApiConstants.HOST_ID) @Param(description="the ID of the host for the virtual machine")
private String hostId;
@ -249,6 +252,10 @@ public class UserVmResponse extends BaseResponse implements ControlledEntityResp
this.zoneName = zoneName;
}
public void setZoneType(String zoneType) {
this.zoneType = zoneType;
}
public void setHostId(String hostId) {
this.hostId = hostId;
}

View File

@ -0,0 +1,89 @@
// 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.api.command.test;
import com.cloud.configuration.Configuration;
import com.cloud.configuration.ConfigurationService;
import com.cloud.exception.InvalidParameterValueException;
import com.cloud.resource.ResourceService;
import com.cloud.server.ManagementService;
import com.cloud.utils.Pair;
import junit.framework.Assert;
import junit.framework.TestCase;
import org.apache.cloudstack.api.ResponseGenerator;
import org.apache.cloudstack.api.ServerApiException;
import org.apache.cloudstack.api.command.admin.config.ListCfgsByCmd;
import org.apache.cloudstack.api.response.ConfigurationResponse;
import org.apache.cloudstack.api.response.ListResponse;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.mockito.Mockito;
import java.util.ArrayList;
import java.util.List;
public class ListCfgCmdTest extends TestCase{
private ListCfgsByCmd listCfgsByCmd;
private ManagementService mgr;
private ResponseGenerator responseGenerator;
@Rule
public ExpectedException expectedException = ExpectedException.none();
@Before
public void setUp() {
responseGenerator = Mockito.mock(ResponseGenerator.class);
mgr = Mockito.mock(ManagementService.class);
listCfgsByCmd = new ListCfgsByCmd();
}
@Test
public void testCreateSuccess() {
Configuration cfg = Mockito.mock(Configuration.class);
listCfgsByCmd._mgr = mgr;
listCfgsByCmd._responseGenerator = responseGenerator;
List<Configuration> configList = new ArrayList<Configuration>();
configList.add(cfg);
Pair<List<? extends Configuration>, Integer> result = new Pair<List<? extends Configuration>, Integer>(configList, 1);
try {
Mockito.when(
mgr.searchForConfigurations(listCfgsByCmd))
.thenReturn(result);
}catch (Exception e){
Assert.fail("Received exception when success expected " + e.getMessage());
}
ConfigurationResponse cfgResponse = new ConfigurationResponse();
cfgResponse.setName("Test case");
Mockito.when(responseGenerator.createConfigurationResponse(cfg)).thenReturn(cfgResponse);
listCfgsByCmd.execute();
Mockito.verify(responseGenerator).createConfigurationResponse(cfg);
ListResponse<ConfigurationResponse> actualResponse = (ListResponse<ConfigurationResponse>) listCfgsByCmd.getResponseObject();
Assert.assertEquals(cfgResponse, actualResponse.getResponses().get(0));
}
}

View File

@ -0,0 +1,116 @@
// 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.api.command.test;
import com.cloud.configuration.Configuration;
import com.cloud.configuration.ConfigurationService;
import com.cloud.exception.InvalidParameterValueException;
import com.cloud.resource.ResourceService;
import junit.framework.Assert;
import junit.framework.TestCase;
import org.apache.cloudstack.api.ResponseGenerator;
import org.apache.cloudstack.api.ServerApiException;
import org.apache.cloudstack.api.command.admin.config.UpdateCfgCmd;
import org.apache.cloudstack.api.response.ConfigurationResponse;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.mockito.Mockito;
public class UpdateCfgCmdTest extends TestCase{
private UpdateCfgCmd updateCfgCmd;
private ConfigurationService configService;
private ResponseGenerator responseGenerator;
@Rule
public ExpectedException expectedException = ExpectedException.none();
@Before
public void setUp() {
responseGenerator = Mockito.mock(ResponseGenerator.class);
configService = Mockito.mock(ConfigurationService.class);
updateCfgCmd = new UpdateCfgCmd();
}
@Test
public void testExecuteForEmptyResult() {
updateCfgCmd._configService = configService;
try {
updateCfgCmd.execute();
} catch (ServerApiException exception) {
Assert.assertEquals("Failed to update config",
exception.getDescription());
}
}
@Test
public void testExecuteForNullResult() {
updateCfgCmd._configService = configService;
try {
Mockito.when(
configService.updateConfiguration(updateCfgCmd))
.thenReturn(null);
} catch (InvalidParameterValueException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
updateCfgCmd.execute();
} catch (ServerApiException exception) {
Assert.assertEquals("Failed to update config",
exception.getDescription());
}
}
@Test
public void testCreateSuccess() {
Configuration cfg = Mockito.mock(Configuration.class);
updateCfgCmd._configService = configService;
updateCfgCmd._responseGenerator = responseGenerator;
try {
Mockito.when(
configService.updateConfiguration(updateCfgCmd))
.thenReturn(cfg);
}catch (Exception e){
Assert.fail("Received exception when success expected " + e.getMessage());
}
ConfigurationResponse response = new ConfigurationResponse();
response.setName("Test case");
Mockito.when(responseGenerator.createConfigurationResponse(cfg)).thenReturn(response);
updateCfgCmd.execute();
Mockito.verify(responseGenerator).createConfigurationResponse(cfg);
ConfigurationResponse actualResponse = (ConfigurationResponse) updateCfgCmd.getResponseObject();
Assert.assertEquals(response, actualResponse);
Assert.assertEquals("updateconfigurationresponse", response.getResponseName());
}
}

View File

@ -27,3 +27,4 @@ MSMNTDIR=/mnt
COMPONENTS-SPEC=components.xml
AWSAPILOG=awsapi.log
REMOTEHOST=localhost
COMMONLIBDIR=C:\Users\htrippaers\eclipse_workspace\cloudstack\client\target\cloud-client-ui-4.2.0-SNAPSHOT\WEB-INF\classes

File diff suppressed because it is too large Load Diff

View File

@ -128,8 +128,8 @@ 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.pod.processing=Suppression du pod...
label.action.delete.primary.storage=Supprimer le stockage primaire
label.action.delete.primary.storage.processing=Suppression du stockage primaire...
label.action.delete.primary.storage=Supprimer le stockage principal
label.action.delete.primary.storage.processing=Suppression du stockage principal...
label.action.delete.secondary.storage=Supprimer le stockage secondaire
label.action.delete.secondary.storage.processing=Suppression du stockage secondaire...
label.action.delete.security.group=Supprimer le groupe de s\u00E9curit\u00E9
@ -184,7 +184,7 @@ 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.primary.storage=Modifier le stockage principal
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\u00E8le
@ -236,6 +236,8 @@ 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.resize.volume=Redimensionner Volume
label.action.resize.volume.processing=Redimensionnement en cours...
label.action.resource.limits=Limites de ressources
label.action.restore.instance=Restaurer l\\'instance
label.action.restore.instance.processing=Restauration de l\\'instance...
@ -263,7 +265,7 @@ 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.ACL=Ajouter 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
@ -302,10 +304,10 @@ 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.primary.storage=Ajouter un stockage principal
label.add.resources=Ajouter ressources
label.add.route=Ajouter route
label.add.rule=Ajouter r\u00E8gle
label.add.secondary.storage=Ajouter un stockage secondaire
label.add.security.group=Ajouter un groupe de s\u00E9curit\u00E9
label.add.service.offering=Ajouter une offre de service
@ -344,7 +346,7 @@ label.agree=Accepter
label.alert=Alerte
label.algorithm=Algorithme
label.allocated=Allou\u00E9
label.allocation.state=\u00C9tat de l\\'allocation
label.allocation.state=\u00C9tat
label.api.key=Cl\u00E9 d\\'API
label.apply=Appliquer
label.assign=Assigner
@ -402,7 +404,7 @@ label.clvm=CLVM
label.code=Code
label.community=Communaut\u00E9
label.compute=Processeur
label.compute.and.storage=Processeur et Stockage
label.compute.and.storage=Calcul et Stockage
label.compute.offering=Offre de calcul
label.compute.offerings=Offres de calcul
label.configuration=Configuration
@ -474,7 +476,7 @@ 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.name=Nom d\\'affichage
label.display.name=Nom commun
label.display.text=Texte affich\u00E9
label.dns=DNS
label.dns.1=DNS 1
@ -508,7 +510,7 @@ 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.IP=Fin de plage IP
label.end.port=Port de fin
label.end.reserved.system.IP=Adresse IP de fin r\u00E9serv\u00E9e Syst\u00E8me
label.end.vlan=VLAN de fin
@ -522,7 +524,7 @@ label.f5=F5
label.failed=\u00C9chou\u00E9
label.featured=Sponsoris\u00E9
label.fetch.latest=Rafra\u00EEchir
label.filterBy=Filtrer par
label.filterBy=Filtre
label.firewall=Pare-feu
label.first.name=Pr\u00E9nom
label.format=Format
@ -574,8 +576,8 @@ 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.addPrimaryStorageIntro.subtitle=Qu\\'est ce que le stockage principal ?
label.installWizard.addPrimaryStorageIntro.title=Ajoutons du stockage principal
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
@ -626,10 +628,15 @@ 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.catalan=Catalan
label.lang.chinese=Chinois (simplifi\u00E9)
label.lang.english=Anglais
label.lang.french=Fran\u00E7ais
label.lang.german=Allemand
label.lang.italian=Italien
label.lang.japanese=Japonais
label.lang.korean=Cor\u00E9en
label.lang.norwegian=Norv\u00E9gien
label.lang.russian=Russe
label.lang.spanish=Espagnol
label.last.disconnected=Derni\u00E8re D\u00E9connexion
@ -712,12 +719,12 @@ label.menu.virtual.resources=Ressources Virtuelles
label.menu.volumes=Volumes
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.instance.to.ps=Migration de l\\'instance sur un autre stockage principal
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.migrate.volume=Migration du volume vers un autre stockage principal
label.minimum=Minimum
label.minute.past.hour=minute(s)
label.monday=Lundi
@ -785,7 +792,7 @@ label.no.thanks=Non merci
label.none=Aucun
label.not.found=Introuvable
label.notifications=Messages
label.num.cpu.cores=Nombre de coeurs de processeur
label.num.cpu.cores=Nombre de c\u0153urs
label.number.of.clusters=Nombre de clusters
label.number.of.hosts=Nombre d\\'H\u00F4tes
label.number.of.pods=Nombre de Pods
@ -798,11 +805,11 @@ label.offer.ha=Offrir la haute disponibilit\u00E9
label.ok=OK
label.optional=Facultatif
label.order=Ordre
label.os.preference=Pr\u00E9f\u00E9rence du OS
label.os.preference=Pr\u00E9f\u00E9rence OS
label.os.type=Type du OS
label.owned.public.ips=Adresses IP Publiques d\u00E9tenues
label.owner.account=Propri\u00E9taire du compte
label.owner.domain=Propri\u00E9taire du domaine
label.owner.account=Propri\u00E9taire
label.owner.domain=Propri\u00E9taire
label.parent.domain=Parent du Domaine
label.password=Mot de passe
label.password.enabled=Mot de passe activ\u00E9
@ -820,11 +827,11 @@ label.port.forwarding.policies=R\u00E8gles de transfert de port
label.port.range=Plage de ports
label.prev=Pr\u00E9c\u00E9dent
label.previous=Retour
label.primary.allocated=Stockage primaire allou\u00E9
label.primary.network=R\u00E9seau primaire
label.primary.allocated=Stockage principal allou\u00E9
label.primary.network=R\u00E9seau principal
label.primary.storage=Premier stockage
label.primary.storage.count=Groupes de stockage primaire
label.primary.used=Stockage primaire utilis\u00E9
label.primary.storage.count=Groupes de stockage principal
label.primary.used=Stockage principal utilis\u00E9
label.private.Gateway=Passerelle priv\u00E9e
label.private.interface=Interface priv\u00E9e
label.private.ip=Adresse IP Priv\u00E9e
@ -881,6 +888,9 @@ 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.resize.new.offering.id=Nouvelle Offre
label.resize.new.size=Nouvelle Taille (Go)
label.resize.shrink.ok=R\u00E9duction OK
label.resource=Ressource
label.resource.limits=Limite des ressources
label.resource.state=\u00C9tat des ressources
@ -947,8 +957,8 @@ label.site.to.site.VPN=VPN Site-\u00E0-Site
label.size=Taille
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.limits=Limites d\\'instantan\u00E9s
label.snapshot.name=Nom Instantan\u00E9
label.snapshot.s=Instantan\u00E9(s)
label.snapshot.schedule=Configurer un instantan\u00E9 r\u00E9current
label.snapshots=Instantan\u00E9s
@ -957,7 +967,7 @@ label.source.nat=NAT Source
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.IP=Plage de d\u00E9but 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
@ -1086,7 +1096,7 @@ label.vlan.id=ID du VLAN
label.vlan.range=Plage du VLAN
label.vm.add=Ajouter une instance
label.vm.destroy=D\u00E9truire
label.vm.display.name=Nom d\\'affichage de la VM
label.vm.display.name=Nom commun VM
label.vm.name=Nom de la VM
label.vm.reboot=Red\u00E9marrer
label.vm.start=D\u00E9marrer
@ -1120,7 +1130,7 @@ label.yes=Oui
label.zone=Zone
label.zone.details=D\u00E9tails de la zone
label.zone.id=ID de la zone
label.zone.name=Nom de la zone
label.zone.name=Nom de zone
label.zone.step.1.title=\u00C9tape 1 \: <strong>S\u00E9lectionnez un r\u00E9seau</strong>
label.zone.step.2.title=\u00C9tape 2 \: <strong>Ajoutez une zone</strong>
label.zone.step.3.title=\u00C9tape 3 \: <strong>Ajoutez un Pod</strong>
@ -1130,7 +1140,7 @@ 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.zoneWizard.trafficType.storage=Stockage \: Trafic entre les serveurs de stockages principaux 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
@ -1141,63 +1151,63 @@ message.action.cancel.maintenance=Votre h\u00F4te a quitt\u00E9 la maintenance.
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=\u00CAtes-vous s\u00FBr 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\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.cluster=\u00CAtes-vous s\u00FBr que vous voulez supprimer ce cluster.
message.action.delete.disk.offering=\u00CAtes-vous s\u00FBr que vous souhaitez supprimer cette offre de disque.
message.action.delete.domain=\u00CAtes-vous s\u00FBr que vous voulez supprimer ce domaine.
message.action.delete.external.firewall=\u00CAtes-vous s\u00FBr 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=\u00CAtes-vous s\u00FBr 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=\u00CAtes-vous s\u00FBr que vous souhaitez supprimer cette r\u00E8gle d\\'entr\u00E9e.
message.action.delete.network=\u00CAtes-vous s\u00FBr 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\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\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\u00E8me.
message.action.disable.cluster=Confirmez que vous souhaitez d\u00E9sactiver ce cluster
message.action.delete.pod=\u00CAtes-vous s\u00FBr que vous souhaitez supprimer ce pod.
message.action.delete.primary.storage=\u00CAtes-vous s\u00FBr que vous voulez supprimer ce stockage principal.
message.action.delete.secondary.storage=\u00CAtes-vous s\u00FBr que vous souhaitez supprimer ce stockage secondaire.
message.action.delete.security.group=\u00CAtes-vous s\u00FBr que vous souhaitez supprimer ce groupe de s\u00E9curit\u00E9.
message.action.delete.service.offering=\u00CAtes-vous s\u00FBr que vous souhaitez supprimer cette offre de service.
message.action.delete.snapshot=\u00CAtes-vous s\u00FBr que vous souhaitez supprimer cet instantan\u00E9
message.action.delete.system.service.offering=\u00CAtes-vous s\u00FBr que vous voulez supprimer l\\'offre syst\u00E8me.
message.action.delete.template=\u00CAtes-vous s\u00FBr que vous souhaitez supprimer ce mod\u00E8le.
message.action.delete.template.for.all.zones=Ce mod\u00E8le est utilis\u00E9 par toutes les zones. \u00CAtes-vous s\u00FBr que vous souhaitez le supprimer de toutes les zones.
message.action.delete.volume=\u00CAtes-vous s\u00FBr que vous souhaitez supprimer ce volume.
message.action.delete.zone=\u00CAtes-vous s\u00FBr que vous souhaitez supprimer cette zone.
message.action.destroy.instance=\u00CAtes-vous s\u00FBr que vous souhaitez supprimer cette instance.
message.action.destroy.systemvm=\u00CAtes-vous s\u00FBr que vous souhaitez supprimer cette VM Syst\u00E8me.
message.action.disable.cluster=\u00CAtes-vous s\u00FBr 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.disable.pod=\u00CAtes-vous s\u00FBr que vous souhaitez d\u00E9sactiver ce Pod
message.action.disable.static.NAT=\u00CAtes-vous s\u00FBr que vous souhaitez d\u00E9sactiver le NAT statique.
message.action.disable.zone=\u00CAtes-vous s\u00FBr que vous souhaitez 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.cluster=\u00CAtes-vous s\u00FBr 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.enable.pod=\u00CAtes-vous s\u00FBr que vous souhaitez activer ce Pod
message.action.enable.zone=\u00CAtes-vous s\u00FBr que vous souhaitez 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.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.manage.cluster=\u00CAtes-vous s\u00FBr que vous souhaitez g\u00E9rer le cluster
message.action.primarystorage.enable.maintenance.mode=Attention \: placer ce stockage principal 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=\u00CAtes-vous s\u00FBr 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.reboot.systemvm=\u00CAtes-vous s\u00FBr que vous souhaitez red\u00E9marrer cette VM Syst\u00E8me
message.action.release.ip=\u00CAtes-vous s\u00FBr que vous souhaitez lib\u00E9rer cette IP.
message.action.remove.host=\u00CAtes-vous s\u00FBr que vous voulez supprimer 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\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.restore.instance=\u00CAtes-vous s\u00FBr que vous souhaitez restaurer cette instance.
message.action.start.instance=\u00CAtes-vous s\u00FBr que vous souhaitez d\u00E9marrer cette instance.
message.action.start.router=\u00CAtes-vous s\u00FBr que vous souhaitez d\u00E9marrer ce routeur.
message.action.start.systemvm=\u00CAtes-vous s\u00FBr que vous souhaitez red\u00E9marrer cette VM syst\u00E8me.
message.action.stop.instance=\u00CAtes-vous s\u00FBr 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.stop.systemvm=\u00CAtes-vous s\u00FBr 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 ?
@ -1217,9 +1227,9 @@ message.add.load.balancer.under.ip=La r\u00E8gle de r\u00E9partition de charge \
message.add.network=Ajouter un nouveau r\u00E9seau \u00E0 la zone\: <b><span id\="zone_name"></span></b>
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 <b><span id\="add_pod_zone_name"></span></b>
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 <b><span id\="zone_name"></span></b>, pod <b><span id\="pod_name"></span></b>
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 principal, 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 principal
message.add.primary.storage=Ajouter un nouveau stockage principal \u00E0 la zone <b><span id\="zone_name"></span></b>, pod <b><span id\="pod_name"></span></b>
message.add.secondary.storage=Ajouter un nouveau stockage pour la zone <b><span id\="zone_name"></span></b>
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.
@ -1237,10 +1247,10 @@ message.after.enable.swift=Swift configur\u00E9. Remarque \: une fois que vous q
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.iso.confirm=\u00CAtes-vous s\u00FBr 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 <b>*<u>ne voulez pas</u>*</b> 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.offering.confirm=\u00CAtes-vous s\u00FBr 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
@ -1251,13 +1261,13 @@ message.confirm.action.force.reconnect=Confirmer la re-connexion forc\u00E9e de
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.destroy.router=\u00CAtes-vous s\u00FBr que vous voulez supprimer 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.join.project=\u00CAtes-vous s\u00FBr que vous souhaitez rejoindre ce projet.
message.confirm.remove.IP.range=\u00CAtes-vous s\u00FBr que vous voulez supprimer 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.iso.confirm=\u00CAtes-vous s\u00FBr que vous souhaitez copier votre image ISO vers
message.copy.template=Copier le mod\u00E8le <b id\="copy_template_name_text">XXX</b> de la zone <b id\="copy_template_source_zone_text"></b> vers
message.create.template=Voulez vous cr\u00E9er un mod\u00E8le ?
message.create.template.vm=Cr\u00E9er la VM depuis le mod\u00E8le <b id\="p_name"></b>
@ -1266,31 +1276,31 @@ 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.primary.storage=Cr\u00E9ation du stockage principal
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.delete.gateway=Confirmer la suppression de cette passerelle
message.delete.VPN.connection=\u00CAtes-vous s\u00FBr que vous voulez supprimer la connexion VPN
message.delete.VPN.customer.gateway=\u00CAtes-vous s\u00FBr que vous voulez supprimer cette passerelle VPN client
message.delete.VPN.gateway=\u00CAtes-vous s\u00FBr que vous voulez supprimer cette passerelle VPN
message.delete.account=\u00CAtes-vous s\u00FBr que vous souhaitez supprimer ce compte.
message.delete.gateway=\u00CAtes-vous s\u00FBr que vous voulez supprimer cette passerelle
message.delete.project=\u00CAtes-vous s\u00FBr de vouloir supprimer ce projet ?
message.delete.user=Confirmer la suppression de cet utilisateur.
message.delete.user=\u00CAtes-vous s\u00FBr que vous voulez supprimer 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.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 principal.
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.<br/><br/>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.primary.storage=Chaque cluster doit contenir un ou plusieurs serveurs de stockage principal, 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.<br/><br/>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.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 principal) 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.detach.iso.confirm=\u00CAtes-vous s\u00FBr 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.disable.vpn.access=\u00CAtes-vous s\u00FBr que vous souhaitez d\u00E9sactiver l\\'acc\u00E8s VPN.
message.download.ISO=Cliquer <a href\="\#">00000</a> pour t\u00E9l\u00E9charger une image ISO
message.download.template=Cliquer sur <a href\="\#">00000</a> pour t\u00E9l\u00E9charger le mod\u00E8le
message.download.volume=Cliquer sur <a href\="\#">00000</a> pour t\u00E9l\u00E9charger le volume
@ -1299,7 +1309,7 @@ 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.account=\u00CAtes-vous s\u00FBr que vous souhaitez activer ce compte.
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 ?
@ -1317,7 +1327,7 @@ message.installWizard.copy.whatIsAHost=Un h\u00F4te est une machine. Les h\u00F4
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.<br/>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.<br/><br/>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.<br/><br/><strong>Le stockage primaire</strong> 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.whatIsPrimaryStorage=Une infrastructure CloudStack&\#8482; utilise deux types de stockage \: stockage principal et stockage secondaire. Les deux peuvent \u00EAtre des serveurs iSCSI ou NFS, ou sur disque local.<br/><br/><strong>Le stockage principal</strong> 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 principal 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\:<ul><li>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</li><li>Images ISO - images de syst\u00E8me d\\'exploitation ou d\\'installation d\\'OS qui peuvent \u00EAtre amor\u00E7able ou non-amor\u00E7able</li><li>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</ul>
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.
@ -1330,7 +1340,7 @@ message.installWizard.tooltip.addPod.reservedSystemGateway=Passerelle pour les s
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.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 principal 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
@ -1351,13 +1361,13 @@ message.iso.desc=Image disque contenant des donn\u00E9es ou un support amor\u00E
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.lock.account=\u00CAtes-vous s\u00FBr 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.instance.to.ps=Confirmer la migration de l\\'instance vers un autre stockage principal
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.migrate.volume=Confirmer la migration du volume vers un autre stockage principal.
message.new.user=Renseigner les informations suivantes pour ajouter un nouveau compte utilisateur
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.
@ -1366,7 +1376,7 @@ message.no.projects.adminOnly=Vous n\\'avez pas de projet.<br/>Contacter votre a
message.number.clusters=<h2><span> \# de </span> Clusters</h2>
message.number.hosts=<h2><span> \# d\\' </span> H\u00F4tes</h2>
message.number.pods=<h2><span> \# de </span> Pods</h2>
message.number.storage=<h2><span> \# de </span> Volumes de Stockage Primaire</h2>
message.number.storage=<h2><span> \# de </span> Volumes de Stockage Principal</h2>
message.number.zones=<h2><span> \# de </span> Zones</h2>
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.
@ -1380,7 +1390,7 @@ message.project.invite.sent=Invitation envoy\u00E9e ; les utilisateurs seront aj
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.<br/><br/>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.remove.vpn.access=\u00CAtes-vous s\u00FBr 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
@ -1425,14 +1435,14 @@ message.validate.instance.name=Le nom de l\\'instance ne peut d\u00E9passer 63 c
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.volume.create.template.confirm=\u00CAtes-vous s\u00FBr 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.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 \:<br/><br/>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.<br/><br/>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.<br/><br/><br/>Voulez-vous continuer ?
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 \:<br/><br/>1. Si les machines virtuelles Syst\u00E8mes doivent \u00EAtre lanc\u00E9es depuis le stockage principal, 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.<br/><br/>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.<br/><br/><br/>Voulez-vous continuer ?
mode=Mode
network.rate=D\u00E9bit R\u00E9seau
notification.reboot.instance=Red\u00E9marrer l\\'instance

View File

@ -609,6 +609,7 @@
<property name="UserAuthenticators" value="#{userAuthenticators.Adapters}" />
<property name="UserPasswordEncoders" value="#{userPasswordEncoders.Adapters}" />
<property name="HostAllocators" value="#{hostAllocators.Adapters}" />
<property name="AffinityGroupProcessors" value="#{affinityProcessors.Adapters}" />
</bean>
<bean id="storageManagerImpl" class="com.cloud.storage.StorageManagerImpl">
@ -713,6 +714,7 @@
<bean id="agentMonitor" class="com.cloud.agent.manager.AgentMonitor" />
<bean id="alertGenerator" class="com.cloud.event.AlertGenerator" />
<bean id="ancientDataMotionStrategy" class="org.apache.cloudstack.storage.motion.AncientDataMotionStrategy" />
<bean id="xenserverStorageMotionStrategy" class="org.apache.cloudstack.storage.motion.XenServerStorageMotionStrategy" />
<bean id="ancientImageDataStoreProvider" class="org.apache.cloudstack.storage.image.store.AncientImageDataStoreProvider" />
<bean id="ancientSnapshotStrategy" class="org.apache.cloudstack.storage.snapshot.strategy.AncientSnapshotStrategy" />
<bean id="apiDBUtils" class="com.cloud.api.ApiDBUtils" />
@ -838,7 +840,10 @@
-->
<bean id="AffinityGroupServiceImpl" class="org.apache.cloudstack.affinity.AffinityGroupServiceImpl"/>
<bean id="DeploymentPlanningManager" class="com.cloud.deploy.DeploymentPlanningManagerImpl" />
<bean id="DeploymentPlanningManager" class="com.cloud.deploy.DeploymentPlanningManagerImpl">
<property name="Planners" value="#{deploymentPlanners.Adapters}" />
<property name="AffinityGroupProcessors" value="#{affinityProcessors.Adapters}" />
</bean>
<bean id="AffinityGroupJoinDaoImpl" class="com.cloud.api.query.dao.AffinityGroupJoinDaoImpl">
</bean>

View File

@ -69,6 +69,7 @@ changeServiceForVirtualMachine=15
scaleVirtualMachine=15
assignVirtualMachine=1
migrateVirtualMachine=1
migrateVirtualMachineWithVolume=1
recoverVirtualMachine=7
#### snapshot commands
@ -254,6 +255,7 @@ deleteHost=3
prepareHostForMaintenance=1
cancelHostMaintenance=1
listHosts=3
findHostsForMigration=1
addSecondaryStorage=1
updateHostPassword=1
@ -288,6 +290,7 @@ deleteStoragePool=1
listClusters=3
enableStorageMaintenance=1
cancelStorageMaintenance=1
findStoragePoolsForMigration=1
#### security group commands
createSecurityGroup=15

View File

@ -258,4 +258,12 @@
<property name="type" value="host anti-affinity"/>
</bean>
<bean id="affinityProcessors" class="com.cloud.utils.component.AdapterList">
<property name="Adapters">
<list>
<ref bean="HostAntiAffinityProcessor" />
</list>
</property>
</bean>
</beans>

View File

@ -360,4 +360,12 @@
<property name="type" value="host anti-affinity"/>
</bean>
<bean id="affinityProcessors" class="com.cloud.utils.component.AdapterList">
<property name="Adapters">
<list>
<ref bean="HostAntiAffinityProcessor" />
</list>
</property>
</bean>
</beans>

View File

@ -225,5 +225,12 @@
<property name="type" value="host anti-affinity"/>
</bean>
<bean id="affinityProcessors" class="com.cloud.utils.component.AdapterList">
<property name="Adapters">
<list>
<ref bean="HostAntiAffinityProcessor" />
</list>
</property>
</bean>
</beans>

View File

@ -65,15 +65,20 @@ public class HypervisorCapabilitiesVO implements HypervisorCapabilities {
@Column(name="vm_snapshot_enabled")
private Boolean vmSnapshotEnabled;
@Column(name="storage_motion_supported")
private boolean storageMotionSupported;
protected HypervisorCapabilitiesVO() {
this.uuid = UUID.randomUUID().toString();
}
public HypervisorCapabilitiesVO(HypervisorType hypervisorType, String hypervisorVersion, Long maxGuestsLimit, boolean securityGroupEnabled) {
public HypervisorCapabilitiesVO(HypervisorType hypervisorType, String hypervisorVersion, Long maxGuestsLimit,
boolean securityGroupEnabled, boolean storageMotionSupported) {
this.hypervisorType = hypervisorType;
this.hypervisorVersion = hypervisorVersion;
this.maxGuestsLimit = maxGuestsLimit;
this.securityGroupEnabled = securityGroupEnabled;
this.storageMotionSupported = storageMotionSupported;
this.uuid = UUID.randomUUID().toString();
}
@ -135,6 +140,21 @@ public class HypervisorCapabilitiesVO implements HypervisorCapabilities {
return maxGuestsLimit;
}
/**
* @param storageMotionSupported
*/
public void setStorageMotionSupported(boolean storageMotionSupported) {
this.storageMotionSupported = storageMotionSupported;
}
/**
* @return if storage motion is supported
*/
@Override
public boolean isStorageMotionSupported() {
return storageMotionSupported;
}
public long getId() {
return id;

View File

@ -66,6 +66,9 @@ public class AccountVO implements Account {
@Column(name="default_zone_id")
private Long defaultZoneId = null;
@Column(name = "default")
boolean isDefault;
public AccountVO() {
this.uuid = UUID.randomUUID().toString();
}
@ -179,4 +182,8 @@ public class AccountVO implements Account {
this.uuid = uuid;
}
@Override
public boolean isDefault() {
return isDefault;
}
}

View File

@ -29,10 +29,11 @@ import javax.persistence.Id;
import javax.persistence.Table;
import org.apache.cloudstack.api.Identity;
import org.apache.cloudstack.api.InternalIdentity;
import com.cloud.user.Account.State;
import com.cloud.utils.db.Encrypt;
import com.cloud.utils.db.GenericDao;
import org.apache.cloudstack.api.InternalIdentity;
/**
* A bean representing a user
@ -93,6 +94,9 @@ public class UserVO implements User, Identity, InternalIdentity {
@Column(name="uuid")
private String uuid;
@Column(name = "default")
boolean isDefault;
public UserVO() {
this.uuid = UUID.randomUUID().toString();
}
@ -262,4 +266,9 @@ public class UserVO implements User, Identity, InternalIdentity {
this.uuid = uuid;
}
@Override
public boolean isDefault() {
return isDefault;
}
}

View File

@ -26,7 +26,7 @@
<bookinfo id="cloudstack_admin">
<title>&PRODUCT; Administrator's Guide</title>
<productname>Apache CloudStack</productname>
<productnumber>4.0.0-incubating</productnumber>
<productnumber>4.2.0</productnumber>
<edition>1</edition>
<pubsnumber></pubsnumber>
<abstract>

View File

@ -27,7 +27,7 @@
<title>&PRODUCT; Guide</title>
<subtitle>Revised August 9, 2012 10:48 pm Pacific</subtitle>
<productname>Apache CloudStack</productname>
<productnumber>4.0.0</productnumber>
<productnumber>4.2.0</productnumber>
<edition>1</edition>
<pubsnumber></pubsnumber>
<abstract>

View File

@ -28,7 +28,7 @@
<bookinfo id="cloudstack_plugin_niciranvp">
<title>&PRODUCT; Plugin Guide for the Nicira NVP Plugin</title>
<productname>Apache CloudStack</productname>
<productnumber>4.0.0-incubating</productnumber>
<productnumber>4.2.0</productnumber>
<edition>1</edition>
<pubsnumber></pubsnumber>
<abstract>

View File

@ -0,0 +1,24 @@
<?xml version='1.0' encoding='utf-8' ?>
<!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
<!ENTITY % BOOK_ENTITIES SYSTEM "cloudstack.ent">
%BOOK_ENTITIES;
]>
<!-- 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.
-->
<section id="feedback">
<title>Feedback</title>
<para>to-do</para>
</section>

View File

@ -26,7 +26,7 @@
<bookinfo id="cloudstack_developers">
<title>&PRODUCT; Developer's Guide</title>
<productname>Apache CloudStack</productname>
<productnumber>4.1.0-incubating</productnumber>
<productnumber>4.2.0</productnumber>
<edition></edition>
<pubsnumber></pubsnumber>
<abstract>

View File

@ -25,7 +25,7 @@
<bookinfo id="book-installation">
<title>&PRODUCT; Installation Guide</title>
<productname>Apache CloudStack</productname>
<productnumber>4.0.0</productnumber>
<productnumber>4.2.0</productnumber>
<edition>1</edition>
<pubsnumber/>
<abstract>

View File

@ -25,7 +25,7 @@
<preface id="pref-cloudstack-Preface">
<title>Preface</title>
<xi:include href="Common_Content/Conventions.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
<xi:include href="Feedback.xml" xmlns:xi="http://www.w3.org/2001/XInclude"><xi:fallback xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include href="Common_Content/Feedback.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
<xi:include href="feedback.xml" xmlns:xi="http://www.w3.org/2001/XInclude"><xi:fallback xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include href="Common_Content/feedback.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
</xi:fallback>
</xi:include>
</preface>

File diff suppressed because it is too large Load Diff

View File

@ -362,7 +362,7 @@
Secondary Storage :</para>
<itemizedlist>
<listitem>
<para><emphasis role="bold">NFS Server.</emphasis> The IP address of the server.</para>
<para><emphasis role="bold">NFS Server.</emphasis> The IP address of the server or fully qualified domain name of the server.</para>
</listitem>
<listitem>
<para><emphasis role="bold">Path.</emphasis> The exported path from the server.</para>

View File

@ -28,7 +28,7 @@
<listitem><para>Guest. When end users run VMs, they generate guest traffic. The guest VMs communicate with each other over a network that can be referred to as the guest network. This network can be isolated or shared. In an isolated guest network, the administrator needs to reserve VLAN ranges to provide isolation for each &PRODUCT; accounts network (potentially a large number of VLANs). In a shared guest network, all guest VMs share a single network.</para></listitem>
<listitem><para>Management. When &PRODUCT;s internal resources communicate with each other, they generate management traffic. This includes communication between hosts, system VMs (VMs used by &PRODUCT; to perform various tasks in the cloud), and any other component that communicates directly with the &PRODUCT; Management Server. You must configure the IP range for the system VMs to use.</para></listitem>
<listitem><para>Public. 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 &PRODUCT; UI to acquire these IPs to implement NAT between their guest network and the public network, as described in “Acquiring a New IP Address” in the Administration Guide.</para></listitem>
<listitem><para>Storage. Traffic such as VM templates and snapshots, which is sent between the secondary storage VM and secondary storage servers. &PRODUCT; uses a separate Network Interface Controller (NIC) named storage NIC for storage network traffic. Use of a storage NIC that always operates on a high bandwidth network allows fast template and snapshot copying. You must configure the IP range to use for the storage network.</para></listitem>
<listitem><para>Storage. While labeled "storage" this is specifically about secondary storage, and doesn't affect traffic for primary storage. This includes traffic such as VM templates and snapshots, which is sent between the secondary storage VM and secondary storage servers. &PRODUCT; uses a separate Network Interface Controller (NIC) named storage NIC for storage network traffic. Use of a storage NIC that always operates on a high bandwidth network allows fast template and snapshot copying. You must configure the IP range to use for the storage network.</para></listitem>
</itemizedlist>
<para>These traffic types can each be on a separate physical network, or they can be combined with certain restrictions. When you use the Add Zone wizard in the UI to create a new zone, you are guided into making only valid choices.</para>
</section>

View File

@ -26,10 +26,10 @@
<para>When basic networking is used, there can be only one physical network in the zone. That physical network carries the following traffic types:</para>
<itemizedlist>
<listitem><para>Guest. When end users run VMs, they generate guest traffic. The guest VMs communicate with each other over a network that can be referred to as the guest network. Each pod in a basic zone is a broadcast domain, and therefore each pod has a different IP range for the guest network. The administrator must configure the IP range for each pod.</para></listitem>
<listitem><para>Management. When &PRODUCT;s internal resources communicate with each other, they generate management traffic. This includes communication between hosts, system VMs (VMs used by &PRODUCT; to perform various tasks in the cloud), and any other component that communicates directly with the &PRODUCT; Management Server. You must configure the IP range for the system VMs to use.</para>
<listitem><para>Management. When &PRODUCT;'s internal resources communicate with each other, they generate management traffic. This includes communication between hosts, system VMs (VMs used by &PRODUCT; to perform various tasks in the cloud), and any other component that communicates directly with the &PRODUCT; Management Server. You must configure the IP range for the system VMs to use.</para>
<note><para>We strongly recommend the use of separate NICs for management traffic and guest traffic.</para></note></listitem>
<listitem><para>Public. 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 &PRODUCT; UI to acquire these IPs to implement NAT between their guest network and the public network, as described in Acquiring a New IP Address.</para></listitem>
<listitem><para>Storage. Traffic such as VM templates and snapshots, which is sent between the secondary storage VM and secondary storage servers. &PRODUCT; uses a separate Network Interface Controller (NIC) named storage NIC for storage network traffic. Use of a storage NIC that always operates on a high bandwidth network allows fast template and snapshot copying. You must configure the IP range to use for the storage network.</para></listitem>
<listitem><para>Storage. While labeled "storage" this is specifically about secondary storage, and doesn't affect traffic for primary storage. This includes traffic such as VM templates and snapshots, which is sent between the secondary storage VM and secondary storage servers. &PRODUCT; uses a separate Network Interface Controller (NIC) named storage NIC for storage network traffic. Use of a storage NIC that always operates on a high bandwidth network allows fast template and snapshot copying. You must configure the IP range to use for the storage network.</para></listitem>
</itemizedlist>
<para>In a basic network, configuring the physical network is fairly straightforward. In most cases, you only need to configure one guest network to carry traffic that is generated by guest VMs. If you use a NetScaler load balancer and enable its elastic IP and elastic load balancing (EIP and ELB) features, you must also configure a network to carry public traffic. &PRODUCT; takes care of presenting the necessary network configuration steps to you in the UI when you add a new zone.</para>
</section>

View File

@ -0,0 +1,49 @@
<?xml version='1.0' encoding='utf-8' ?>
<!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
<!ENTITY % BOOK_ENTITIES SYSTEM "cloudstack.ent">
%BOOK_ENTITIES;
]>
<!-- 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.
-->
<section id="sect-source-nonoss">
<title>Building Non-OSS</title>
<para>If you need support for the VMware, NetApp, F5, NetScaler, SRX, or any other non-Open Source Software (nonoss) plugins, you'll need to download a few components on your own and follow a slightly different procedure to build from source.</para>
<note><title>Why Non-OSS?</title>
<para>Some of the plugins supported by &PRODUCT; cannot be distributed with &PRODUCT; for licensing reasons. In some cases, some of the required libraries/JARs are under a proprietary license. In other cases, the required libraries may be under a license that's not compatible with <ulink url="http://www.apache.org/legal/resolved.html#category-x">Apache's licensing guidelines for third-party products</ulink>.</para>
</note>
<orderedlist>
<listitem>
<para>To build the Non-OSS plugins, you'll need to have the requisite JARs installed under the <filename>deps</filename> directory.</para>
<para>Because these modules require dependencies that can't be distributed with &PRODUCT; you'll need to download them yourself. Links to the most recent dependencies are listed on the <ulink url="https://cwiki.apache.org/CLOUDSTACK/how-to-build-on-master-branch.html"><emphasis>How to build on master branch</emphasis></ulink> page on the wiki.</para></listitem>
<listitem>
<para>You may also need to download <ulink url="http://download.cloud.com.s3.amazonaws.com/tools/vhd-util">vhd-util</ulink>, which was removed due to licensing issues. You'll copy vhd-util to the <filename>scripts/vm/hypervisor/xenserver/</filename> directory.</para>
</listitem>
<listitem>
<para>Once you have all the dependencies copied over, you'll be able to build &PRODUCT; with the <command>nonoss</command> option:</para>
<programlisting language="Bash">
<prompt>$</prompt> mvn clean
<prompt>$</prompt> mvn install -Dnonoss
</programlisting>
</listitem>
<listitem>
<para>Once you've built &PRODUCT; with the <command>nonoss</command> profile, you can package it using the <xref linkend="sect-source-buildrpm" /> or <xref linkend="sect-source-builddebs" /> instructions.</para>
</listitem>
</orderedlist>
</section>

View File

@ -0,0 +1,107 @@
<?xml version='1.0' encoding='utf-8' ?>
<!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
<!ENTITY % BOOK_ENTITIES SYSTEM "cloudstack.ent">
%BOOK_ENTITIES;
]>
<!-- 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.
-->
<section id="changed-API-commands-4.2">
<title>Changed API Commands in 4.2</title>
<informaltable>
<tgroup cols="2" align="left" colsep="1" rowsep="1">
<thead>
<row>
<entry><para>Parameter Name</para></entry>
<entry><para>Description</para></entry>
</row>
</thead>
<tbody>
<row>
<entry><para>updateResourceLimit</para></entry>
<entry>
<para>Added the following resource types to the <parameter>resourcetype</parameter>
request parameter to set the limits:</para>
<itemizedlist>
<listitem>
<para>CPU</para>
</listitem>
<listitem>
<para>RAM</para>
</listitem>
<listitem>
<para>primary storage</para>
</listitem>
<listitem>
<para>secondary storage</para>
</listitem>
<listitem>
<para>network rate</para>
</listitem>
</itemizedlist>
</entry>
</row>
<row>
<entry><para>updateResourceCount</para></entry>
<entry>
<para>Added the following resource types to the <parameter>resourcetype</parameter>
request parameter to set the limits:</para>
<itemizedlist>
<listitem>
<para>CPU</para>
</listitem>
<listitem>
<para>RAM</para>
</listitem>
<listitem>
<para>primary storage</para>
</listitem>
<listitem>
<para>secondary storage</para>
</listitem>
<listitem>
<para>network rate</para>
</listitem>
</itemizedlist>
</entry>
</row>
<row>
<entry><para>listResourceLimits </para></entry>
<entry>
<para>Added the following resource types to the <parameter>resourcetype</parameter>
request parameter:</para>
<itemizedlist>
<listitem>
<para>CPU</para>
</listitem>
<listitem>
<para>RAM</para>
</listitem>
<listitem>
<para>primary storage</para>
</listitem>
<listitem>
<para>secondary storage</para>
</listitem>
<listitem>
<para>network rate</para>
</listitem>
</itemizedlist>
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</section>

24
docs/en-US/feedback.xml Normal file
View File

@ -0,0 +1,24 @@
<?xml version='1.0' encoding='utf-8' ?>
<!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
<!ENTITY % BOOK_ENTITIES SYSTEM "cloudstack.ent">
%BOOK_ENTITIES;
]>
<!-- 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.
-->
<section id="feedback">
<title>Feedback</title>
<para>to-do</para>
</section>

View File

@ -34,5 +34,5 @@
<xi:include href="hypervisor-host-install-network-openvswitch.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
<xi:include href="hypervisor-host-install-firewall.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
<xi:include href="hypervisor-host-install-finish.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
<xi:include href="hypervisor-host-install-primary-storage.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
<xi:include href="hypervisor-support-for-primarystorage.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
</section>

View File

@ -33,7 +33,7 @@
<colspec colname="c5" colnum="5" colwidth="17%"/>
<thead>
<row>
<entry></entry>
<entry/>
<entry><para>VMware vSphere</para></entry>
<entry><para>Citrix XenServer</para></entry>
<entry><para>KVM</para></entry>
@ -65,28 +65,40 @@
<entry><para>Y</para></entry>
<entry><para>Y</para></entry>
</row>
<row>
<entry><para><emphasis role="bold">Local storage support</emphasis></para></entry>
<entry><para>Y</para></entry>
<entry><para>Y</para></entry>
<entry><para>Y</para></entry>
</row>
<row>
<entry><para><emphasis role="bold">Storage over-provisioning</emphasis></para></entry>
<entry><para>NFS and iSCSI</para></entry>
<entry><para>NFS</para></entry>
<entry><para>NFS</para></entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>XenServer uses a clustered LVM system to store VM images on iSCSI and Fiber Channel volumes and does not support over-provisioning in the hypervisor. The storage server itself, however, can support thin-provisioning. As a result the &PRODUCT; can still support storage over-provisioning by running on thin-provisioned storage volumes.</para>
<para>KVM supports "Shared Mountpoint" storage. A shared mountpoint is a file system path local to each server in a given cluster. The path must be the same across all Hosts in the cluster, for example /mnt/primary1. This shared mountpoint is assumed to be a clustered filesystem such as OCFS2. In this case the &PRODUCT; does not attempt to mount or unmount the storage as is done with NFS. The &PRODUCT; requires that the administrator insure that the storage is available</para>
<para>XenServer uses a clustered LVM system to store VM images on iSCSI and Fiber Channel volumes
and does not support over-provisioning in the hypervisor. The storage server itself, however,
can support thin-provisioning. As a result the &PRODUCT; can still support storage
over-provisioning by running on thin-provisioned storage volumes.</para>
<para>KVM supports "Shared Mountpoint" storage. A shared mountpoint is a file system path local to
each server in a given cluster. The path must be the same across all Hosts in the cluster, for
example /mnt/primary1. This shared mountpoint is assumed to be a clustered filesystem such as
OCFS2. In this case the &PRODUCT; does not attempt to mount or unmount the storage as is done
with NFS. The &PRODUCT; requires that the administrator insure that the storage is
available</para>
<!-- <para>Oracle VM supports both iSCSI and NFS storage. When iSCSI is used with OVM, the &PRODUCT; administrator is responsible for setting up iSCSI on the host, including re-mounting the storage after the host recovers from a failure such as a network outage. With other hypervisors, &PRODUCT; takes care of mounting the iSCSI target on the host whenever it discovers a connection with an iSCSI server and unmounting the target when it discovers the connection is down.</para> -->
<para>With NFS storage, &PRODUCT; manages the overprovisioning. In this case the global configuration parameter storage.overprovisioning.factor controls the degree of overprovisioning. This is independent of hypervisor type.</para>
<para>Local storage is an option for primary storage for vSphere, XenServer, and KVM. When the local disk option is enabled, a local disk storage pool is automatically created on each host. To use local storage for the System Virtual Machines (such as the Virtual Router), set system.vm.use.local.storage to true in global configuration.</para>
<para>&PRODUCT; supports multiple primary storage pools in a Cluster. For example, you could provision 2 NFS servers in primary storage. Or you could provision 1 iSCSI LUN initially and then add a second iSCSI LUN when the first approaches capacity.</para>
<para>With NFS storage, &PRODUCT; manages the overprovisioning. In this case the global
configuration parameter storage.overprovisioning.factor controls the degree of overprovisioning.
This is independent of hypervisor type.</para>
<para>Local storage is an option for primary storage for vSphere, XenServer, and KVM. When the
local disk option is enabled, a local disk storage pool is automatically created on each host.
To use local storage for the System Virtual Machines (such as the Virtual Router), set
system.vm.use.local.storage to true in global configuration.</para>
<para>&PRODUCT; supports multiple primary storage pools in a Cluster. For example, you could
provision 2 NFS servers in primary storage. Or you could provision 1 iSCSI LUN initially and
then add a second iSCSI LUN when the first approaches capacity.</para>
</section>

Binary file not shown.

After

Width:  |  Height:  |  Size: 967 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 860 B

View File

@ -0,0 +1,371 @@
<?xml version='1.0' encoding='utf-8' ?>
<!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
<!ENTITY % BOOK_ENTITIES SYSTEM "cloudstack.ent">
%BOOK_ENTITIES;
]>
<!-- 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.
-->
<section id="limit-accounts-domains">
<title>Limiting Resource Usage</title>
<para>&PRODUCT; allows you to control resource usage based on the types of resources, such as CPU,
RAM, Primary storage, and Secondary storage. A new set of resource types has been added to the
existing pool of resources to support the new customization model&mdash;need-basis usage, such
as large VM or small VM. The new resource types are now broadly classified as CPU, RAM, Primary
storage, and Secondary storage. The root administrator is able to impose resource usage limit by
the following resource types for Domain, Project, and Accounts. </para>
<itemizedlist>
<listitem>
<para>CPUs</para>
</listitem>
<listitem>
<para>Memory (RAM)</para>
</listitem>
<listitem>
<para>Primary Storage (Volumes)</para>
</listitem>
<listitem>
<para>Secondary Storage (Snapshots, Templates, ISOs)</para>
</listitem>
</itemizedlist>
<para>To control the behaviour of this feature, the following configuration parameters have been
added:</para>
<informaltable>
<tgroup cols="2" align="left" colsep="1" rowsep="1">
<thead>
<row>
<entry><para>Parameter Name</para></entry>
<entry><para>Description</para></entry>
</row>
</thead>
<tbody>
<row>
<entry><para>max.account.cpus</para></entry>
<entry><para>Maximum number of CPU cores that can be used for an account. </para>
<para>Default is 40.</para></entry>
</row>
<row>
<entry><para>max.account.ram (MB)</para></entry>
<entry><para>Maximum RAM that can be used for an account. </para>
<para>Default is 40960.</para></entry>
</row>
<row>
<entry><para>max.account.primary.storage (GB)</para></entry>
<entry><para>Maximum primary storage space that can be used for an account. </para>
<para>Default is 200.</para>
</entry>
</row>
<row>
<entry><para>max.account.secondary.storage (GB)</para></entry>
<entry><para>Maximum secondary storage space that can be used for an account. </para>
<para>Default is 400.</para></entry>
</row>
<row>
<entry><para>max.project.cpus</para></entry>
<entry>
<para>Maximum number of CPU cores that can be used for an account. </para>
<para>Default is 40.</para>
</entry>
</row>
<row>
<entry><para>max.project.ram (MB)</para></entry>
<entry>
<para>Maximum RAM that can be used for an account. </para>
<para>Default is 40960.</para>
</entry>
</row>
<row>
<entry><para>max.project.primary.storage (GB)</para></entry>
<entry>
<para>Maximum primary storage space that can be used for an account. </para>
<para>Default is 200.</para>
</entry>
</row>
<row>
<entry><para>max.project.secondary.storage (GB)</para></entry>
<entry>
<para>Maximum secondary storage space that can be used for an account. </para>
<para>Default is 400.</para>
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<section id="user-permission-rn">
<title>User Permission</title>
<para>The root administrator, domain administrators and users are able to list resources. Ensure
that proper logs are maintained in the <filename>vmops.log</filename> and
<filename>api.log</filename> files.</para>
<itemizedlist>
<listitem>
<para>The root admin will have the privilege to list and update resource limits.</para>
</listitem>
<listitem>
<para>The domain administrators are allowed to list and change these resource limits only
for the sub-domains and accounts under their own domain or the sub-domains. </para>
</listitem>
<listitem>
<para>The end users will the privilege to list resource limits. Use the listResourceLimits
API.</para>
</listitem>
</itemizedlist>
</section>
<section id="consideration-rn">
<title>Limit Usage Considerations</title>
<itemizedlist>
<listitem>
<para>Primary or Secondary storage space refers to the stated size of the volume and not the
physical size&mdash; the actual consumed size on disk in case of thin provisioning.</para>
</listitem>
<listitem>
<para>If the admin reduces the resource limit for an account and set it to less than the
resources that are currently being consumed, the existing VMs/templates/volumes are not
destroyed. Limits are imposed only if the user under that account tries to execute a new
operation using any of these resources. For example, the existing behavior in the case of
a VM are: </para>
<itemizedlist>
<listitem>
<para>migrateVirtualMachine: The users under that account will be able to migrate the
running VM into any other host without facing any limit issue.</para>
</listitem>
<listitem>
<para>recoverVirtualMachine: Destroyed VMs cannot be recovered.</para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para>For any resource type, if a domain has limit X, sub-domains or accounts under that
domain can have there own limits. However, the sum of resource allocated to a sub-domain
or accounts under the domain at any point of time should not exceed the value X.</para>
<para>For example, if a domain has the CPU limit of 40 and the sub-domain D1 and account A1
can have limits of 30 each, but at any point of time the resource allocated to D1 and A1
should not exceed the limit of 40.</para>
</listitem>
<listitem>
<para>If any operation needs to pass through two of more resource limit check, then the
lower of 2 limits will be enforced, For example: if an account has the VM limit of 10 and
CPU limit of 20, and a user under that account requests 5 VMs of 4 CPUs each. The user
can deploy 5 more VMs because VM limit is 10. However, the user cannot deploy any more
instances because the CPU limit has been exhausted.</para>
</listitem>
</itemizedlist>
</section>
<section id="per-domain-limits">
<title>Per-Domain Limits</title>
<para>&PRODUCT; allows the configuration of limits on a domain basis. With a domain limit in
place, all users still have their account limits. They are additionally limited, as a group,
to not exceed the resource limits set on their domain. Domain limits aggregate the usage of
all accounts in the domain as well as all the accounts in all the sub-domains of that domain.
Limits set at the root domain level apply to the sum of resource usage by the accounts in all
the domains and sub-domains below that root domain.</para>
<para>To set a domain limit:</para>
<orderedlist>
<listitem>
<para>Log in to the &PRODUCT; UI.</para>
</listitem>
<listitem>
<para>In the left navigation tree, click Domains.</para>
</listitem>
<listitem>
<para>Select the domain you want to modify. The current domain limits are displayed. </para>
<para>A value of -1 shows that there is no limit in place.</para>
</listitem>
<listitem>
<para>Click the Edit button<inlinemediaobject>
<imageobject>
<imagedata fileref="./images/edit-icon.png"/>
</imageobject>
<textobject>
<phrase>editbutton.png: edits the settings.</phrase>
</textobject>
</inlinemediaobject></para>
</listitem>
<listitem>
<para>Edit the following as per your requirement:</para>
<informaltable>
<tgroup cols="2" align="left" colsep="1" rowsep="1">
<thead>
<row>
<entry><para>Parameter Name</para></entry>
<entry><para>Description</para></entry>
</row>
</thead>
<tbody>
<row>
<entry><para>Instance Limits</para></entry>
<entry><para>The number of instances that can be used in a domain.</para></entry>
</row>
<row>
<entry><para>Public IP Limits</para></entry>
<entry>
<para>The number of public IP addresses that can be used in a
domain.</para></entry>
</row>
<row>
<entry><para>Volume Limits</para></entry>
<entry><para>The number of disk volumes that can be created in a domain. </para>
</entry>
</row>
<row>
<entry><para>Snapshot Limits</para></entry>
<entry>The number of snapshots that can be created in a domain.</entry>
</row>
<row>
<entry><para>Template Limits</para></entry>
<entry><para>The number of templates that can be registered in a
domain.</para></entry>
</row>
<row>
<entry><para>VPC limits</para></entry>
<entry><para>The number of VPCs that can be created in a domain.</para></entry>
</row>
<row>
<entry><para>CPU limits</para></entry>
<entry>
<para>The number of CPU cores that can be used for a domain.</para>
</entry>
</row>
<row>
<entry><para>Memory limits (MB)</para></entry>
<entry>
<para>The number of RAM that can be used for a domain.</para>
</entry>
</row>
<row>
<entry><para>Primary Storage limits (GB)</para></entry>
<entry>
<para>The primary storage space that can be used for a domain.</para>
</entry>
</row>
<row>
<entry><para>Secondary Storage limits (GB)</para></entry>
<entry>
<para>The secondary storage space that can be used for a domain.</para>
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</listitem>
<listitem>
<para>Click Apply.</para>
</listitem>
</orderedlist>
</section>
<section id="default-account-resource-limit">
<title>Default Account Resource Limits</title>
<para>You can limit resource use by accounts. The default limits are set by using Global
configuration parameters, and they affect all accounts within a cloud. The relevant parameters
are those beginning with max.account, for example: max.account.snapshots.</para>
<para>To override a default limit for a particular account, set a per-account resource
limit.</para>
<orderedlist>
<listitem>
<para>Log in to the &PRODUCT; UI.</para>
</listitem>
<listitem>
<para>In the left navigation tree, click Accounts.</para>
</listitem>
<listitem>
<para>Select the account you want to modify. The current limits are displayed. </para>
<para>A value of -1 shows that there is no limit in place.</para>
</listitem>
<listitem>
<para>Click the Edit button.<inlinemediaobject>
<imageobject>
<imagedata fileref="./images/edit-icon.png"/>
</imageobject>
<textobject>
<phrase>editbutton.png: edits the settings</phrase>
</textobject>
</inlinemediaobject></para>
</listitem>
<listitem>
<para>Edit the following as per your requirement:</para>
<informaltable>
<tgroup cols="2" align="left" colsep="1" rowsep="1">
<thead>
<row>
<entry><para>Parameter Name</para></entry>
<entry><para>Description</para></entry>
</row>
</thead>
<tbody>
<row>
<entry><para>Instance Limits</para></entry>
<entry><para>The number of instances that can be used in an account.</para>
<para>The default is 20.</para></entry>
</row>
<row>
<entry><para>Public IP Limits</para></entry>
<entry>
<para>The number of public IP addresses that can be used in an account.</para>
<para>The default is 20.</para></entry>
</row>
<row>
<entry><para>Volume Limits</para></entry>
<entry><para>The number of disk volumes that can be created in an account.</para>
<para>The default is 20.</para></entry>
</row>
<row>
<entry><para>Snapshot Limits</para></entry>
<entry><para>The number of snapshots that can be created in an account.</para>
<para>The default is 20.</para></entry>
</row>
<row>
<entry><para>Template Limits</para></entry>
<entry><para>The number of templates that can be registered in an account.</para>
<para>The default is 20.</para></entry>
</row>
<row>
<entry><para>VPC limits</para></entry>
<entry><para>The number of VPCs that can be created in an account.</para>
<para>The default is 20.</para></entry>
</row>
<row>
<entry><para>CPU limits</para></entry>
<entry>
<para>The number of CPU cores that can be used for an account.</para>
<para>The default is 40.</para></entry>
</row>
<row>
<entry><para>Memory limits (MB)</para></entry>
<entry>
<para>The number of RAM that can be used for an account.</para>
<para>The default is 40960.</para></entry>
</row>
<row>
<entry><para>Primary Storage limits (GB)</para></entry>
<entry>
<para>The primary storage space that can be used for an account.</para>
<para>The default is 200.</para></entry>
</row>
<row>
<entry><para>Secondary Storage limits (GB)</para></entry>
<entry>
<para>The secondary storage space that can be used for an account.</para>
<para>The default is 400.</para></entry>
</row>
</tbody>
</tgroup>
</informaltable>
</listitem>
<listitem>
<para>Click Apply.</para>
</listitem>
</orderedlist>
</section>
</section>

View File

@ -25,11 +25,11 @@
<section id="source-build">
<title>Building &PRODUCT; from Source</title>
<note>
<para>Prior to the 4.0.0 incubating release, Ant was used to build &PRODUCT;. Starting with 4.0.0 a migration to Maven is underway.</para>
<para>Prior to the 4.0.0 incubating release, Ant was used to build &PRODUCT;. A migration to Maven started in the 4.0.0 cycle, and has completed in 4.1.0.</para>
<para>The website and the wiki contain up to date information on the build procedure at:</para>
<itemizedlist>
<listitem><para><ulink url="https://cwiki.apache.org/CLOUDSTACK/building-with-maven.html">https://cwiki.apache.org/CLOUDSTACK/building-with-maven.html</ulink></para></listitem>
<listitem><para><ulink url="http://incubator.apache.org/cloudstack/develop/environment.html">http://incubator.apache.org/cloudstack/develop/environment.html</ulink></para></listitem>
<listitem><para><ulink url="https://cwiki.apache.org/CLOUDSTACK/setting-up-cloudstack-development-environment.html">https://cwiki.apache.org/CLOUDSTACK/setting-up-cloudstack-development-environment.html</ulink></para></listitem>
</itemizedlist>
</note>
<para>The overarching steps to build &PRODUCT; are:.</para>

View File

@ -34,4 +34,5 @@
<xi:include href="extracting-source.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
<xi:include href="build-deb.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
<xi:include href="build-rpm.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
<xi:include href="build-nonoss.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
</chapter>

View File

@ -24,10 +24,10 @@
<section id="troubleshooting-working-with-server-logs">
<title>Working with Server Logs</title>
<para>The &PRODUCT; Management Server logs all web site, middle tier, and database activities for diagnostics purposes in /var/log/cloud/management/. The &PRODUCT; logs a variety of error messages. We recommend this command to find the problematic output in the Management Server log:.</para>
<para>The &PRODUCT; Management Server logs all web site, middle tier, and database activities for diagnostics purposes in /var/log/cloudstack/management/. The &PRODUCT; logs a variety of error messages. We recommend this command to find the problematic output in the Management Server log:.</para>
<note><para>When copying and pasting a command, be sure the command has pasted as a single line before executing. Some document viewers may introduce unwanted line breaks in copied text.</para></note>
<programlisting>
grep -i -E 'exception|unable|fail|invalid|leak|warn|error' /var/log/cloud/management/management-server.log
grep -i -E 'exception|unable|fail|invalid|leak|warn|error' /var/log/cloudstack/management/management-server.log
</programlisting>
<para>The &PRODUCT; processes requests with a Job ID. If you find an error in the logs and you are interested in debugging the issue you can grep for this job ID in the management server log. For example, suppose that you find the following ERROR message:</para>
<programlisting>
@ -37,5 +37,5 @@
<programlisting>
grep "job-1076)" management-server.log
</programlisting>
<para>The &PRODUCT; Agent Server logs its activities in /var/log/cloud/agent/.</para>
<para>The &PRODUCT; Agent Server logs its activities in /var/log/cloudstack/agent/.</para>
</section>

View File

@ -26,6 +26,7 @@
<xi:include href="creating-vms.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
<xi:include href="accessing-vms.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
<xi:include href="stopping-and-starting-vms.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
<xi:include href="vm-snapshots.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
<xi:include href="changing-vm-name-os-group.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
<xi:include href="changing-service-offering-for-vm.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
<xi:include href="manual-live-migration.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>

146
docs/en-US/vm-snapshots.xml Normal file
View File

@ -0,0 +1,146 @@
<?xml version='1.0' encoding='utf-8' ?>
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
<!ENTITY % BOOK_ENTITIES SYSTEM "cloudstack.ent">
%BOOK_ENTITIES;
]>
<!-- 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.
-->
<section id="vm-snapshots">
<title>Virtual Machine Snapshots for VMware</title>
<para>(VMware hosts only)
In addition to the existing &PRODUCT; ability to snapshot VM volumes,
you can now take a VM snapshot to preserve all of the VM's state and data.
This is useful for quick restore of a VM.
For example, you can snapshot a VM, then make changes such as software upgrades.
If anything goes wrong, simply restore the VM to its previous state using the previously saved VM snapshot.
</para>
<para>The snapshot is created using the VMware native snapshot facility. The VM snapshot
includes not only the data volumes, but optionally also whether the VM is running or
turned off (CPU state) and the memory contents. The snapshot is stored in &PRODUCT;'s
primary storage.</para>
<para>VM snapshots can have a parent/child relationship.
Each successive snapshot of the same VM is the child of the snapshot that came before it.
Each time you take an additional snapshot of the same VM, it saves only the differences
between the current state of the VM and the state stored in the most recent previous snapshot.
The previous snapshot becomes a parent, and the new snapshot is its child.
It is possible to create a long chain of these parent/child snapshots,
which amount to a "redo" record leading from the current state of the VM back to the
original.</para>
<para>If you need more information about VM snapshots, check out the VMware documentation
and the VMware Knowledge Base, especially
<ulink url="http://kb.vmware.com/selfservice/microsites/search.do?cmd=displayKC&amp;externalId=1015180">Understanding virtual machine snapshots</ulink>.</para>
<section id="vm-snapshot-restrictions">
<title>Limitations on VM Snapshots</title>
<itemizedlist>
<listitem><para>If a VM has some stored snapshots, you can't attach new volume to the VM
or delete any existing volumes.
If you change the volumes on the VM, it would become impossible to restore the VM snapshot
which was created with the previous volume structure.</para></listitem>
<listitem><para>VM snapshots which include both data volumes and memory can't be kept if you change the VM's
service offering. Any existing VM snapshots of this type will be discarded.</para></listitem>
<listitem>
<para>You can't make a VM snapshot at the same time as you are taking a volume
snapshot.</para>
</listitem>
<listitem>
<para>The "quiesce" option is not supported. This option is provided by the underlying
VMware snapshot facility so that you can choose whether to quiesce the file system
on a running virtual machine before taking the snapshot. In &PRODUCT;, the quiesce option is always
set to false; the file system is not quiesced before taking a snapshot of a running VM.
</para>
</listitem>
<listitem><para>You should use only &PRODUCT; to create VM snapshots on VMware hosts managed by &PRODUCT;.
Any snapshots that you make directly on vSphere will not be tracked in &PRODUCT;.</para></listitem>
</itemizedlist>
</section>
<section id="vm-snapshot-configure">
<title>Configuring VM Snapshots</title>
<para>The cloud administrator can use global configuration variables to control the behavior of VM snapshots.
To set these variables, go through the Global Settings are of the UI.</para>
<informaltable>
<tgroup cols="2" align="left" colsep="1" rowsep="1">
<thead>
<row>
<entry><para>Configuration Setting Name</para></entry>
<entry><para>Description</para></entry>
</row>
</thead>
<tbody>
<row>
<entry><para>vmsnapshots.max</para></entry>
<entry><para>The maximum number of VM snapshots that can be saved for any given virtual machine in the cloud.
The total possible number of VM snapshots in the cloud is (number of VMs) * vmsnapshots.max.
If the number of snapshots for any VM ever hits the maximum, the older ones are removed
by the snapshot expunge job.
</para></entry>
</row>
<row>
<entry><para>vmsnapshot.create.wait</para></entry>
<entry><para>Number of seconds to wait for a snapshot job to succeed before declaring failure and issuing an error.</para></entry>
</row>
</tbody>
</tgroup>
</informaltable>
</section>
<section id="vm-snapshot-usage">
<title>Using VM Snapshots</title>
<para>To create a VM snapshot using the &PRODUCT; UI:</para>
<orderedlist>
<listitem><para>Log in to the &PRODUCT; UI as a user or administrator.</para></listitem>
<listitem><para>Click Instances.</para></listitem>
<listitem><para>Click the name of the VM you want to snapshot.</para></listitem>
<listitem><para>Click the Take VM Snapshot button.
<inlinemediaobject>
<imageobject>
<imagedata fileref="./images/VMSnapshotButton.png" format="PNG"/>
</imageobject>
</inlinemediaobject></para>
<note><para>If a snapshot is already in progress, then clicking this button will have no effect.</para></note><para/>
</listitem>
<listitem><para>Provide a name and description. These will be displayed in the VM Snapshots list.</para></listitem>
<listitem><para>(For running VMs only) If you want to include the VM's memory in the snapshot, click the
Memory checkbox. This saves the CPU and memory state of the virtual machine. If you
don't check this box, then only the current state of the VM disk is saved. Checking
this box makes the snapshot take longer.</para></listitem>
<listitem><para>Click OK.</para></listitem>
</orderedlist>
<para>To delete a snapshot or restore a VM to the state saved in a particular snapshot:</para>
<orderedlist>
<listitem><para>Navigate to the VM as described in the earlier steps.</para></listitem>
<listitem><para>Click View VM Snapshots.</para></listitem>
<listitem><para>In the list of snapshots, click the name of the snapshot you want to work with.</para></listitem>
<listitem><para>Depending on what you want to do:</para>
<para>To delete the snapshot, click the Delete button.
<inlinemediaobject>
<imageobject>
<imagedata fileref="./images/delete-button.png" format="PNG"/>
</imageobject>
</inlinemediaobject></para>
<para>To revert to the snapshot, click the Revert button.
<inlinemediaobject>
<imageobject>
<imagedata fileref="./images/revert-vm.png" format="PNG"/>
</imageobject>
</inlinemediaobject></para>
</listitem>
</orderedlist>
<note><para>VM snapshots are deleted automatically when a VM is destroyed.
You don't have to manually delete the snapshots in this case.</para></note>
</section>
</section>

View File

@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8' ?>
<!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
<!ENTITY % BOOK_ENTITIES SYSTEM "cloudstack.ent">
%BOOK_ENTITIES;
]>
@ -21,16 +21,18 @@
specific language governing permissions and limitations
under the License.
-->
<chapter id="work-with-usage">
<title>Working with Usage</title>
<para>The Usage Server is an optional, separately-installed part of &PRODUCT; that provides aggregated usage records which you can use to create billing integration for &PRODUCT;. The Usage Server works by taking data from the events log and creating summary usage records that you can access using the listUsageRecords API call. </para>
<para>The Usage Server is an optional, separately-installed part of &PRODUCT; that provides
aggregated usage records which you can use to create billing integration for &PRODUCT;. The
Usage Server works by taking data from the events log and creating summary usage records that
you can access using the listUsageRecords API call. </para>
<para>The usage records show the amount of resources, such as VM run time or template storage
space, consumed by guest instances.</para>
<para>The Usage Server runs at least once per day. It can be configured to run multiple times per day.</para>
<para>The Usage Server runs at least once per day. It can be configured to run multiple times per
day.</para>
<xi:include href="configure-usage-server.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
<xi:include href="set-usage-limit.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
<xi:include href="globally-configured-limits.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
<xi:include href="default-account-resource-limit.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
<xi:include href="per-domain-limits.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
<xi:include href="limit-accounts-domains.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
</chapter>

View File

@ -28,6 +28,7 @@ public interface ObjectInDataStoreStateMachine extends StateObject<ObjectInDataS
Created("The object is created"),
Ready("Template downloading is accomplished"),
Copying("The object is being coping"),
Migrating("The object is being migrated"),
Destroying("Template is destroying"),
Destroyed("Template is destroyed"),
Failed("Failed to download template");
@ -49,6 +50,7 @@ public interface ObjectInDataStoreStateMachine extends StateObject<ObjectInDataS
OperationSuccessed,
OperationFailed,
CopyingRequested,
MigrationRequested,
ResizeRequested,
ExpungeRequested

View File

@ -18,11 +18,12 @@
*/
package org.apache.cloudstack.engine.subsystem.api.storage;
import java.util.Map;
import org.apache.cloudstack.engine.cloud.entity.api.VolumeEntity;
import org.apache.cloudstack.framework.async.AsyncCallFuture;
import com.cloud.agent.api.to.VirtualMachineTO;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.host.Host;
public interface VolumeService {
@ -70,6 +71,8 @@ public interface VolumeService {
AsyncCallFuture<VolumeApiResult> createVolumeFromTemplateAsync(VolumeInfo volume, long dataStoreId, TemplateInfo template);
AsyncCallFuture<VolumeApiResult> copyVolume(VolumeInfo srcVolume, DataStore destStore);
AsyncCallFuture<VolumeApiResult> migrateVolume(VolumeInfo srcVolume, DataStore destStore);
AsyncCallFuture<CommandResult> migrateVolumes(Map<VolumeInfo, DataStore> volumeMap, VirtualMachineTO vmTo, Host srcHost, Host destHost);
boolean destroyVolume(long volumeId) throws ConcurrentOperationException;

View File

@ -25,4 +25,5 @@ public interface StoragePoolDetailsDao extends GenericDao<StoragePoolDetailVO, L
void update(long poolId, Map<String, String> details);
Map<String, String> getDetails(long poolId);
StoragePoolDetailVO findDetail(long poolId, String name);
}

View File

@ -37,7 +37,7 @@ public interface VMEntityManager {
String reserveVirtualMachine(VMEntityVO vmEntityVO, String plannerToUse, DeploymentPlan plan, ExcludeList exclude) throws InsufficientCapacityException, ResourceUnavailableException;
void deployVirtualMachine(String reservationId, String caller, Map<VirtualMachineProfile.Param, Object> params) throws InsufficientCapacityException, ResourceUnavailableException;
void deployVirtualMachine(String reservationId, VMEntityVO vmEntityVO, String caller, Map<VirtualMachineProfile.Param, Object> params) throws InsufficientCapacityException, ResourceUnavailableException;
boolean stopvirtualmachine(VMEntityVO vmEntityVO, String caller) throws ResourceUnavailableException;

View File

@ -20,6 +20,7 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import javax.inject.Inject;
@ -136,6 +137,7 @@ public class VMEntityManagerImpl implements VMEntityManager {
plan = new DataCenterDeployment(planToDeploy.getDataCenterId(), planToDeploy.getPodId(), planToDeploy.getClusterId(), planToDeploy.getHostId(), planToDeploy.getPoolId(), planToDeploy.getPhysicalNetworkId());
}
boolean planChangedByReadyVolume = false;
List<VolumeVO> vols = _volsDao.findReadyRootVolumesByInstance(vm.getId());
if(!vols.isEmpty()){
VolumeVO vol = vols.get(0);
@ -158,7 +160,7 @@ public class VMEntityManagerImpl implements VMEntityManager {
plan = new DataCenterDeployment(planToDeploy.getDataCenterId(), planToDeploy.getPodId(), planToDeploy.getClusterId(), planToDeploy.getHostId(), vol.getPoolId(), null, null);
}else{
plan = new DataCenterDeployment(rootVolDcId, rootVolPodId, rootVolClusterId, null, vol.getPoolId(), null, null);
planChangedByReadyVolume = true;
}
}
@ -187,6 +189,10 @@ public class VMEntityManagerImpl implements VMEntityManager {
_vmEntityDao.persist(vmEntityVO);
return vmReservation.getUuid();
} else if (planChangedByReadyVolume) {
// we could not reserve in the Volume's cluster - let the deploy
// call retry it.
return UUID.randomUUID().toString();
}else{
throw new InsufficientServerCapacityException("Unable to create a deployment for " + vmProfile, DataCenter.class, plan.getDataCenterId());
}
@ -194,13 +200,13 @@ public class VMEntityManagerImpl implements VMEntityManager {
}
@Override
public void deployVirtualMachine(String reservationId, String caller, Map<VirtualMachineProfile.Param, Object> params) throws InsufficientCapacityException, ResourceUnavailableException{
public void deployVirtualMachine(String reservationId, VMEntityVO vmEntityVO, String caller, Map<VirtualMachineProfile.Param, Object> params) throws InsufficientCapacityException, ResourceUnavailableException{
//grab the VM Id and destination using the reservationId.
VMReservationVO vmReservation = _reservationDao.findByReservationId(reservationId);
long vmId = vmReservation.getVmId();
VMInstanceVO vm = _vmDao.findByUuid(vmEntityVO.getUuid());
VMInstanceVO vm = _vmDao.findById(vmId);
VMReservationVO vmReservation = _reservationDao.findByReservationId(reservationId);
if(vmReservation != null){
// Pass it down
Long poolId = null;
Map<Long, Long> storage = vmReservation.getVolumeReservation();
@ -211,14 +217,19 @@ public class VMEntityManagerImpl implements VMEntityManager {
}
}
DataCenterDeployment reservedPlan = new DataCenterDeployment(vm.getDataCenterId(), vmReservation.getPodId(), vmReservation.getClusterId(),
vmReservation.getHostId(), null , null);
DataCenterDeployment reservedPlan = new DataCenterDeployment(vm.getDataCenterId(),
vmReservation.getPodId(), vmReservation.getClusterId(), vmReservation.getHostId(), null, null);
try {
VMInstanceVO vmDeployed = _itMgr.start(vm, params, _userDao.findById(new Long(caller)), _accountDao.findById(vm.getAccountId()), reservedPlan);
VMInstanceVO vmDeployed = _itMgr.start(vm, params, _userDao.findById(new Long(caller)),
_accountDao.findById(vm.getAccountId()), reservedPlan);
} catch (Exception ex) {
// Retry the deployment without using the reservation plan
DataCenterDeployment plan = new DataCenterDeployment(vm.getDataCenterId(), null, null,null, null , null);
_itMgr.start(vm, params, _userDao.findById(new Long(caller)), _accountDao.findById(vm.getAccountId()), plan);
_itMgr.start(vm, params, _userDao.findById(new Long(caller)), _accountDao.findById(vm.getAccountId()),
null);
}
} else {
// no reservation found. Let VirtualMachineManager retry
_itMgr.start(vm, params, _userDao.findById(new Long(caller)), _accountDao.findById(vm.getAccountId()), null);
}
}

View File

@ -206,7 +206,7 @@ public class VirtualMachineEntityImpl implements VirtualMachineEntity {
@Override
public void deploy(String reservationId, String caller, Map<VirtualMachineProfile.Param, Object> params) throws InsufficientCapacityException, ResourceUnavailableException{
manager.deployVirtualMachine(reservationId, caller, params);
manager.deployVirtualMachine(reservationId, this.vmEntityVO, caller, params);
}
@Override

View File

@ -21,11 +21,13 @@ package org.apache.cloudstack.storage.image;
import javax.inject.Inject;
import org.apache.cloudstack.engine.subsystem.api.storage.CommandResult;
import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult;
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.ImageService;
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event;
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.TemplateEvent;
import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo;
@ -37,6 +39,7 @@ import org.apache.cloudstack.framework.async.AsyncRpcConext;
import org.apache.cloudstack.storage.datastore.DataObjectManager;
import org.apache.cloudstack.storage.datastore.ObjectInDataStoreManager;
import org.apache.cloudstack.storage.image.store.TemplateObject;
import org.apache.cloudstack.storage.motion.DataMotionService;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
@ -49,6 +52,8 @@ public class ImageServiceImpl implements ImageService {
ObjectInDataStoreManager objectInDataStoreMgr;
@Inject
DataObjectManager dataObjectMgr;
@Inject
DataMotionService motionSrv;
class CreateTemplateContext<T> extends AsyncRpcConext<T> {
final TemplateInfo srcTemplate;
@ -140,17 +145,91 @@ public class ImageServiceImpl implements ImageService {
return null;
}
private class CopyTemplateContext<T> extends AsyncRpcConext<T> {
final AsyncCallFuture<CommandResult> future;
final DataObject object;
/**
* @param callback
*/
public CopyTemplateContext(AsyncCompletionCallback<T> callback, AsyncCallFuture<CommandResult> future, DataObject object) {
super(callback);
this.future = future;
this.object = object;
}
}
@Override
public AsyncCallFuture<CommandResult> createTemplateFromSnapshotAsync(
SnapshotInfo snapshot, TemplateInfo template, DataStore store) {
// TODO Auto-generated method stub
AsyncCallFuture<CommandResult> future = new AsyncCallFuture<CommandResult>();
DataObject templateOnStore = null;
try {
templateOnStore = store.create(template);
templateOnStore.processEvent(Event.CreateOnlyRequested);
CopyTemplateContext<CommandResult> context = new CopyTemplateContext<CommandResult>(null, future, templateOnStore);
AsyncCallbackDispatcher<ImageServiceImpl, CopyCommandResult> caller = AsyncCallbackDispatcher.create(this);
caller.setCallback(caller.getTarget().copyTemplateAsyncCallback(null, null))
.setContext(context);
this.motionSrv.copyAsync(snapshot, templateOnStore, caller);
} catch (Exception e) {
s_logger.debug("Failed to create template: " + template.getId() + "from snapshot: " + snapshot.getId() + ", due to " + e.toString());
if (templateOnStore != null) {
try {
templateOnStore.processEvent(Event.OperationFailed);
} catch (Exception e1) {
}
}
CommandResult result = new CommandResult();
result.setResult(e.toString());
future.complete(result);
}
return future;
}
protected Void copyTemplateAsyncCallback(AsyncCallbackDispatcher<ImageServiceImpl, CopyCommandResult> callback, CopyTemplateContext<CommandResult> context) {
CopyCommandResult result = callback.getResult();
AsyncCallFuture<CommandResult> future = context.future;
DataObject object = context.object;
CommandResult res = new CommandResult();
if (result.isFailed()) {
res.setResult(result.getResult());
object.processEvent(Event.OperationFailed);
} else {
object.processEvent(Event.OperationSuccessed);
}
future.complete(res);
return null;
}
@Override
public AsyncCallFuture<CommandResult> createTemplateFromVolumeAsync(
VolumeInfo volume, TemplateInfo template, DataStore store) {
// TODO Auto-generated method stub
return null;
AsyncCallFuture<CommandResult> future = new AsyncCallFuture<CommandResult>();
DataObject templateOnStore = null;
try {
templateOnStore = store.create(template);
templateOnStore.processEvent(Event.CreateOnlyRequested);
CopyTemplateContext<CommandResult> context = new CopyTemplateContext<CommandResult>(null, future, templateOnStore);
AsyncCallbackDispatcher<ImageServiceImpl, CopyCommandResult> caller = AsyncCallbackDispatcher.create(this);
caller.setCallback(caller.getTarget().copyTemplateAsyncCallback(null, null))
.setContext(context);
this.motionSrv.copyAsync(volume, templateOnStore, caller);
} catch (Exception e) {
s_logger.debug("Failed to create template: " + template.getId() + "from volume: " + volume.getId() + ", due to " + e.toString());
if (templateOnStore != null) {
try {
templateOnStore.processEvent(Event.OperationFailed);
} catch (Exception e1) {
}
}
CommandResult result = new CommandResult();
result.setResult(e.toString());
future.complete(result);
}
return future;
}
}

View File

@ -33,6 +33,8 @@ import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
import org.apache.cloudstack.framework.async.AsyncRpcConext;
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
import org.apache.cloudstack.storage.image.ImageDataStoreDriver;
import org.apache.log4j.Logger;
@ -45,8 +47,8 @@ import com.cloud.agent.api.to.SwiftTO;
import com.cloud.host.HostVO;
import com.cloud.host.dao.HostDao;
import com.cloud.storage.RegisterVolumePayload;
import com.cloud.storage.Storage.ImageFormat;
import com.cloud.storage.SnapshotVO;
import com.cloud.storage.Storage.ImageFormat;
import com.cloud.storage.VMTemplateStorageResourceAssoc;
import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.VMTemplateZoneVO;
@ -80,6 +82,7 @@ public class AncientImageDataStoreDriverImpl implements ImageDataStoreDriver {
@Inject SnapshotDao snapshotDao;
@Inject AgentManager agentMgr;
@Inject SnapshotManager snapshotMgr;
@Inject PrimaryDataStoreDao primaryDataStoreDao;
@Inject
private SwiftManager _swiftMgr;
@Inject
@ -196,9 +199,10 @@ public class AncientImageDataStoreDriverImpl implements ImageDataStoreDriver {
}
SwiftTO swift = _swiftMgr.getSwiftTO(snapshot.getSwiftId());
S3TO s3 = _s3Mgr.getS3TO();
VolumeVO volume = volumeDao.findById(volumeId);
StoragePoolVO pool = primaryDataStoreDao.findById(volume.getPoolId());
DeleteSnapshotBackupCommand cmd = new DeleteSnapshotBackupCommand(
swift, s3, secondaryStoragePoolUrl, dcId, accountId, volumeId,
pool, swift, s3, secondaryStoragePoolUrl, dcId, accountId, volumeId,
backupOfSnapshot, false);
Answer answer = agentMgr.sendToSSVM(dcId, cmd);

View File

@ -18,12 +18,15 @@
*/
package org.apache.cloudstack.storage.image.motion;
import java.util.Map;
import javax.inject.Inject;
import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
import org.apache.cloudstack.framework.async.AsyncCallbackDispatcher;
import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
import org.apache.cloudstack.framework.async.AsyncRpcConext;
@ -33,6 +36,8 @@ import org.apache.cloudstack.storage.endpoint.EndPointSelector;
import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreInfo;
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.to.VirtualMachineTO;
import com.cloud.host.Host;
//At least one of datastore is coming from image store or image cache store
@ -95,6 +100,11 @@ public class DefaultImageMotionStrategy implements ImageMotionStrategy {
return false;
}
@Override
public boolean canHandle(Map<VolumeInfo, DataStore> volumeMap, Host srcHost, Host destHost) {
return false;
}
@Override
public Void copyAsync(DataObject srcData, DataObject destData,
AsyncCompletionCallback<CopyCommandResult> callback) {
@ -137,4 +147,12 @@ public class DefaultImageMotionStrategy implements ImageMotionStrategy {
}
@Override
public Void copyAsync(Map<VolumeInfo, DataStore> volumeMap, VirtualMachineTO vmTo, Host srcHost, Host destHost,
AsyncCompletionCallback<CopyCommandResult> callback) {
CopyCommandResult result = new CopyCommandResult("", null);
result.setResult("not implemented");
callback.complete(result);
return null;
}
}

View File

@ -18,11 +18,18 @@
*/
package org.apache.cloudstack.storage.test;
import java.util.Map;
import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
import org.apache.cloudstack.storage.motion.DataMotionStrategy;
import com.cloud.agent.api.to.VirtualMachineTO;
import com.cloud.host.Host;
public class MockStorageMotionStrategy implements DataMotionStrategy {
@Override
@ -31,6 +38,11 @@ public class MockStorageMotionStrategy implements DataMotionStrategy {
return true;
}
@Override
public boolean canHandle(Map<VolumeInfo, DataStore> volumeMap, Host srcHost, Host destHost) {
return true;
}
@Override
public Void copyAsync(DataObject srcData, DataObject destData,
AsyncCompletionCallback<CopyCommandResult> callback) {
@ -39,4 +51,11 @@ public class MockStorageMotionStrategy implements DataMotionStrategy {
return null;
}
@Override
public Void copyAsync(Map<VolumeInfo, DataStore> volumeMap, VirtualMachineTO vmTo, Host srcHost, Host destHost,
AsyncCompletionCallback<CopyCommandResult> callback) {
CopyCommandResult result = new CopyCommandResult("something", null);
callback.complete(result);
return null;
}
}

View File

@ -106,7 +106,7 @@ public class SnapshotObject implements SnapshotInfo {
@Override
public Long getSize() {
return this.getSize();
return this.snapshot.getSize();
}
@Override

Some files were not shown because too many files have changed in this diff Show More