mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
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:
commit
7b011e7ef4
385
CHANGES
385
CHANGES
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
|
||||
39
api/src/com/cloud/agent/api/MigrateWithStorageAnswer.java
Normal file
39
api/src/com/cloud/agent/api/MigrateWithStorageAnswer.java
Normal 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;
|
||||
}
|
||||
}
|
||||
45
api/src/com/cloud/agent/api/MigrateWithStorageCommand.java
Normal file
45
api/src/com/cloud/agent/api/MigrateWithStorageCommand.java
Normal 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;
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
38
api/src/com/cloud/agent/api/storage/MigrateVolumeAnswer.java
Normal file
38
api/src/com/cloud/agent/api/storage/MigrateVolumeAnswer.java
Normal 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;
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -52,4 +52,6 @@ public interface HypervisorCapabilities extends Identity, InternalIdentity{
|
||||
*/
|
||||
Integer getMaxHostsPerCluster();
|
||||
|
||||
boolean isStorageMotionSupported();
|
||||
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
}
|
||||
|
||||
@ -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");
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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();
|
||||
|
||||
|
||||
@ -30,7 +30,4 @@ public interface PublicIpAddress extends ControlledEntity, IpAddress, Vlan, Inte
|
||||
public String getNetmask();
|
||||
|
||||
public String getGateway();
|
||||
|
||||
@Override
|
||||
public String getVlanTag();
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -107,6 +107,8 @@ public interface NetworkOffering extends InfrastructureEntity, InternalIdentity,
|
||||
|
||||
boolean getElasticIp();
|
||||
|
||||
boolean getAssociatePublicIP();
|
||||
|
||||
boolean getElasticLb();
|
||||
|
||||
boolean getSpecifyIpRanges();
|
||||
|
||||
@ -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();
|
||||
|
||||
}
|
||||
|
||||
@ -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();
|
||||
|
||||
}
|
||||
|
||||
@ -72,5 +72,7 @@ public interface User extends OwnedBy, InternalIdentity {
|
||||
String getRegistrationToken();
|
||||
|
||||
boolean isRegistered();
|
||||
|
||||
boolean isDefault();
|
||||
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
}
|
||||
}
|
||||
@ -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");
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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///////////////////
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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());
|
||||
|
||||
|
||||
@ -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());
|
||||
|
||||
|
||||
@ -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";
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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){
|
||||
|
||||
@ -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///////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
|
||||
@ -183,6 +183,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
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -330,7 +330,6 @@ public class HostResponse extends BaseResponse {
|
||||
this.hasEnoughCapacity = hasEnoughCapacity;
|
||||
}
|
||||
|
||||
|
||||
public void setSuitableForMigration(Boolean suitableForMigration) {
|
||||
this.suitableForMigration = suitableForMigration;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -74,6 +75,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() {
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
@ -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
@ -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
|
||||
@ -921,7 +931,7 @@ label.security.group.name=Nom du groupe de s\u00E9curit\u00E9
|
||||
label.security.groups=Groupes de s\u00E9curit\u00E9
|
||||
label.security.groups.enabled=Groupes de s\u00E9curit\u00E9 Activ\u00E9s
|
||||
label.select=S\u00E9lectionner
|
||||
label.select-view=S\u00E9lectionner la vue
|
||||
label.select-view=S\u00E9lectionner la vue
|
||||
label.select.a.template=S\u00E9lectionner un mod\u00E8le
|
||||
label.select.a.zone=S\u00E9lectionner une zone
|
||||
label.select.instance=S\u00E9lectionner une instance
|
||||
@ -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
|
||||
|
||||
@ -609,8 +609,9 @@
|
||||
<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">
|
||||
<property name="StoragePoolAllocators" value="#{storagePoolAllocators.Adapters}" />
|
||||
</bean>
|
||||
@ -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>
|
||||
|
||||
@ -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
|
||||
|
||||
@ -253,9 +253,17 @@
|
||||
<!--
|
||||
AffinityGroup Processors
|
||||
-->
|
||||
<bean id="HostAntiAffinityProcessor" class="org.apache.cloudstack.affinity.HostAntiAffinityProcessor">
|
||||
<property name="name" value="HostAntiAffinityProcessor"/>
|
||||
<property name="type" value="host anti-affinity"/>
|
||||
</bean>
|
||||
<bean id="HostAntiAffinityProcessor" class="org.apache.cloudstack.affinity.HostAntiAffinityProcessor">
|
||||
<property name="name" value="HostAntiAffinityProcessor"/>
|
||||
<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>
|
||||
|
||||
@ -355,9 +355,17 @@
|
||||
<!--
|
||||
AffinityGroup Processors
|
||||
-->
|
||||
<bean id="HostAntiAffinityProcessor" class="org.apache.cloudstack.affinity.HostAntiAffinityProcessor">
|
||||
<property name="name" value="HostAntiAffinityProcessor"/>
|
||||
<property name="type" value="host anti-affinity"/>
|
||||
</bean>
|
||||
<bean id="HostAntiAffinityProcessor" class="org.apache.cloudstack.affinity.HostAntiAffinityProcessor">
|
||||
<property name="name" value="HostAntiAffinityProcessor"/>
|
||||
<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>
|
||||
|
||||
@ -218,12 +218,19 @@
|
||||
class="org.apache.cloudstack.region.gslb.GlobalLoadBalancingRulesServiceImpl"/>
|
||||
|
||||
<!--
|
||||
AffinityGroup Processors
|
||||
AffinityGroup Processors
|
||||
-->
|
||||
<bean id="HostAntiAffinityProcessor" class="org.apache.cloudstack.affinity.HostAntiAffinityProcessor">
|
||||
<property name="name" value="HostAntiAffinityProcessor"/>
|
||||
<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>
|
||||
|
||||
@ -64,16 +64,21 @@ 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;
|
||||
|
||||
@ -65,6 +65,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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
@ -92,6 +93,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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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>
|
||||
|
||||
24
docs/en-US/Common_Content/feedback.xml
Normal file
24
docs/en-US/Common_Content/feedback.xml
Normal 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>
|
||||
@ -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>
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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
@ -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>
|
||||
|
||||
@ -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; account’s 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>
|
||||
|
||||
@ -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>
|
||||
|
||||
49
docs/en-US/build-nonoss.xml
Normal file
49
docs/en-US/build-nonoss.xml
Normal 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>
|
||||
107
docs/en-US/changed-API-commands-4.2.xml
Normal file
107
docs/en-US/changed-API-commands-4.2.xml
Normal 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
24
docs/en-US/feedback.xml
Normal 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>
|
||||
@ -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>
|
||||
|
||||
@ -22,71 +22,83 @@
|
||||
under the License.
|
||||
-->
|
||||
<section id="hypervisor-support-for-primarystorage">
|
||||
<title>Hypervisor Support for Primary Storage</title>
|
||||
<para>The following table shows storage options and parameters for different hypervisors.</para>
|
||||
<informaltable>
|
||||
<tgroup cols="5">
|
||||
<colspec colname="c1" colnum="1" colwidth="34%" />
|
||||
<colspec colname="c2" colnum="2" colwidth="16%" />
|
||||
<colspec colname="c3" colnum="3" colwidth="16%"/>
|
||||
<colspec colname="c4" colnum="4" colwidth="17%"/>
|
||||
<colspec colname="c5" colnum="5" colwidth="17%"/>
|
||||
<thead>
|
||||
<row>
|
||||
<entry></entry>
|
||||
<entry><para>VMware vSphere</para></entry>
|
||||
<entry><para>Citrix XenServer</para></entry>
|
||||
<entry><para>KVM</para></entry>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry><para><emphasis role="bold"><emphasis role="bold">Format for Disks, Templates, and
|
||||
Snapshots</emphasis></emphasis></para></entry>
|
||||
<entry><para>VMDK</para></entry>
|
||||
<entry><para>VHD</para></entry>
|
||||
<entry><para>QCOW2</para></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><para><emphasis role="bold">iSCSI support</emphasis></para></entry>
|
||||
<entry><para>VMFS</para></entry>
|
||||
<entry><para>Clustered LVM</para></entry>
|
||||
<entry><para>Yes, via Shared Mountpoint</para></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><para><emphasis role="bold">Fiber Channel support</emphasis></para></entry>
|
||||
<entry><para>VMFS</para></entry>
|
||||
<entry><para>Yes, via Existing SR</para></entry>
|
||||
<entry><para>Yes, via Shared Mountpoint</para></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><para><emphasis role="bold">NFS 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">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>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>
|
||||
</section>
|
||||
<title>Hypervisor Support for Primary Storage</title>
|
||||
<para>The following table shows storage options and parameters for different hypervisors.</para>
|
||||
<informaltable>
|
||||
<tgroup cols="5">
|
||||
<colspec colname="c1" colnum="1" colwidth="34%"/>
|
||||
<colspec colname="c2" colnum="2" colwidth="16%"/>
|
||||
<colspec colname="c3" colnum="3" colwidth="16%"/>
|
||||
<colspec colname="c4" colnum="4" colwidth="17%"/>
|
||||
<colspec colname="c5" colnum="5" colwidth="17%"/>
|
||||
<thead>
|
||||
<row>
|
||||
<entry/>
|
||||
<entry><para>VMware vSphere</para></entry>
|
||||
<entry><para>Citrix XenServer</para></entry>
|
||||
<entry><para>KVM</para></entry>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry><para><emphasis role="bold"><emphasis role="bold">Format for Disks, Templates, and
|
||||
Snapshots</emphasis></emphasis></para></entry>
|
||||
<entry><para>VMDK</para></entry>
|
||||
<entry><para>VHD</para></entry>
|
||||
<entry><para>QCOW2</para></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><para><emphasis role="bold">iSCSI support</emphasis></para></entry>
|
||||
<entry><para>VMFS</para></entry>
|
||||
<entry><para>Clustered LVM</para></entry>
|
||||
<entry><para>Yes, via Shared Mountpoint</para></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><para><emphasis role="bold">Fiber Channel support</emphasis></para></entry>
|
||||
<entry><para>VMFS</para></entry>
|
||||
<entry><para>Yes, via Existing SR</para></entry>
|
||||
<entry><para>Yes, via Shared Mountpoint</para></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><para><emphasis role="bold">NFS 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">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>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>
|
||||
</section>
|
||||
|
||||
BIN
docs/en-US/images/VMSnapshotButton.png
Normal file
BIN
docs/en-US/images/VMSnapshotButton.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 967 B |
BIN
docs/en-US/images/revert-vm.png
Normal file
BIN
docs/en-US/images/revert-vm.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 860 B |
371
docs/en-US/limit-accounts-domains.xml
Normal file
371
docs/en-US/limit-accounts-domains.xml
Normal 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—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— 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>
|
||||
@ -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>
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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
146
docs/en-US/vm-snapshots.xml
Normal 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&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>
|
||||
@ -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 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>
|
||||
<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" />
|
||||
<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 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>
|
||||
<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="limit-accounts-domains.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
|
||||
</chapter>
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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,31 +200,36 @@ 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.
|
||||
|
||||
VMInstanceVO vm = _vmDao.findByUuid(vmEntityVO.getUuid());
|
||||
|
||||
VMReservationVO vmReservation = _reservationDao.findByReservationId(reservationId);
|
||||
long vmId = vmReservation.getVmId();
|
||||
|
||||
VMInstanceVO vm = _vmDao.findById(vmId);
|
||||
//Pass it down
|
||||
Long poolId = null;
|
||||
Map<Long,Long> storage = vmReservation.getVolumeReservation();
|
||||
if(storage != null){
|
||||
List<Long> volIdList = new ArrayList<Long>(storage.keySet());
|
||||
if(volIdList !=null && !volIdList.isEmpty()){
|
||||
poolId = storage.get(volIdList.get(0));
|
||||
if(vmReservation != null){
|
||||
// Pass it down
|
||||
Long poolId = null;
|
||||
Map<Long, Long> storage = vmReservation.getVolumeReservation();
|
||||
if (storage != null) {
|
||||
List<Long> volIdList = new ArrayList<Long>(storage.keySet());
|
||||
if (volIdList != null && !volIdList.isEmpty()) {
|
||||
poolId = storage.get(volIdList.get(0));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
}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);
|
||||
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);
|
||||
} catch (Exception ex) {
|
||||
// Retry the deployment without using the reservation 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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
Loading…
x
Reference in New Issue
Block a user