Compare commits

...

187 Commits

Author SHA1 Message Date
Suresh Kumar Anaparti 420bf6dff8
Merge branch '4.22' 2026-01-22 13:24:08 +05:30
Suresh Kumar Anaparti b1f870ae83
Merge branch '4.20' into 4.22 2026-01-22 13:23:21 +05:30
Wei Zhou 036489b288
CKS: fix resource limitation check on cpu when scale cks cluster (#12379) 2026-01-21 09:59:21 +01:00
dependabot[bot] 1b0a036a5b
Bump ads.version from 2.0.0.AM25 to 2.0.0.AM27 (#12269)
Bumps `ads.version` from 2.0.0.AM25 to 2.0.0.AM27.

Updates `org.apache.directory.server:apacheds-server-integ` from 2.0.0.AM25 to 2.0.0.AM27
- [Commits](https://github.com/apache/directory-server/compare/2.0.0.AM25...2.0.0.AM27)

Updates `org.apache.directory.server:apacheds-core-constants` from 2.0.0.AM25 to 2.0.0.AM27
- [Commits](https://github.com/apache/directory-server/compare/2.0.0.AM25...2.0.0.AM27)

Updates `org.apache.directory.server:apacheds-core-annotations` from 2.0.0.AM25 to 2.0.0.AM27
- [Commits](https://github.com/apache/directory-server/compare/2.0.0.AM25...2.0.0.AM27)

Updates `org.apache.directory.server:apacheds-core` from 2.0.0.AM25 to 2.0.0.AM27
- [Commits](https://github.com/apache/directory-server/compare/2.0.0.AM25...2.0.0.AM27)

Updates `org.apache.directory.server:apacheds-protocol-ldap` from 2.0.0.AM25 to 2.0.0.AM27
- [Commits](https://github.com/apache/directory-server/compare/2.0.0.AM25...2.0.0.AM27)

Updates `org.apache.directory.server:apacheds-jdbm-partition` from 2.0.0.AM25 to 2.0.0.AM27
- [Commits](https://github.com/apache/directory-server/compare/2.0.0.AM25...2.0.0.AM27)

Updates `org.apache.directory.server:apacheds-ldif-partition` from 2.0.0.AM25 to 2.0.0.AM27
- [Commits](https://github.com/apache/directory-server/compare/2.0.0.AM25...2.0.0.AM27)

---
updated-dependencies:
- dependency-name: org.apache.directory.server:apacheds-server-integ
  dependency-version: 2.0.0.AM27
  dependency-type: direct:development
  update-type: version-update:semver-patch
- dependency-name: org.apache.directory.server:apacheds-core-constants
  dependency-version: 2.0.0.AM27
  dependency-type: direct:development
  update-type: version-update:semver-patch
- dependency-name: org.apache.directory.server:apacheds-core-annotations
  dependency-version: 2.0.0.AM27
  dependency-type: direct:development
  update-type: version-update:semver-patch
- dependency-name: org.apache.directory.server:apacheds-core
  dependency-version: 2.0.0.AM27
  dependency-type: direct:development
  update-type: version-update:semver-patch
- dependency-name: org.apache.directory.server:apacheds-protocol-ldap
  dependency-version: 2.0.0.AM27
  dependency-type: direct:development
  update-type: version-update:semver-patch
- dependency-name: org.apache.directory.server:apacheds-jdbm-partition
  dependency-version: 2.0.0.AM27
  dependency-type: direct:development
  update-type: version-update:semver-patch
- dependency-name: org.apache.directory.server:apacheds-ldif-partition
  dependency-version: 2.0.0.AM27
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-21 12:07:23 +05:30
dependabot[bot] e2f4ed9dcf
Bump commons-codec:commons-codec from 1.15 to 1.20.0 (#12303)
Bumps [commons-codec:commons-codec](https://github.com/apache/commons-codec) from 1.15 to 1.20.0.
- [Changelog](https://github.com/apache/commons-codec/blob/master/RELEASE-NOTES.txt)
- [Commits](https://github.com/apache/commons-codec/compare/rel/commons-codec-1.15...rel/commons-codec-1.20.0)

---
updated-dependencies:
- dependency-name: commons-codec:commons-codec
  dependency-version: 1.20.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-21 12:06:44 +05:30
Suresh Kumar Anaparti 8db7cab7ba
Storage pool monitor disconnect improvements (#12398) 2026-01-20 09:08:39 +01:00
Nicolas Vazquez 496bc0329c
Fix: Condition for aborting migration, resume paused VMs on destination (#12331) 2026-01-20 08:56:32 +01:00
Abhisar Sinha cf36fb0000
Set nfsVersion in ssvm agent.properties only if it is not null (#12445) 2026-01-20 08:25:16 +01:00
Daman Arora da518e9036
CKS: Add image store validation for Kubernetes version registration (#12418)
Co-authored-by: Daman Arora <daman.arora@shapeblue.com>
2026-01-20 08:13:15 +01:00
Henrique Sato 03d24ff851
Fix NPE on primary storage delete (#11817) 2026-01-20 08:12:16 +01:00
Vitor Hugo Homem Marzarotto 2a6ce0c8a8
Adds url kubernetes iso (#10862)
Co-authored-by: Vitor Hugo Homem Marzarotto <vitor.marzarotto@scclouds.com.br>
Co-authored-by: Henrique Sato <henriquesato2003@gmail.com>
2026-01-20 08:10:42 +01:00
Suresh Kumar Anaparti 04b58acdd6
Merge branch '4.22' 2026-01-19 19:50:51 +05:30
Suresh Kumar Anaparti 3828a3b744
Merge branch '4.20' into 4.22 2026-01-19 19:50:10 +05:30
Manoj Kumar 42f1e19362
Mask vncPasswd being logged in agent.log (#12404) 2026-01-19 14:20:18 +01:00
Pearl Dsilva 8b2f1f19c2
Support dedicating backup offerings to domains (#12194)
* Add support for dedicating backup offerings to domains

* Add tests and UI support and update response params

* add license header

* exclude backupofferingdetailsvo from sonar

* fix pre-commit checks - missing / extra EOF line

* add test

* EOF

* filter backup offerings by domain id

* add unit tests

* add more unit tests and remove response file from code coverage check

* update checks

* address review comments: extract common code, fix tests

* added bean definition

* address comments

* add unit tests to increase coverage

* pre-commit check failure fix

* address merge issue

* allow updating backup offering when only domain id is modified
2026-01-19 14:21:47 +05:30
Abhishek Kumar a4b1a27c7d
ui: fix 404 on login after forgot password (#12448)
Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com>
2026-01-19 08:50:07 +01:00
Abhisar Sinha 002d9768b2
Add settings to mark cryptographic algorithms in vpn customer gateways as excluded or obsolete (#12193)
This PR introduces several configuration settings using which an operator can mark certain cryptographic algorithms and parameters as excluded or obsolete for VPN Customer Gateway creation for Site-to-Site VPN.

Cloud providers following modern security frameworks (e.g., ISO 27001/27017) are required to enforce and communicate approved cryptographic standards. CloudStack currently accepts several weak or deprecated algorithms without guidance to users. This PR closes that gap by giving operators explicit control over what is disallowed vs discouraged, improving security posture without breaking existing deployments.

These settings are:

1. vpn.customer.gateway.excluded.encryption.algorithms
2. vpn.customer.gateway.excluded.hashing.algorithms
3. vpn.customer.gateway.excluded.ike.versions
4. vpn.customer.gateway.excluded.dh.group
5. vpn.customer.gateway.obsolete.encryption.algorithms
6. vpn.customer.gateway.obsolete.hashing.algorithms
7. vpn.customer.gateway.obsolete.ike.versions
8. vpn.customer.gateway.obsolete.dh.group
2026-01-19 13:18:37 +05:30
Abhishek Kumar 76e6de7f90
ui: fix form data double fetch/reset form data by ownership selection (#11705)
* ui: fix form data double fetch/reset form data by ownership selection

Fixes #10832
2026-01-16 10:48:57 -05:00
Wei Zhou b31c2f4cae
Revert "Review comment on pull request #12436"
This reverts commit a566af35f5.
2026-01-15 19:17:12 +01:00
Wei Zhou a566af35f5 Review comment on pull request #12436 2026-01-15 19:14:51 +01:00
Suresh Kumar Anaparti f1f779a08d
Cleanup snapshot files in datastores for Error-ed snapshots, and some code improvements (#12347) 2026-01-15 12:12:32 +01:00
Nicolas Vazquez aba3285c3c
[Usage] Include accounts uuid on the cloud_usage accounts initial saving (#12420) 2026-01-15 06:50:35 -03:00
Suresh Kumar Anaparti 507c4cd128
Merge branch '4.22' 2026-01-15 10:09:09 +05:30
Suresh Kumar Anaparti b5fd39fca0
Merge branch '4.20' into 4.22 2026-01-15 10:08:27 +05:30
Abhisar Sinha 5c1f9315ce
Remove transaction from updateCapacityForHost cal (#12421) 2026-01-14 16:12:42 +01:00
Suresh Kumar Anaparti 6a324da27a
MAC address assignment improvements (#12349) 2026-01-13 13:56:39 +01:00
Vishesh b8ed34e2a8
Reset modifier button's state (#12187) 2026-01-13 13:48:55 +01:00
Abhisar Sinha 9e86fdf1b6
Fix cloud-sysvmadmin hang (#12355) 2026-01-13 09:06:25 +01:00
Abhishek Kumar 538578366a Merge remote-tracking branch 'apache/4.22' 2026-01-13 11:49:07 +05:30
Abhishek Kumar 031fbf43d4 Merge remote-tracking branch 'apache/4.20' into 4.22 2026-01-13 11:48:05 +05:30
Abhishek Kumar 8627c60b95
ui: option to migrate vm with volumes to same pool (#11703)
Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com>
2026-01-12 14:27:04 +01:00
Suresh Kumar Anaparti b8813c7b24
UI: Add info for 'Use primary storage replication' in snapshot view(s) (#11943) 2026-01-12 16:50:15 +05:30
Rene Peinthor 8dcfc7c767
Linstor fix host picking (#12047) 2026-01-12 11:29:31 +01:00
Suresh Kumar Anaparti 2b373a4659
[UI] Fix primary storage details display when the uuid has divergent pattern (#12307)
* [UI] Fix primary storage details display when the uuid has different pattern (eg. for pools with SolidFireShared provider)

* Fix on refresh

---------

Co-authored-by: vishesh92 <vishesh92@gmail.com>
2026-01-12 14:18:35 +05:30
Abhisar Sinha c7cfeb5caa
fix location constraint ceph error (#12285) 2026-01-12 09:13:12 +01:00
Abhishek Kumar 0e6d2d986b
ui: prevent calling listConfigurations when not allowed (#11704)
By default, normal users won't have access to listConfigurations API,
therefore, UI should not call it when access is not there.

Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com>
2026-01-12 13:23:37 +05:30
Suresh Kumar Anaparti db1c7d678c
Updated protobuf version to 3.25.5, and protobuf & jackson maven dependencies (#12389) 2026-01-12 08:21:19 +01:00
Erik Böck 2358632253
Fixed User type accounts being able to change resource limits of their own domain and account (#12046)
Co-authored-by: Lucas Martins <56271185+lucas-a-martins@users.noreply.github.com>
2026-01-12 08:20:31 +01:00
Suresh Kumar Anaparti 2399edd380
[UI] Fix for the login url with nested redirect parameters (#12356) 2026-01-12 12:11:45 +05:30
Nicolas Vazquez 04875f1517
Improve logs for VM migrations (#12332) 2026-01-09 17:50:27 +01:00
Daan Hoogland 2811217578 Merge branch '4.22' 2026-01-09 15:00:05 +01:00
Daan Hoogland e25cf437c0 Merge branch '4.20' into 4.22 2026-01-09 14:28:12 +01:00
Abhishek Kumar ef1aaa0551
kvm: allow skip forcing disk controller (#11750) 2026-01-09 13:56:39 +01:00
Abhisar Sinha c91e84c6d8
Avoid double counting primary storage allocated capacity for storage pools having a parent (#12181) 2026-01-09 13:30:24 +01:00
Nicolas Vazquez 9a38e75abd
Fix Linstor shrink qcow2 volumes (#12387) 2026-01-09 09:48:04 +01:00
Suyang(Dawson) Chen 1b861dad48
Cleanup: Standardize logger message formatting in ApiServer.java (#11188) 2026-01-09 09:30:17 +01:00
Erik Böck 1ef6365771
Change internal ID to UUID in user disable event (#11824) 2026-01-09 09:23:46 +01:00
Bernardo De Marco Gonçalves bc3d7c314b
Change the `value` parameter of the `updateConfiguration` API to be required (#10790) 2026-01-09 09:17:44 +01:00
Tonitzpp bc76f2042d
Change migration volume exception messages (#12367)
Co-authored-by: toni.zamparetti <toni.zamparetti@scclouds.com.br>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-01-08 13:55:34 +01:00
John Bampton fd1c67f473
Standardize and auto add license headers to properties files (#12231) 2026-01-08 15:56:40 +05:30
John Bampton e47d7bc6ff
[CI] Dependabot: add a cooldown period for new releases (#12384) 2026-01-07 17:22:52 +01:00
Abhishek Kumar eedd32971f
Merge remote-tracking branch 'apache/4.22' 2026-01-07 13:11:55 +05:30
Abhishek Kumar 425c4e3312
Merge remote-tracking branch 'apache/4.20' into 4.22 2026-01-07 13:10:41 +05:30
Pearl Dsilva 750290b8ae
Prevent NPE when removing NIC from a stopped VM using service offering with CPU cap set (#12232)
This PR fixes: #12225

---------

Co-authored-by: Abhisar Sinha <63767682+abh1sar@users.noreply.github.com>
2026-01-07 11:39:15 +05:30
Manoj Kumar 57331aca2f
Skip removal of offerings if in use during domain removal (#11780)
This PR fixes #11502

    - Prevent service offering update to specific domains if any instance for the offering are outside of those
    - Removal of offerings is skipped if it is in use by any Instance.
2026-01-07 09:25:11 +05:30
dahn c465caf81e
Adjust close periods (#12376) 2026-01-06 12:47:37 +05:30
Suresh Kumar Anaparti 2d4b7ba357
Add mountopts to backup repository response (#12360) 2026-01-06 12:08:18 +05:30
Suresh Kumar Anaparti a29de0ed06
Retry cloneVM task when any file access issue while cloning from volume or template (#12335) 2026-01-05 16:30:39 +01:00
YoulongChen fca928d609
fix HMAC Signatures and API Keys Logged in Plaintext (#12021)
Co-authored-by: chenyoulong20g@ict.ac.cn <chenyoulong20g@ict.ac.cn>
Co-authored-by: dahn <daan.hoogland@gmail.com>
2026-01-05 13:28:48 +01:00
Suresh Kumar Anaparti 4628385051
Merge branch '4.22' 2026-01-05 16:17:50 +05:30
Suresh Kumar Anaparti 959c5fff68
Merge branch '4.20' into 4.22 2026-01-05 15:57:26 +05:30
Abhishek Kumar cd55796972
webhook: fixes, filter enhancement (#12023)
Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com>
2026-01-05 09:12:06 +01:00
Tonitzpp 81b991ae9c
Show volume UUIDs in the backup details page (#12156)
Co-authored-by: toni.zamparetti <toni.zamparetti@scclouds.com.br>
2026-01-05 09:07:19 +01:00
Manoj Kumar ca64406a88
replace momentjs with dayjs and use watch instead of update (#12351) 2026-01-05 08:19:03 +01:00
YoulongChen 77cb0827d3
Refactor XML parsing to use safer document builders in multiple classes (#12129)
Co-authored-by: chenyoulong20g@ict.ac.cn <chenyoulong20g@ict.ac.cn>
2026-01-05 07:58:34 +01:00
Suresh Kumar Anaparti 4f74937855
Event typo fix (#12350) 2026-01-02 14:04:59 +05:30
Rene Peinthor 10dcbd76f0
linstor: Provide /dev/drbd/by-res/ resource paths to CloudStack (#12300) 2025-12-31 10:55:54 +01:00
Pearl Dsilva 7ff76cb2d7
Protect upgrades from failures (#12319) 2025-12-30 21:46:04 +01:00
Pearl Dsilva 7a11bd2f98
CKS: Fix issue with scaling down CKS Nodes when deployed in HA mode (#12302) 2025-12-30 13:08:13 +01:00
Abhishek Kumar 5cb279b6f1
ui: fix test delivery params in create webhook form (#12318)
Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com>
2025-12-30 11:07:32 +01:00
Tonitzpp 46cb805c90
Removal of internal ID in backup event descriptions (#12197) 2025-12-30 09:37:09 +01:00
Suresh Kumar Anaparti 40d21f093f
Merge branch '4.22' 2025-12-29 13:37:12 +05:30
Suresh Kumar Anaparti 6a2d91ed8a
Merge branch '4.20' into 4.22 2025-12-29 13:21:17 +05:30
Suresh Kumar Anaparti 56a39e6be7
Add 'dataDiskController' VM setting/detail for KVM hypervisor (#12334) 2025-12-28 11:20:45 +01:00
Abhishek Kumar 34b8870f59
systemvm-template: support on-demand download during setup and registration (#11656)
Bundling all hypervisor SystemVM templates in release packages simplifies installs but inflates build time and artifact size. This change enables downloading templates on demand when they’re not found after package installation. The download path is wired into both cloud-setup-management and the existing SystemVM template registration flow.

For connected or mirrored environments, a repository URL prefix can be provided to support air-gapped setups: pass --systemvm-templates-repository <URL-prefix> to cloud-setup-management, or set system.vm.templates.download.repository=<URL-prefix> in server.properties for post-setup registration.

If templates are already present (bundled or preseeded), behavior is unchanged and no download is attempted.

---------

Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com>
2025-12-26 11:36:32 +05:30
Abhishek Kumar 432a3065bc
api: fix response annotation for createBackupSchedule (#11950)
Currently, `createBackupSchedule` API documentation wrongly specifies
BackupResponse as the API response.

Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com>
2025-12-24 16:20:40 +01:00
argusb 5bf869c803
Replace deprecated 'egrep' commands with 'grep -E'. (#12306)
Co-authored-by: Sander Grendelman <sander.grendelman@axians.com>
2025-12-22 14:27:41 +01:00
Manoj Kumar e0c13cc3ec
Cleanup userconcentratedpod_random and userconcentratedpod_firstfit allocation algorithms (#12233)
* Cleanup userconcentratedpod_random and userconcentratedpod_firstfit allocation algorithm

* use firstfit instead of random for userconcentratedpod_firstfit
2025-12-22 14:25:33 +01:00
Daan Hoogland 22da57f922 Merge branch '4.22' 2025-12-22 14:13:50 +01:00
Daan Hoogland 55ab7c5589 Merge branch '4.20' into 4.22 2025-12-22 13:23:37 +01:00
vladimirpetrov b394b5ba74
Fix terms, typos and grammar mistakes in the API, error messages, events, etc. (#7857)
This PR aligns the use of terminology, renaming VM / virtual machine references to 'Instance' and also capitalising the terms Templates, Network, Snapshot, User, Account in CloudStack APIs, error and log messages, events, tooltips, etc. Many typos, grammar and spelling mistakes were fixed, also terms like IPv4, VPN, VPC, etc. were properly capitalised. Some error messages were cleaned for better readability. The test cases, expecting some exception strings were adjusted accordingly.

Here is the wiki page, describing the changes in details:
https://cwiki.apache.org/confluence/display/CLOUDSTACK/Object+Naming+and+Title+Case+Convention

---------

Co-authored-by: Manoj Kumar <manojkr.itbhu@gmail.com>
Co-authored-by: Harikrishna <harikrishna.patnala@gmail.com>
2025-12-22 15:18:58 +05:30
Daan Hoogland e2d3773362 Merge release branch 4.22 to main
* 4.22:
  Update templateConfig.sh to not break with directorys with space on t… (#10898)
  Fix VM and volume metrics listing regressions (#12284)
  packaging: use latest cmk release link directly (#11429)
  api:rename RegisterCmd.java => RegisterUserKeyCmd.java (#12259)
  Prioritize copying templates from other secondary storages instead of downloading them (#10363)
  Show time correctly in the backup schedule UI  (#12012)
  kvm: use preallocation option for fat disk resize (#11986)
  Python exception processing static routes fixed (#11967)
  KVM memballooning requires free page reporting and autodeflate (#11932)
  api: create/register/upload template with empty template tag (#12234)
2025-12-22 10:29:24 +01:00
Daan Hoogland cee330e7c8 Merge branch '4.20' into 4.22 2025-12-22 10:27:57 +01:00
Vitor Hugo Homem Marzarotto 47a6ac89ba
Update templateConfig.sh to not break with directorys with space on t… (#10898)
Co-authored-by: Vitor Hugo Homem Marzarotto <vitor.marzarotto@scclouds.com.br>
Co-authored-by: Henrique Sato <henriquesato2003@gmail.com>
Co-authored-by: Wei Zhou <weizhou@apache.org>
2025-12-21 10:22:39 +01:00
Fabricio Duarte 061ce9b39b
Fix VM and volume metrics listing regressions (#12284) 2025-12-20 10:40:26 +01:00
Abhishek Kumar 79ab1566b1
packaging: use latest cmk release link directly (#11429)
Instead listing all GIthub releases first and finding the latest one use
the direct link for the latest Github release.

Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com>
2025-12-19 20:41:00 +01:00
dependabot[bot] eb93f0105e
Bump com.zaxxer:HikariCP from 5.1.0 to 7.0.2 (#12266)
Bumps [com.zaxxer:HikariCP](https://github.com/brettwooldridge/HikariCP) from 5.1.0 to 7.0.2.
- [Changelog](https://github.com/brettwooldridge/HikariCP/blob/dev/CHANGES)
- [Commits](https://github.com/brettwooldridge/HikariCP/compare/HikariCP-5.1.0...HikariCP-7.0.2)

---
updated-dependencies:
- dependency-name: com.zaxxer:HikariCP
  dependency-version: 7.0.2
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Abhishek Kumar <abhishek.mrt22@gmail.com>
2025-12-19 15:07:29 +05:30
K Viddya 558232e8e6
Feature s390x multiarch support (#12214)
Signed-off-by: Niyam Siwach <niyam@ibm.com>
Signed-off-by: Viddya K <viddya.k@ibm.com>
Co-authored-by: root <root@c32379v1.fyre.ibm.com>
2025-12-19 10:06:58 +01:00
Klaus de Freitas Dornsbach 13f805fbf3
Log4j2 refactor cloud api module (#8728) 2025-12-19 14:15:56 +05:30
Wei Zhou 8936e4c535
api:rename RegisterCmd.java => RegisterUserKeyCmd.java (#12259) 2025-12-18 11:53:00 +01:00
Phsm Qwerty bb5da0e49c
security groups: conntrack only if needed (#10594)
The conntrack is disabled if the security group allows all traffic.
Also, refactored the code a little.
2025-12-18 11:49:41 +01:00
dependabot[bot] 28820f6e25
Bump org.influxdb:influxdb-java from 2.22 to 2.25 (#12270)
Bumps [org.influxdb:influxdb-java](https://github.com/influxdata/influxdb-java) from 2.22 to 2.25.
- [Release notes](https://github.com/influxdata/influxdb-java/releases)
- [Changelog](https://github.com/influxdata/influxdb-java/blob/master/CHANGELOG.md)
- [Commits](https://github.com/influxdata/influxdb-java/compare/influxdb-java-2.22...influxdb-java-2.25)

---
updated-dependencies:
- dependency-name: org.influxdb:influxdb-java
  dependency-version: '2.25'
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-12-18 11:10:52 +01:00
dahn 91376c7994
cleanup LDAP code according to warnings (#11436)
Co-authored-by: Daan Hoogland <dahn@apache.org>
Co-authored-by: Pearl Dsilva <pearl1594@gmail.com>
2025-12-18 11:09:09 +01:00
John Bampton e21aacf5be
Bump `actions/cache` to `v5` (#12247) 2025-12-18 10:53:57 +01:00
Fabricio Duarte e8200a0b74
Prioritize copying templates from other secondary storages instead of downloading them (#10363)
* Prioritize copying templates from other secondary storages instead of downloading them

* Treat some corner cases
2025-12-18 15:23:27 +05:30
Abhisar Sinha e9900aba23
Show time correctly in the backup schedule UI (#12012) 2025-12-17 14:47:28 +01:00
dependabot[bot] 10d76d3384
Bump cs.aws.sdk.version from 1.12.439 to 1.12.795 (#12267) 2025-12-17 13:51:52 +01:00
Vishesh 2ac2e5ba33
Github Action: Add action to auto close issues/PRs after a certain time (#8667)
Co-authored-by: dahn <daan.hoogland@gmail.com>
Co-authored-by: Jonathan de Jong <jonathandejong02@gmail.com>
2025-12-17 13:10:17 +01:00
dahn 124fcde59c
unlink an ldap domain (#11962)
Co-authored-by: Daan Hoogland <dahn@apache.org>
Co-authored-by: Abhishek Kumar <abhishek.mrt22@gmail.com>
Co-authored-by: Suresh Kumar Anaparti <sureshkumar.anaparti@gmail.com>
2025-12-17 13:04:06 +01:00
Abhishek Kumar e08e66d66d
kvm: use preallocation option for fat disk resize (#11986)
Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com>
2025-12-17 13:03:39 +01:00
Brad House de1b1d24c2
Python exception processing static routes fixed (#11967) 2025-12-16 20:07:22 +01:00
Brad House d5165183ea
KVM memballooning requires free page reporting and autodeflate (#11932) 2025-12-16 16:58:32 +01:00
Wei Zhou ba26d95ad7
api: create/register/upload template with empty template tag (#12234) 2025-12-16 15:48:06 +01:00
John Bampton 53a39d3ff7
.github: Move `dependabot.yml` to the correct directory (#12243)
The `dependabot.yml` configuration file should be placed in the `.github` directory at the root of your repository.

Dependabot will not work if the file is placed in any other directory

Minor file extension rename for standardization
2025-12-16 14:11:04 +01:00
Daan Hoogland f06ac512fa merge forward 4.22 to main 2025-12-16 11:50:58 +01:00
Daan Hoogland 7aba434dc4 merge forward 4.20 to 4.22 LTS 2025-12-16 11:19:04 +01:00
Abhishek Kumar da1c7cebf9
server: trim autoscale Windows VM hostname (#11327)
Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com>
Co-authored-by: Wei Zhou <weizhou@apache.org>
2025-12-15 15:52:32 +01:00
Abhishek Kumar 39d0d62fdd
api,server: normalize string empty value on config update (#11770)
Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com>
2025-12-15 15:43:00 +01:00
dahn f570e16836
.github: initial version of Code Owners (#12253)
* initial version of Code Owners

* Update .github/CODEOWNERS

---------

Co-authored-by: Daan Hoogland <dahn@apache.org>
Co-authored-by: John Bampton <jbampton@users.noreply.github.com>
2025-12-15 11:04:45 +01:00
John Bampton 1919dcfb7c
pre-commit trailing-whitespace cleanup LICENSE/NOTICE (#12242) 2025-12-15 10:09:11 +01:00
Suresh Kumar Anaparti 67217d4d2e
UI: Option to choose the isolation method when creating the public IP range (#12000) 2025-12-15 09:37:18 +01:00
dahn 494c56a499
check for active MSses before starting DB upgrade (#12140) 2025-12-12 15:09:35 +01:00
Pearl Dsilva 0a13fb27f5
Prevent scaling of cluster if count / resources exceed account resource limits (#12167) 2025-12-12 13:57:15 +01:00
Abhishek Kumar e1c48c3adc
server,ui: prevent role change for default accounts (#11761)
* server,ui: prevent role change for default accounts

Fixes #10931

Role for default accounts shouldn't be changed. Appropriate error should be returned by the server and UI should not present option for them.

Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com>

* Update server/src/main/java/com/cloud/user/AccountManagerImpl.java

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-12 13:42:26 +01:00
John Bampton f417c6b0a1
yamllint use `extends: default` (#12066) 2025-12-11 17:59:45 +01:00
John Bampton 78f9e6584b
UI(vue) + extras: fix bugs/spelling and standardize (#12073) 2025-12-11 16:41:50 +01:00
dahn 79ebf6959e
refactor storapool automation (#11789)
Co-authored-by: Daan Hoogland <dahn@apache.org>
2025-12-11 09:04:23 +01:00
John Bampton cfe96026dc
Standardize and auto add license headers to all Vue files with pre-commit (#12081) 2025-12-10 16:21:41 +01:00
Vishesh 4348386970
Optimize drs plan generation (#12014) 2025-12-10 13:24:39 +01:00
Abhishek Kumar ba52db9b3e
ui: allow macaddress input for add nic to vm (#12145)
Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com>
2025-12-09 15:20:01 +01:00
Manoj Kumar 951649c420
Support iprange while creating remote access vpn (#12063) 2025-12-09 11:56:16 +01:00
Pearl Dsilva 3c6484792d
UI: Create Account form to set proper domain and role based on route (#12200) 2025-12-09 10:56:04 +01:00
dahn 223fc2512c
Enhance NFS mount option check for empty response (#11839) 2025-12-09 10:51:42 +01:00
dahn 51910cd260
Add license information to dependabot.yaml
Added Apache License information to dependabot.yaml
2025-12-08 16:48:18 +01:00
dahn 5151f8dc6a
java dependabot file (#11409)
Co-authored-by: Daan Hoogland <dahn@apache.org>
2025-12-08 16:33:10 +01:00
dahn c81295439f
removed code in comments (#11145) 2025-12-08 16:31:48 +01:00
Lucas Martins 12f4321952
Changes error message when using invalid `endpoint.url` (#8603)
Co-authored-by: lucas.martins.scclouds <lucas.martins@scclouds.com.br>
Co-authored-by: Daniel Augusto Veronezi Salvador <38945620+GutoVeronezi@users.noreply.github.com>
Co-authored-by: erikbocks <erik.bock@outlook.com>
2025-12-08 09:41:56 +01:00
Suresh Kumar Anaparti b0d74fe00c
Merge branch '4.22' 2025-12-05 18:59:03 +05:30
Suresh Kumar Anaparti a0ba2aaf3f
Merge branch '4.20' into 4.22 2025-12-05 18:41:18 +05:30
Abhisar Sinha 4379666fb6
Proxmox Extension : Make settings such as storage, disk_size,... (#12174)
Make storage, disk-size and os-type configurable in the Proxmox extension

Doc PR: apache/cloudstack-documentation#601

---------

Co-authored-by: dahn <daan.hoogland@gmail.com>
2025-12-03 17:05:22 +05:30
Suresh Kumar Anaparti e4414d1c44
Fix agent wait before reconnect (#12153) 2025-12-03 11:19:47 +05:30
Abhishek Kumar 26009659f9
Merge remote-tracking branch 'apache/4.22' 2025-12-01 13:07:45 +05:30
Abhishek Kumar 2941b518ba
Merge remote-tracking branch 'apache/4.20' into 4.22 2025-12-01 13:05:08 +05:30
dahn f3a112fd9e
use upstream method for creating enums from strings (#12158)
Co-authored-by: Daan Hoogland <dahn@apache.org>
2025-12-01 08:33:14 +01:00
Abhishek Kumar 243f566a60
refactor: add null check for BroadcastDomainType retrievals (#11572)
Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com>
2025-12-01 08:19:09 +01:00
Wei Zhou 516012a0b4
ceph: fix offline volume migration between ceph pools (#12103) 2025-11-28 15:44:00 +01:00
Abhishek Kumar 44119cf34f
ui: fix dsiple managementservermetricsresponse - agentcount (#12148)
Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com>
2025-11-28 10:29:18 +01:00
John Bampton db6147060b
Rename PRE-COMMIT.md to PRE_COMMIT.md and fix link (#12157) 2025-11-28 10:01:38 +01:00
Abhishek Kumar f379d78963
ui: fix section search filter (#12146)
Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com>
2025-11-28 09:29:10 +01:00
Harikrishna 5798fb43a3
Fix upgrade files (#12155) 2025-11-27 15:56:26 +01:00
Daan Hoogland 4e61ddd1bc import 2025-11-26 13:01:52 +01:00
Daan Hoogland 9032fe3fb5 merge LTS branch 4.22 into main 2025-11-26 11:55:50 +01:00
Daan Hoogland e23c7ef701 Merge release branch 4.20 to 4.22
* 4.20:
  fixed Password Exposure in IPMI Tool Command Execution (#12028)
  server: fix volume offering not updated after offering change (#12003)
  fix API Request Parameters Logged Credential Masking in ApiServer (#12020)
2025-11-26 11:31:27 +01:00
Abhisar Sinha e33f4754f5
Fix DB upgrade script for 4.22 (#12111) 2025-11-26 09:25:41 +01:00
Abhishek Kumar 9ec8cc4186
api,server,ui: improve listing public ip for associate (#11591)
Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com>
2025-11-26 09:24:12 +01:00
João Jandre 8171d9568c
Block use of internal and external snapshots on KVM (#11039) 2025-11-24 11:39:19 +01:00
Wei Zhou dba889ea3e
UI: fix list of zones if zone has icon (#12083) 2025-11-24 11:10:43 +01:00
John Bampton 6dc259c7da
Rename and standardize issue templates to `.yml` (#12082) 2025-11-14 21:22:12 +01:00
John Bampton 39126a4339
Standardize and auto add license headers for Shell files with pre-commit (#12070)
* Add shebang to shell scripts
2025-11-14 14:23:41 +01:00
John Bampton aa18188d30
pre-commit: auto add license headers for all YAML files (#12069)
Fix and standardize one license header
2025-11-14 14:23:03 +01:00
John Bampton 4ed86a2627
pre-commit upgrade codespell; fix spelling; (#10144) 2025-11-14 14:17:10 +01:00
John Bampton 86ae1fee7f
Standardize and auto add license headers for SQL files with pre-commit (#12071) 2025-11-14 11:47:27 +01:00
Abhishek Kumar 21d844ba1c
ui: fix zone options for image instance deploy button (#12060)
Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com>
2025-11-14 10:43:42 +01:00
John Bampton ac3b18095a
pre-commit use colored text in the CI for `pass / fail / skipped` (#11977) 2025-11-13 15:59:07 +05:30
John Bampton fff4cafdca
ui(locales): remove duplicates and fix typos (#11872) 2025-11-13 11:17:02 +01:00
John Bampton a5b455ff3a
pre-commit: auto add table of contents with `doctoc` (#11679)
https://github.com/thlorenz/doctoc?tab=readme-ov-file#usage-as-a-git-hook
https://github.com/thlorenz/doctoc/releases/tag/v2.2.0

Generates table of contents for Markdown files inside local git repository.

Links are compatible with anchors generated by github or other sites.

Added TOC to 3 Markdown files.

Never have to create a TOC again just run: `pre-commit run doctoc --all-files`

- CONTRIBUTING.md
- INSTALL.md
- README.md

So both Apache Airflow and Apache Sedona use `doctoc`:

eb4a8bc03c/.pre-commit-config.yaml (L32)
b0d86fda01/.pre-commit-config.yaml (L34)
2025-11-13 11:13:19 +01:00
John Bampton 8b034dc439
chore: rename workflow `linter.yml` to `pre-commit.yml` (#11647) 2025-11-13 15:22:49 +05:30
YoulongChen 028dd86945
fixed Password Exposure in IPMI Tool Command Execution (#12028) 2025-11-13 13:40:36 +05:30
Abhishek Kumar dc8f465527
engine-schema: upgrade path for 4.23.0 (#12048)
Adds a 4.22.0 to 4.23.0 upgrade path.

Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com>
2025-11-13 08:51:08 +01:00
dahn e90e31d386
add isPerson check to query for AD (#11843) 2025-11-12 16:09:28 +01:00
Madhukar Mishra f985a67f4d
Fixes:#7837: Add isolationMethods and vlan to TrafficTypeResponse (#8151)
Co-authored-by: dahn <daan.hoogland@gmail.com>
Co-authored-by: dahn <daan@onecht.net>
2025-11-12 15:49:52 +01:00
dahn 5f9e131198
Svgs (#12051) 2025-11-12 14:31:36 +05:30
Abhishek Kumar f0a0936675
server: fix volume offering not updated after offering change (#12003)
Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com>
2025-11-12 09:51:51 +01:00
Abhisar Sinha 671d8ad704
Track volume usage data at a vm granularity as well (#11531)
Co-authored-by: Vishesh <8760112+vishesh92@users.noreply.github.com>
2025-11-12 09:32:01 +01:00
YoulongChen 81787b310e
fix API Request Parameters Logged Credential Masking in ApiServer (#12020) 2025-11-12 13:06:19 +05:30
Erik Böck 23fb0e2ccb
Update GUI Kubernetes logo (#11895) 2025-11-11 18:13:00 +01:00
Davi Torres 40c8bc528d
Keeping consistency with other error messages. (#11649)
Co-authored-by: Davi Torres <dtorres@simnet.ca>
Co-authored-by: dahn <daan.hoogland@gmail.com>
2025-11-11 15:33:07 +01:00
Pearl Dsilva 15439ede7d
UI: Update and reset domain level configuration (#11571) 2025-11-11 09:29:54 +01:00
Wei Zhou 50fe265017
Merge remote-tracking branch 'apache/4.20' into 4.22 2025-11-07 17:19:53 +01:00
Wei Zhou d26122bf22
Veeam: use pre-defined object mapper (#10715) 2025-11-07 16:13:10 +01:00
Suresh Kumar Anaparti 2dd1e6d786
Enable UEFI on KVM hosts (by default), and configure with some default settings (#11740) 2025-11-07 14:54:02 +01:00
Phsm Qwerty 8c86f24261
enhancement: add instance info as Libvirt metadata (#11061) 2025-11-07 14:31:34 +01:00
Wei Zhou 2954e96947
Veeam: get templateId from vm instance if vm is created from ISO (#10705) 2025-11-07 11:55:27 +01:00
Manoj Kumar c5c3cc40c1
consider Instance in Starting state for listPodsByUserConcentration (#11845) 2025-11-07 10:43:46 +01:00
Suresh Kumar Anaparti 9c0efb7072
DB setup: support db schema creation (with --schema-only) without force recreate option (#12004) 2025-11-07 09:37:11 +01:00
Suresh Kumar Anaparti b8ec941ec1
uefi property typo (#11929) 2025-11-07 09:31:11 +01:00
Wei Zhou 8230f04a79
CKS: update cloud.kubernetes.cluster.network.offering to dynamic (#11847) 2025-11-06 11:13:53 +01:00
Pearl Dsilva a50de029bf
Add empty Provider value in Network/VPC Offering form (#11982) 2025-11-06 11:09:00 +01:00
Suresh Kumar Anaparti 81b2c38be9
Merge branch '4.22' 2025-11-06 14:41:59 +05:30
Suresh Kumar Anaparti ac8c200790
merge fix 2025-11-06 14:41:27 +05:30
Suresh Kumar Anaparti 5504b053e4
Merge branch '4.20' into 4.22 2025-11-06 14:37:38 +05:30
Harikrishna Patnala dbda673e1f Updating pom.xml version numbers for release 4.23.0.0-SNAPSHOT
Signed-off-by: Harikrishna Patnala <harikrishna.patnala@gmail.com>
2025-11-05 16:54:39 +05:30
Harikrishna Patnala e66926e6a4 Merge branch '4.22' 2025-11-05 16:52:20 +05:30
Harikrishna Patnala d160731b9f Updating pom.xml version numbers for release 4.22.1.0-SNAPSHOT
Signed-off-by: Harikrishna Patnala <harikrishna.patnala@gmail.com>
2025-11-05 16:07:07 +05:30
Wei Zhou 15c2e50338
UI: fix typo Upload SSL certificate (#11869) 2025-11-03 15:36:52 +01:00
Wei Zhou d53b6dbda4
api/test: fix storage pool update with only id (#11897) 2025-11-03 15:25:09 +01:00
Suresh Kumar Anaparti e90e436ef8
UI: Enable listall (for Affinity Groups, SSH Keypairs, User Data) in deploy instance wizard for admin, and lists SSH Keypairs, User Data by domain/account (#11906) 2025-10-29 11:18:32 +01:00
1823 changed files with 25609 additions and 12574 deletions

22
.github/CODEOWNERS vendored Normal file
View File

@ -0,0 +1,22 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
/plugins/storage/volume/linstor @rp-
/plugins/storage/volume/storpool @slavkap
.pre-commit-config.yaml @jbampton
/.github/linters/ @jbampton

30
.github/dependabot.yml vendored Normal file
View File

@ -0,0 +1,30 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
version: 2
updates:
- package-ecosystem: "maven" # See documentation for possible values
directory: "/" # Location of package manifests
schedule:
interval: "daily"
cooldown:
default-days: 7

View File

@ -15,13 +15,14 @@
# specific language governing permissions and limitations # specific language governing permissions and limitations
# under the License. # under the License.
--- ---
extends: relaxed extends: default
rules: rules:
line-length: line-length:
max: 400 # Very forgiving for GitHub Actions and infrastructure files max: 400 # Very forgiving for GitHub Actions and infrastructure files
indentation: disable # Disable indentation checking for existing files indentation: disable # Disable indentation checking for existing files
comments: disable # Disable comment formatting checks comments: disable # Disable comment formatting checks
braces: disable
brackets: disable # Disable bracket spacing checks brackets: disable # Disable bracket spacing checks
colons: colons:
max-spaces-after: -1 # Allow any number of spaces after colon max-spaces-after: -1 # Allow any number of spaces after colon

View File

@ -4,6 +4,7 @@ acount
actuall actuall
acuiring acuiring
acumulate acumulate
addin
addreess addreess
addtion addtion
adminstrator adminstrator
@ -12,10 +13,8 @@ afrer
afterall afterall
againt againt
ags ags
aktive
algoritm algoritm
allo allo
alloacate
allocted allocted
alocation alocation
alogrithm alogrithm
@ -65,6 +64,7 @@ bject
boardcast boardcast
bootstraper bootstraper
bu bu
callin
cant cant
capabilites capabilites
capablity capablity
@ -73,6 +73,7 @@ carrefully
cavaet cavaet
chaing chaing
checkd checkd
checkin
childs childs
choosen choosen
chould chould
@ -93,7 +94,6 @@ confg
configruation configruation
configuable configuable
conneciton conneciton
connexion
constrait constrait
constraits constraits
containg containg
@ -101,9 +101,7 @@ contex
continuesly continuesly
contro contro
controler controler
controles
controll controll
convienient
convinience convinience
coputer coputer
correcponding correcponding
@ -158,13 +156,13 @@ differnet
differnt differnt
direcotry direcotry
directroy directroy
disale
disbale disbale
discrepency discrepency
disover disover
dissapper dissapper
dissassociated dissassociated
divice divice
dockin
doesn' doesn'
doesnot doesnot
doesnt doesnt
@ -175,7 +173,6 @@ eanbled
earch earch
ect ect
elemnt elemnt
eles
elments elments
emmited emmited
enble enble
@ -187,22 +184,19 @@ environmnet
equivalant equivalant
erro erro
erronous erronous
everthing
everytime everytime
excute excute
execept execept
execption execption
exects
execut execut
executeable executeable
exeeded exeeded
exisitng exisitng
exisits exisits
existin
existsing existsing
exitting
expcted expcted
expection expection
explaination
explicitely explicitely
faield faield
faild faild
@ -215,7 +209,6 @@ fillled
findout findout
fisrt fisrt
fo fo
folowing
fowarding fowarding
frist frist
fro fro
@ -234,6 +227,7 @@ hanling
happend happend
hasing hasing
hasnt hasnt
havin
hda hda
hostanme hostanme
hould hould
@ -253,20 +247,14 @@ implmeneted
implmentation implmentation
incase incase
includeing includeing
incosistency
indecates indecates
indien
infor infor
informations informations
informaton informaton
infrastrcuture
ingore ingore
inital
initalize initalize
initator initator
initilization
inspite inspite
instace
instal instal
instnace instnace
intefaces intefaces
@ -284,12 +272,8 @@ ist
klunky klunky
lable lable
leve leve
lief
limite limite
linke
listner listner
lokal
lokales
maintainence maintainence
maintenace maintenace
maintenence maintenence
@ -298,7 +282,6 @@ mambers
manaully manaully
manuel manuel
maxium maxium
mehtod
mergable mergable
mesage mesage
messge messge
@ -308,7 +291,6 @@ minumum
mis mis
modifers modifers
mor mor
mot
mulitply mulitply
multipl multipl
multple multple
@ -322,7 +304,7 @@ nin
nodel nodel
nome nome
noone noone
nowe notin
numbe numbe
numer numer
occured occured
@ -390,12 +372,9 @@ remaning
remore remore
remvoing remvoing
renabling renabling
repeatly
reponse reponse
reqest reqest
reqiured reqiured
requieres
requried
reserv reserv
reserverd reserverd
reseted reseted
@ -414,14 +393,13 @@ retuned
returing returing
rever rever
rocessor rocessor
roperty
runing runing
runnign runnign
sate sate
scalled scalled
scipt
scirpt scirpt
scrip scrip
seconadry
seconday seconday
seesion seesion
sepcified sepcified
@ -434,12 +412,10 @@ settig
sevices sevices
shoul shoul
shoule shoule
sie
signle signle
simplier simplier
singature singature
skiping skiping
snaphsot
snpashot snpashot
specied specied
specifed specifed
@ -450,7 +426,6 @@ standy
statics statics
stickyness stickyness
stil stil
stip
storeage storeage
strat strat
streched streched
@ -459,7 +434,6 @@ succesfull
successfull successfull
suceessful suceessful
suces suces
sucessfully
suiteable suiteable
suppots suppots
suppport suppport
@ -492,7 +466,6 @@ uncompressible
uneccessarily uneccessarily
unexepected unexepected
unexpect unexpect
unknow
unkonw unkonw
unkown unkown
unneccessary unneccessary
@ -500,14 +473,12 @@ unparseable
unrecoginized unrecoginized
unsupport unsupport
unxpected unxpected
updat
uptodate uptodate
usera usera
usign usign
usin usin
utlization utlization
vaidate vaidate
valiate
valule valule
valus valus
varibles varibles
@ -516,8 +487,6 @@ verfying
verifing verifing
virutal virutal
visable visable
wakup
wil wil
wit wit
wll
wth wth

View File

@ -44,14 +44,14 @@ jobs:
cache: 'maven' cache: 'maven'
- name: Cache SonarCloud packages - name: Cache SonarCloud packages
uses: actions/cache@v4 uses: actions/cache@v5
with: with:
path: ~/.sonar/cache path: ~/.sonar/cache
key: ${{ runner.os }}-sonar key: ${{ runner.os }}-sonar
restore-keys: ${{ runner.os }}-sonar restore-keys: ${{ runner.os }}-sonar
- name: Cache local Maven repository - name: Cache local Maven repository
uses: actions/cache@v4 uses: actions/cache@v5
with: with:
path: ~/.m2/repository path: ~/.m2/repository
key: ${{ runner.os }}-m2-${{ hashFiles('pom.xml', '*/pom.xml', '*/*/pom.xml', '*/*/*/pom.xml') }} key: ${{ runner.os }}-m2-${{ hashFiles('pom.xml', '*/pom.xml', '*/*/pom.xml', '*/*/*/pom.xml') }}

View File

@ -39,11 +39,11 @@ jobs:
pip install pre-commit pip install pre-commit
- name: Set PY - name: Set PY
run: echo "PY=$(python -VV | sha256sum | cut -d' ' -f1)" >> $GITHUB_ENV run: echo "PY=$(python -VV | sha256sum | cut -d' ' -f1)" >> $GITHUB_ENV
- uses: actions/cache@v4 - uses: actions/cache@v5
with: with:
path: ~/.cache/pre-commit path: ~/.cache/pre-commit
key: pre-commit|${{ env.PY }}|${{ hashFiles('.pre-commit-config.yaml') }} key: pre-commit|${{ env.PY }}|${{ hashFiles('.pre-commit-config.yaml') }}
- name: Run pre-commit - name: Run pre-commit
run: pre-commit run --all-files run: pre-commit run --color=always --all-files
- name: Run manual pre-commit hooks - name: Run manual pre-commit hooks
run: pre-commit run --all-files --hook-stage manual run: pre-commit run --color=always --all-files --hook-stage manual

View File

@ -46,14 +46,14 @@ jobs:
cache: 'maven' cache: 'maven'
- name: Cache SonarCloud packages - name: Cache SonarCloud packages
uses: actions/cache@v4 uses: actions/cache@v5
with: with:
path: ~/.sonar/cache path: ~/.sonar/cache
key: ${{ runner.os }}-sonar key: ${{ runner.os }}-sonar
restore-keys: ${{ runner.os }}-sonar restore-keys: ${{ runner.os }}-sonar
- name: Cache local Maven repository - name: Cache local Maven repository
uses: actions/cache@v4 uses: actions/cache@v5
with: with:
path: ~/.m2/repository path: ~/.m2/repository
key: ${{ runner.os }}-m2-${{ hashFiles('pom.xml', '*/pom.xml', '*/*/pom.xml', '*/*/*/pom.xml') }} key: ${{ runner.os }}-m2-${{ hashFiles('pom.xml', '*/pom.xml', '*/*/pom.xml', '*/*/*/pom.xml') }}

43
.github/workflows/stale.yml vendored Normal file
View File

@ -0,0 +1,43 @@
# 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.
name: 'Close stale issues and PRs'
on:
schedule:
- cron: '30 1 * * *'
jobs:
stale:
runs-on: ubuntu-latest
permissions:
actions: write
issues: write
pull-requests: write
steps:
- uses: actions/stale@v10
with:
stale-issue-message: 'This issue is stale because it has been open for 120 days with no activity. It may be removed by administrators of this project at any time. Remove the stale label or comment to request for removal of it to prevent this.'
stale-pr-message: 'This PR is stale because it has been open for 120 days with no activity. It may be removed by administrators of this project at any time. Remove the stale label or comment to request for removal of it to prevent this.'
close-issue-message: 'This issue was closed because it has been stale for 120 days with no activity.'
close-pr-message: 'This PR was closed because it has been stale for 240 days with no activity.'
stale-issue-label: 'no-issue-activity'
stale-pr-label: 'no-pr-activity'
days-before-stale: 120
days-before-close: -1
days-before-pr-close: 240
exempt-issue-labels: 'gsoc,good-first-issue,long-term-plan'
exempt-pr-labels: 'status:ready-for-merge,status:needs-testing,status:on-hold'

View File

@ -25,6 +25,12 @@ repos:
hooks: hooks:
- id: identity - id: identity
- id: check-hooks-apply - id: check-hooks-apply
- repo: https://github.com/thlorenz/doctoc.git
rev: v2.2.0
hooks:
- id: doctoc
name: Add TOC for Markdown files
files: ^CONTRIBUTING\.md$|^INSTALL\.md$|^README\.md$
- repo: https://github.com/oxipng/oxipng - repo: https://github.com/oxipng/oxipng
rev: v9.1.5 rev: v9.1.5
hooks: hooks:
@ -41,6 +47,11 @@ repos:
- repo: https://github.com/Lucas-C/pre-commit-hooks - repo: https://github.com/Lucas-C/pre-commit-hooks
rev: v1.5.5 rev: v1.5.5
hooks: hooks:
- id: chmod
name: set file permissions
args: ['644']
files: \.md$
stages: [manual]
- id: insert-license - id: insert-license
name: add license for all Markdown files name: add license for all Markdown files
files: \.md$ files: \.md$
@ -51,6 +62,54 @@ repos:
- .github/workflows/license-templates/LICENSE.txt - .github/workflows/license-templates/LICENSE.txt
- --fuzzy-match-generates-todo - --fuzzy-match-generates-todo
exclude: ^(CHANGES|ISSUE_TEMPLATE|PULL_REQUEST_TEMPLATE)\.md$|^ui/docs/(full|smoke)-test-plan\.template\.md$ exclude: ^(CHANGES|ISSUE_TEMPLATE|PULL_REQUEST_TEMPLATE)\.md$|^ui/docs/(full|smoke)-test-plan\.template\.md$
- id: insert-license
name: add license for all properties files
description: automatically adds a licence header to all properties files that don't have a license header
files: \.properties$
args:
- --comment-style
- '|#|'
- --license-filepath
- .github/workflows/license-templates/LICENSE.txt
- --fuzzy-match-generates-todo
- id: insert-license
name: add license for all Shell files
description: automatically adds a licence header to all Shell files that don't have a license header
files: \.sh$
args:
- --comment-style
- '|#|'
- --license-filepath
- .github/workflows/license-templates/LICENSE.txt
- --fuzzy-match-generates-todo
- id: insert-license
name: add license for all SQL files
files: \.sql$
args:
- --comment-style
- '|--|'
- --license-filepath
- .github/workflows/license-templates/LICENSE.txt
- --fuzzy-match-generates-todo
- id: insert-license
name: add license for all Vue files
files: \.vue$
args:
- --comment-style
- '|//|'
- --license-filepath
- .github/workflows/license-templates/LICENSE.txt
- --fuzzy-match-generates-todo
- id: insert-license
name: add license for all YAML files
description: automatically adds a licence header to all YAML files that don't have a license header
files: \.ya?ml$
args:
- --comment-style
- '|#|'
- --license-filepath
- .github/workflows/license-templates/LICENSE.txt
- --fuzzy-match-generates-todo
- repo: https://github.com/pre-commit/pre-commit-hooks - repo: https://github.com/pre-commit/pre-commit-hooks
rev: v6.0.0 rev: v6.0.0
hooks: hooks:
@ -84,7 +143,7 @@ repos:
^systemvm/agent/certs/realhostip\.key$| ^systemvm/agent/certs/realhostip\.key$|
^test/integration/smoke/test_ssl_offloading\.py$ ^test/integration/smoke/test_ssl_offloading\.py$
- id: end-of-file-fixer - id: end-of-file-fixer
exclude: \.vhd$ exclude: \.vhd$|\.svg$
- id: file-contents-sorter - id: file-contents-sorter
args: [--unique] args: [--unique]
files: ^\.github/linters/codespell\.txt$ files: ^\.github/linters/codespell\.txt$
@ -92,11 +151,11 @@ repos:
- id: forbid-submodules - id: forbid-submodules
- id: mixed-line-ending - id: mixed-line-ending
- id: trailing-whitespace - id: trailing-whitespace
files: \.(bat|cfg|cs|css|gitignore|header|in|install|java|md|properties|py|rb|rc|sh|sql|te|template|txt|ucls|vue|xml|xsl|yaml|yml)$|^cloud-cli/bindir/cloud-tool$|^debian/changelog$ files: ^(LICENSE|NOTICE)$|\.(bat|cfg|cs|css|gitignore|header|in|install|java|md|properties|py|rb|rc|sh|sql|te|template|txt|ucls|vue|xml|xsl|yaml|yml)$|^cloud-cli/bindir/cloud-tool$|^debian/changelog$
args: [--markdown-linebreak-ext=md] args: [--markdown-linebreak-ext=md]
exclude: ^services/console-proxy/rdpconsole/src/test/doc/freerdp-debug-log\.txt$ exclude: ^services/console-proxy/rdpconsole/src/test/doc/freerdp-debug-log\.txt$
- repo: https://github.com/codespell-project/codespell - repo: https://github.com/codespell-project/codespell
rev: v2.2.6 rev: v2.4.1
hooks: hooks:
- id: codespell - id: codespell
name: run codespell name: run codespell
@ -117,14 +176,6 @@ repos:
args: [--config=.github/linters/.markdown-lint.yml] args: [--config=.github/linters/.markdown-lint.yml]
types: [markdown] types: [markdown]
files: \.(md|mdown|markdown)$ files: \.(md|mdown|markdown)$
- repo: https://github.com/Lucas-C/pre-commit-hooks
rev: v1.5.5
hooks:
- id: chmod
name: set file permissions
args: ['644']
files: \.md$
stages: [manual]
- repo: https://github.com/adrienverge/yamllint - repo: https://github.com/adrienverge/yamllint
rev: v1.37.1 rev: v1.37.1
hooks: hooks:

View File

@ -21,6 +21,24 @@
## Summary ## Summary
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
- [Summary](#summary)
- [Bug fixes](#bug-fixes)
- [Developing new features](#developing-new-features)
- [PendingReleaseNotes file](#pendingreleasenotes-file)
- [Fork the code](#fork-the-code)
- [Making changes](#making-changes)
- [Rebase `feature_x` to include updates from `upstream/main`](#rebase-feature_x-to-include-updates-from-upstreammain)
- [Make a GitHub Pull Request to contribute your changes](#make-a-github-pull-request-to-contribute-your-changes)
- [Cleaning up after a successful pull request](#cleaning-up-after-a-successful-pull-request)
- [Release Principles](#release-principles)
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
## Summary
This document covers how to contribute to the ACS project. ACS uses GitHub PRs to manage code contributions. This document covers how to contribute to the ACS project. ACS uses GitHub PRs to manage code contributions.
These instructions assume you have a GitHub.com account, so if you don't have one you will have to create one. Your proposed code changes will be published to your own fork of the ACS project, and you will submit a Pull Request for your changes to be added. These instructions assume you have a GitHub.com account, so if you don't have one you will have to create one. Your proposed code changes will be published to your own fork of the ACS project, and you will submit a Pull Request for your changes to be added.

View File

@ -26,9 +26,21 @@ or the developer [wiki](https://cwiki.apache.org/confluence/display/CLOUDSTACK/H
Apache CloudStack developers use various platforms for development, this guide Apache CloudStack developers use various platforms for development, this guide
was tested against a CentOS 7 x86_64 setup. was tested against a CentOS 7 x86_64 setup.
* [Setting up development environment](https://cwiki.apache.org/confluence/display/CLOUDSTACK/Setting+up+CloudStack+Development+Environment) for Apache CloudStack. <!-- START doctoc generated TOC please keep comment here to allow auto update -->
* [Building](https://cwiki.apache.org/confluence/display/CLOUDSTACK/How+to+build+CloudStack) Apache CloudStack. <!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
* [Appliance based development](https://github.com/rhtyd/monkeybox)
- [Setting up Development Environment](#setting-up-development-environment)
- [Using jenv and/or pyenv for Version Management](#using-jenv-andor-pyenv-for-version-management)
- [Getting the Source Code](#getting-the-source-code)
- [Building](#building)
- [To bring up CloudStack UI](#to-bring-up-cloudstack-ui)
- [Building with non-redistributable plugins](#building-with-non-redistributable-plugins)
- [Packaging and Installation](#packaging-and-installation)
- [Debian/Ubuntu](#debianubuntu)
- [RHEL/CentOS](#rhelcentos)
- [Notes](#notes)
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
## Setting up Development Environment ## Setting up Development Environment

242
LICENSE
View File

@ -177,14 +177,14 @@ Copyright (c) 2014 The Apache Software Foundation
of your accepting any such warranty or additional liability. of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS END OF TERMS AND CONDITIONS
This distribution contains third party resources. This distribution contains third party resources.
Within the console-proxy/js directory Within the console-proxy/js directory
licensed under the MIT License http://www.opensource.org/licenses/mit-license.php (as follows) licensed under the MIT License http://www.opensource.org/licenses/mit-license.php (as follows)
Copyright (c) 2009, John Resig Copyright (c) 2009, John Resig
Permission is hereby granted, free of charge, to any person obtaining Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including "Software"), to deal in the Software without restriction, including
@ -192,10 +192,10 @@ Within the console-proxy/js directory
distribute, sublicense, and/or sell copies of the Software, and to distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to permit persons to whom the Software is furnished to do so, subject to
the following conditions: the following conditions:
The above copyright notice and this permission notice shall be The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software. included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@ -203,43 +203,43 @@ Within the console-proxy/js directory
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
from John Resig from John Resig
jquery.js jquery.js
Within the systemvm/debian/etc directory Within the systemvm/debian/etc directory
placed in the public domain placed in the public domain
by Adiscon GmbH http://www.adiscon.com/ by Adiscon GmbH http://www.adiscon.com/
rsyslog.conf rsyslog.conf
by Simon Kelley by Simon Kelley
dnsmasq.conf dnsmasq.conf
vpcdnsmasq.conf vpcdnsmasq.conf
Within the systemvm/debian/etc/apache2 directory Within the systemvm/debian/etc/apache2 directory
licensed under the Apache License, Version 2 http://www.apache.org/licenses/LICENSE-2.0.txt (as above) licensed under the Apache License, Version 2 http://www.apache.org/licenses/LICENSE-2.0.txt (as above)
Copyright (c) 2012 The Apache Software Foundation Copyright (c) 2012 The Apache Software Foundation
from The Apache Software Foundation http://www.apache.org/ from The Apache Software Foundation http://www.apache.org/
httpd.conf httpd.conf
vhost.template vhost.template
Within the systemvm/debian/etc/ssh/ directory Within the systemvm/debian/etc/ssh/ directory
licensed under the BSD (2-clause) http://www.opensource.org/licenses/BSD-2-Clause (as follows) licensed under the BSD (2-clause) http://www.opensource.org/licenses/BSD-2-Clause (as follows)
Redistribution and use in source and binary forms, with or without modification, Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met: are permitted provided that the following conditions are met:
Redistributions of source code must retain the above copyright notice, this list Redistributions of source code must retain the above copyright notice, this list
of conditions and the following disclaimer. Redistributions in binary form must of conditions and the following disclaimer. Redistributions in binary form must
reproduce the above copyright notice, this list of conditions and the following reproduce the above copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided with the disclaimer in the documentation and/or other materials provided with the
distribution. distribution.
Neither the name of the author nor the names of contributors may be used to Neither the name of the author nor the names of contributors may be used to
endorse or promote products derived from this software without specific prior endorse or promote products derived from this software without specific prior
written permission. written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
@ -250,55 +250,55 @@ Within the systemvm/debian/etc/ssh/ directory
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
from OpenSSH Project http://www.openssh.org/ from OpenSSH Project http://www.openssh.org/
sshd_config sshd_config
Within the systemvm/debian/root/redundant_router directory Within the systemvm/debian/root/redundant_router directory
placed in the public domain placed in the public domain
by The netfilter.org project http://www.netfilter.org/ by The netfilter.org project http://www.netfilter.org/
conntrackd.conf.templ conntrackd.conf.templ
Within the scripts/storage/secondary directory Within the scripts/storage/secondary directory
licensed under the Apache License, Version 2 http://www.apache.org/licenses/LICENSE-2.0.txt (as above) licensed under the Apache License, Version 2 http://www.apache.org/licenses/LICENSE-2.0.txt (as above)
Copyright (c) 2010-2011 OpenStack, LLC. Copyright (c) 2010-2011 OpenStack, LLC.
from OpenStack, LLC http://www.openstack.org from OpenStack, LLC http://www.openstack.org
swift swift
Within the scripts/vm/hypervisor/xenserver directory Within the scripts/vm/hypervisor/xenserver directory
licensed under the Apache License, Version 2 http://www.apache.org/licenses/LICENSE-2.0.txt (as above) licensed under the Apache License, Version 2 http://www.apache.org/licenses/LICENSE-2.0.txt (as above)
Copyright (c) 2010-2011 OpenStack, LLC. Copyright (c) 2010-2011 OpenStack, LLC.
from OpenStack, LLC http://www.openstack.org from OpenStack, LLC http://www.openstack.org
swift swift
Within the ui/lib directory Within the ui/lib directory
placed in the public domain placed in the public domain
by Eric Meyer http://meyerweb.com/eric/ by Eric Meyer http://meyerweb.com/eric/
reset.css from http://meyerweb.com/eric/tools/css/reset/ reset.css from http://meyerweb.com/eric/tools/css/reset/
licensed under the Apache License, Version 2 http://www.apache.org/licenses/LICENSE-2.0.txt (as above) licensed under the Apache License, Version 2 http://www.apache.org/licenses/LICENSE-2.0.txt (as above)
Copyright (c) 2006 Google Inc. Copyright (c) 2006 Google Inc.
from Google Inc. http://google.com from Google Inc. http://google.com
excanvas.js from http://code.google.com/p/explorercanvas/ excanvas.js from http://code.google.com/p/explorercanvas/
licensed under the BSD (2-clause) http://www.opensource.org/licenses/BSD-2-Clause (as follows) licensed under the BSD (2-clause) http://www.opensource.org/licenses/BSD-2-Clause (as follows)
Copyright (c) 2008 George McGinley Smith Copyright (c) 2008 George McGinley Smith
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without modification, Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met: are permitted provided that the following conditions are met:
Redistributions of source code must retain the above copyright notice, this list Redistributions of source code must retain the above copyright notice, this list
of conditions and the following disclaimer. Redistributions in binary form must of conditions and the following disclaimer. Redistributions in binary form must
reproduce the above copyright notice, this list of conditions and the following reproduce the above copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided with the disclaimer in the documentation and/or other materials provided with the
distribution. distribution.
Neither the name of the author nor the names of contributors may be used to Neither the name of the author nor the names of contributors may be used to
endorse or promote products derived from this software without specific prior endorse or promote products derived from this software without specific prior
written permission. written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
@ -309,13 +309,13 @@ Within the ui/lib directory
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
from George McGinley Smith from George McGinley Smith
jquery.easing.js jquery.easing.js
licensed under the MIT License http://www.opensource.org/licenses/mit-license.php (as follows) licensed under the MIT License http://www.opensource.org/licenses/mit-license.php (as follows)
Permission is hereby granted, free of charge, to any person obtaining Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including "Software"), to deal in the Software without restriction, including
@ -323,10 +323,10 @@ Within the ui/lib directory
distribute, sublicense, and/or sell copies of the Software, and to distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to permit persons to whom the Software is furnished to do so, subject to
the following conditions: the following conditions:
The above copyright notice and this permission notice shall be The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software. included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@ -334,14 +334,14 @@ Within the ui/lib directory
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
from The Dojo Foundation http://dojofoundation.org/ from The Dojo Foundation http://dojofoundation.org/
require.js from http://github.com/jrburke/requirejs require.js from http://github.com/jrburke/requirejs
licensed under the MIT License http://www.opensource.org/licenses/mit-license.php (as follows) licensed under the MIT License http://www.opensource.org/licenses/mit-license.php (as follows)
Copyright (c) 2011, John Resig Copyright (c) 2011, John Resig
Permission is hereby granted, free of charge, to any person obtaining Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including "Software"), to deal in the Software without restriction, including
@ -349,10 +349,10 @@ Within the ui/lib directory
distribute, sublicense, and/or sell copies of the Software, and to distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to permit persons to whom the Software is furnished to do so, subject to
the following conditions: the following conditions:
The above copyright notice and this permission notice shall be The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software. included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@ -360,14 +360,14 @@ Within the ui/lib directory
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
from John Resig from John Resig
jquery.js jquery.js
licensed under the MIT License http://www.opensource.org/licenses/mit-license.php (as follows) licensed under the MIT License http://www.opensource.org/licenses/mit-license.php (as follows)
Copyright (c) 2014 Jörn Zaefferer Copyright (c) 2014 Jörn Zaefferer
Permission is hereby granted, free of charge, to any person obtaining Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including "Software"), to deal in the Software without restriction, including
@ -375,10 +375,10 @@ Within the ui/lib directory
distribute, sublicense, and/or sell copies of the Software, and to distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to permit persons to whom the Software is furnished to do so, subject to
the following conditions: the following conditions:
The above copyright notice and this permission notice shall be The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software. included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@ -386,9 +386,9 @@ Within the ui/lib directory
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
from Jorn Zaefferer from Jorn Zaefferer
jquery.validate.js jquery.validate.js
licensed under the MIT License http://www.opensource.org/licenses/mit-license.php (as follows) licensed under the MIT License http://www.opensource.org/licenses/mit-license.php (as follows)
@ -418,8 +418,8 @@ Within the ui/lib directory
licensed under the MIT License http://www.opensource.org/licenses/mit-license.php (as follows) licensed under the MIT License http://www.opensource.org/licenses/mit-license.php (as follows)
Copyright (c) 2010, Sebastian Tschan Copyright (c) 2010, Sebastian Tschan
Permission is hereby granted, free of charge, to any person obtaining Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including "Software"), to deal in the Software without restriction, including
@ -427,10 +427,10 @@ Within the ui/lib directory
distribute, sublicense, and/or sell copies of the Software, and to distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to permit persons to whom the Software is furnished to do so, subject to
the following conditions: the following conditions:
The above copyright notice and this permission notice shall be The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software. included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@ -438,14 +438,14 @@ Within the ui/lib directory
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
from Sebastian Tschan https://blueimp.net from Sebastian Tschan https://blueimp.net
jquery.md5.js jquery.md5.js
licensed under the MIT License http://www.opensource.org/licenses/mit-license.php (as follows) licensed under the MIT License http://www.opensource.org/licenses/mit-license.php (as follows)
Copyright (c) 2006 Klaus Hartl (stilbuero.de) Copyright (c) 2006 Klaus Hartl (stilbuero.de)
Permission is hereby granted, free of charge, to any person obtaining Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including "Software"), to deal in the Software without restriction, including
@ -453,10 +453,10 @@ Within the ui/lib directory
distribute, sublicense, and/or sell copies of the Software, and to distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to permit persons to whom the Software is furnished to do so, subject to
the following conditions: the following conditions:
The above copyright notice and this permission notice shall be The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software. included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@ -464,15 +464,15 @@ Within the ui/lib directory
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
from Klaus Hartl http://stilbuero.de from Klaus Hartl http://stilbuero.de
jquery.cookies.js jquery.cookies.js
Within the ui/lib/flot directory Within the ui/lib/flot directory
licensed under the MIT License http://www.opensource.org/licenses/mit-license.php (as follows) licensed under the MIT License http://www.opensource.org/licenses/mit-license.php (as follows)
Released under the MIT license by IOLA, December 2007. Released under the MIT license by IOLA, December 2007.
Permission is hereby granted, free of charge, to any person obtaining Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including "Software"), to deal in the Software without restriction, including
@ -480,10 +480,10 @@ Within the ui/lib/flot directory
distribute, sublicense, and/or sell copies of the Software, and to distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to permit persons to whom the Software is furnished to do so, subject to
the following conditions: the following conditions:
The above copyright notice and this permission notice shall be The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software. included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@ -491,24 +491,24 @@ Within the ui/lib/flot directory
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
from IOLA http://www.iola.dk/ from IOLA http://www.iola.dk/
jquery.flot.crosshair.js jquery.flot.crosshair.js
jquery.flot.fillbetween.js jquery.flot.fillbetween.js
jquery.flot.image.js jquery.flot.image.js
jquery.flot.js jquery.flot.js
jquery.flot.navigate.js jquery.flot.navigate.js
jquery.flot.resize.js jquery.flot.resize.js
jquery.flot.selection.js jquery.flot.selection.js
jquery.flot.stack.js jquery.flot.stack.js
jquery.flot.symbol.js jquery.flot.symbol.js
jquery.flot.threshold.js jquery.flot.threshold.js
licensed under the MIT License http://www.opensource.org/licenses/mit-license.php (as follows) licensed under the MIT License http://www.opensource.org/licenses/mit-license.php (as follows)
Created by Brian Medendorp, June 2009 Created by Brian Medendorp, June 2009
Updated November 2009 with contributions from: btburnett3, Anthony Aragues and Xavi Ivars Updated November 2009 with contributions from: btburnett3, Anthony Aragues and Xavi Ivars
Permission is hereby granted, free of charge, to any person obtaining Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including "Software"), to deal in the Software without restriction, including
@ -516,10 +516,10 @@ Within the ui/lib/flot directory
distribute, sublicense, and/or sell copies of the Software, and to distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to permit persons to whom the Software is furnished to do so, subject to
the following conditions: the following conditions:
The above copyright notice and this permission notice shall be The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software. included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@ -527,13 +527,13 @@ Within the ui/lib/flot directory
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
from Brian Medendorp from Brian Medendorp
jquery.pie.js jquery.pie.js
licensed under the MIT License http://www.opensource.org/licenses/mit-license.php (as follows) licensed under the MIT License http://www.opensource.org/licenses/mit-license.php (as follows)
Permission is hereby granted, free of charge, to any person obtaining Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including "Software"), to deal in the Software without restriction, including
@ -541,10 +541,10 @@ Within the ui/lib/flot directory
distribute, sublicense, and/or sell copies of the Software, and to distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to permit persons to whom the Software is furnished to do so, subject to
the following conditions: the following conditions:
The above copyright notice and this permission notice shall be The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software. included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@ -552,14 +552,14 @@ Within the ui/lib/flot directory
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
from Ole Laursen from Ole Laursen
jquery.colorhelpers.js jquery.colorhelpers.js
Within the ui/lib/jquery-ui directory Within the ui/lib/jquery-ui directory
licensed under the MIT License http://www.opensource.org/licenses/mit-license.php (as follows) licensed under the MIT License http://www.opensource.org/licenses/mit-license.php (as follows)
Permission is hereby granted, free of charge, to any person obtaining Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including "Software"), to deal in the Software without restriction, including
@ -567,10 +567,10 @@ Within the ui/lib/jquery-ui directory
distribute, sublicense, and/or sell copies of the Software, and to distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to permit persons to whom the Software is furnished to do so, subject to
the following conditions: the following conditions:
The above copyright notice and this permission notice shall be The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software. included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@ -578,17 +578,17 @@ Within the ui/lib/jquery-ui directory
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
from jQuery UI Developers http://jqueryui.com/about from jQuery UI Developers http://jqueryui.com/about
css/jquery-ui.css css/jquery-ui.css
index.html index.html
js/jquery-ui.js js/jquery-ui.js
Within the ui/lib/qunit directory Within the ui/lib/qunit directory
licensed under the MIT License http://www.opensource.org/licenses/mit-license.php (as follows) licensed under the MIT License http://www.opensource.org/licenses/mit-license.php (as follows)
Copyright (c) 2012 John Resig, Jörn Zaefferer Copyright (c) 2012 John Resig, Jörn Zaefferer
Permission is hereby granted, free of charge, to any person obtaining Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including "Software"), to deal in the Software without restriction, including
@ -596,10 +596,10 @@ Within the ui/lib/qunit directory
distribute, sublicense, and/or sell copies of the Software, and to distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to permit persons to whom the Software is furnished to do so, subject to
the following conditions: the following conditions:
The above copyright notice and this permission notice shall be The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software. included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@ -607,20 +607,20 @@ Within the ui/lib/qunit directory
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
from Jorn Zaefferer from Jorn Zaefferer
qunit.css from http://docs.jquery.com/QUnit qunit.css from http://docs.jquery.com/QUnit
qunit.js from http://docs.jquery.com/QUnit qunit.js from http://docs.jquery.com/QUnit
Within the utils/src/main/java/com/cloud/utils/db directory Within the utils/src/main/java/com/cloud/utils/db directory
licensed under the Apache License, Version 2 http://www.apache.org/licenses/LICENSE-2.0.txt (as above) licensed under the Apache License, Version 2 http://www.apache.org/licenses/LICENSE-2.0.txt (as above)
Copyright (c) 2004 Clinton Begin Copyright (c) 2004 Clinton Begin
from Clinton Begin http://code.google.com/p/mybatis/ from Clinton Begin http://code.google.com/p/mybatis/
ScriptRunner.java from http://code.google.com/p/mybatis/ ScriptRunner.java from http://code.google.com/p/mybatis/
Within the utils/src/main/java/org/apache/commons/httpclient/contrib/ssl directory Within the utils/src/main/java/org/apache/commons/httpclient/contrib/ssl directory
licensed under the Apache License, Version 2 http://www.apache.org/licenses/LICENSE-2.0.txt (as above) licensed under the Apache License, Version 2 http://www.apache.org/licenses/LICENSE-2.0.txt (as above)
Copyright (c) 2007 The Apache Software Foundation Copyright (c) 2007 The Apache Software Foundation
from The Apache Software Foundation http://www.apache.org/ from The Apache Software Foundation http://www.apache.org/
EasySSLProtocolSocketFactory.java EasySSLProtocolSocketFactory.java
EasyX509TrustManager.java EasyX509TrustManager.java

52
NOTICE
View File

@ -1,62 +1,62 @@
Apache CloudStack Apache CloudStack
Copyright 2014 The Apache Software Foundation Copyright 2014 The Apache Software Foundation
This product includes software developed at This product includes software developed at
The Apache Software Foundation (http://www.apache.org/). The Apache Software Foundation (http://www.apache.org/).
This distribution contains third party resources requiring the following notices: This distribution contains third party resources requiring the following notices:
For For
jquery.js jquery.js
jQuery JavaScript Library v1.3.2 jQuery JavaScript Library v1.3.2
http://jquery.com/ http://jquery.com/
Copyright (c) 2009 John Resig Copyright (c) 2009 John Resig
Dual licensed under the MIT and GPL licenses. Dual licensed under the MIT and GPL licenses.
http://docs.jquery.com/License http://docs.jquery.com/License
Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009) Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
Revision: 6246 Revision: 6246
For For
jquery.js jquery.js
jQuery JavaScript Library v1.6.4 jQuery JavaScript Library v1.6.4
http://jquery.com/ http://jquery.com/
Copyright 2011, John Resig Copyright 2011, John Resig
Dual licensed under the MIT or GPL Version 2 licenses. Dual licensed under the MIT or GPL Version 2 licenses.
http://jquery.org/license http://jquery.org/license
Includes Sizzle.js Includes Sizzle.js
http://sizzlejs.com/ http://sizzlejs.com/
Copyright 2011, The Dojo Foundation Copyright 2011, The Dojo Foundation
Released under the MIT, BSD, and GPL Licenses. Released under the MIT, BSD, and GPL Licenses.
Date: Mon Sep 12 18:54:48 2011 -0400 Date: Mon Sep 12 18:54:48 2011 -0400
For For
jquery.md5.js jquery.md5.js
jQuery MD5 Plugin 1.2.1 jQuery MD5 Plugin 1.2.1
https://github.com/blueimp/jQuery-MD5 https://github.com/blueimp/jQuery-MD5
Copyright 2010, Sebastian Tschan Copyright 2010, Sebastian Tschan
https://blueimp.net https://blueimp.net
Licensed under the MIT license: Licensed under the MIT license:
http://creativecommons.org/licenses/MIT/ http://creativecommons.org/licenses/MIT/
Based on Based on
A JavaScript implementation of the RSA Data Security, Inc. MD5 Message A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
Digest Algorithm, as defined in RFC 1321. Digest Algorithm, as defined in RFC 1321.
@ -65,15 +65,15 @@ Copyright 2014 The Apache Software Foundation
Distributed under the BSD License Distributed under the BSD License
See http://pajhome.org.uk/crypt/md5 for more info. See http://pajhome.org.uk/crypt/md5 for more info.
For For
jquery.colorhelpers.js jquery.colorhelpers.js
Plugin for jQuery for working with colors. Plugin for jQuery for working with colors.
Version 1.1. Version 1.1.
Inspiration from jQuery color animation plugin by John Resig. Inspiration from jQuery color animation plugin by John Resig.
Released under the MIT license by Ole Laursen, October 2009. Released under the MIT license by Ole Laursen, October 2009.

View File

@ -20,7 +20,7 @@
# pre-commit # pre-commit
We run [pre-commit](https://pre-commit.com/) with We run [pre-commit](https://pre-commit.com/) with
[GitHub Actions](https://github.com/apache/cloudstack/blob/main/.github/workflows/linter.yml) so installation on your [GitHub Actions](https://github.com/apache/cloudstack/blob/main/.github/workflows/pre-commit.yml) so installation on your
local machine is currently optional. local machine is currently optional.
The `pre-commit` [configuration file](https://github.com/apache/cloudstack/blob/main/.pre-commit-config.yaml) The `pre-commit` [configuration file](https://github.com/apache/cloudstack/blob/main/.pre-commit-config.yaml)

View File

@ -31,6 +31,24 @@
[![Apache CloudStack](tools/logo/apache_cloudstack.png)](https://cloudstack.apache.org/) [![Apache CloudStack](tools/logo/apache_cloudstack.png)](https://cloudstack.apache.org/)
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
- [Who Uses CloudStack?](#who-uses-cloudstack)
- [Demo](#demo)
- [Getting Started](#getting-started)
- [Getting Source Repository](#getting-source-repository)
- [Documentation](#documentation)
- [News and Events](#news-and-events)
- [Getting Involved and Contributing](#getting-involved-and-contributing)
- [Reporting Security Vulnerabilities](#reporting-security-vulnerabilities)
- [License](#license)
- [Notice of Cryptographic Software](#notice-of-cryptographic-software)
- [Star History](#star-history)
- [Contributors](#contributors)
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
Apache CloudStack is open source software designed to deploy and manage large Apache CloudStack is open source software designed to deploy and manage large
networks of virtual machines, as a highly available, highly scalable networks of virtual machines, as a highly available, highly scalable
Infrastructure as a Service (IaaS) cloud computing platform. CloudStack is used Infrastructure as a Service (IaaS) cloud computing platform. CloudStack is used

View File

@ -0,0 +1,24 @@
# 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.
# Configuration file for UEFI
guest.nvram.template.legacy=@GUESTNVRAMTEMPLATELEGACY@
guest.loader.legacy=@GUESTLOADERLEGACY@
guest.nvram.template.secure=@GUESTNVRAMTEMPLATESECURE@
guest.loader.secure=@GUESTLOADERSECURE@
guest.nvram.path=@GUESTNVRAMPATH@

View File

@ -24,7 +24,7 @@
<parent> <parent>
<groupId>org.apache.cloudstack</groupId> <groupId>org.apache.cloudstack</groupId>
<artifactId>cloudstack</artifactId> <artifactId>cloudstack</artifactId>
<version>4.22.0.0</version> <version>4.23.0.0-SNAPSHOT</version>
</parent> </parent>
<dependencies> <dependencies>
<dependency> <dependency>

View File

@ -1322,7 +1322,6 @@ public class Agent implements HandlerFactory, IAgentControl, AgentStatusUpdater
processResponse((Response)request, task.getLink()); processResponse((Response)request, task.getLink());
} else { } else {
//put the requests from mgt server into another thread pool, as the request may take a longer time to finish. Don't block the NIO main thread pool //put the requests from mgt server into another thread pool, as the request may take a longer time to finish. Don't block the NIO main thread pool
//processRequest(request, task.getLink());
requestHandler.submit(new AgentRequestHandler(getType(), getLink(), request)); requestHandler.submit(new AgentRequestHandler(getType(), getLink(), request));
} }
} catch (final ClassNotFoundException e) { } catch (final ClassNotFoundException e) {
@ -1332,13 +1331,14 @@ public class Agent implements HandlerFactory, IAgentControl, AgentStatusUpdater
} }
} else if (task.getType() == Task.Type.DISCONNECT) { } else if (task.getType() == Task.Type.DISCONNECT) {
try { try {
// an issue has been found if reconnect immediately after disconnecting. please refer to https://github.com/apache/cloudstack/issues/8517 // an issue has been found if reconnect immediately after disconnecting.
// wait 5 seconds before reconnecting // wait 5 seconds before reconnecting
logger.debug("Wait for 5 secs before reconnecting, disconnect task - {}", () -> getLinkLog(task.getLink()));
Thread.sleep(5000); Thread.sleep(5000);
} catch (InterruptedException e) { } catch (InterruptedException e) {
} }
shell.setConnectionTransfer(false); shell.setConnectionTransfer(false);
logger.debug("Executing disconnect task - {}", () -> getLinkLog(task.getLink())); logger.debug("Executing disconnect task - {} and reconnecting", () -> getLinkLog(task.getLink()));
reconnect(task.getLink()); reconnect(task.getLink());
} else if (task.getType() == Task.Type.OTHER) { } else if (task.getType() == Task.Type.OTHER) {
processOtherTask(task); processOtherTask(task);

View File

@ -117,7 +117,7 @@ public class AgentProperties{
/** /**
* Local storage path.<br> * Local storage path.<br>
* This property allows multiple values to be entered in a single String. The differente values must be separated by commas.<br> * This property allows multiple values to be entered in a single String. The different values must be separated by commas.<br>
* Data type: String.<br> * Data type: String.<br>
* Default value: <code>/var/lib/libvirt/images/</code> * Default value: <code>/var/lib/libvirt/images/</code>
*/ */
@ -134,7 +134,7 @@ public class AgentProperties{
/** /**
* MANDATORY: The UUID for the local storage pool.<br> * MANDATORY: The UUID for the local storage pool.<br>
* This property allows multiple values to be entered in a single String. The differente values must be separated by commas.<br> * This property allows multiple values to be entered in a single String. The different values must be separated by commas.<br>
* Data type: String.<br> * Data type: String.<br>
* Default value: <code>null</code> * Default value: <code>null</code>
*/ */

View File

@ -175,12 +175,12 @@ public class ConsoleProxyResource extends ServerResourceBase implements ServerRe
try { try {
is.close(); is.close();
} catch (final IOException e) { } catch (final IOException e) {
logger.warn("Exception when closing , console proxy address : {}", proxyManagementIp); logger.warn("Exception when closing , console proxy address: {}", proxyManagementIp);
success = false; success = false;
} }
} }
} catch (final IOException e) { } catch (final IOException e) {
logger.warn("Unable to open console proxy command port url, console proxy address : {}", proxyManagementIp); logger.warn("Unable to open console proxy command port url, console proxy address: {}", proxyManagementIp);
success = false; success = false;
} }

View File

@ -24,7 +24,7 @@
<parent> <parent>
<groupId>org.apache.cloudstack</groupId> <groupId>org.apache.cloudstack</groupId>
<artifactId>cloudstack</artifactId> <artifactId>cloudstack</artifactId>
<version>4.22.0.0</version> <version>4.23.0.0-SNAPSHOT</version>
</parent> </parent>
<dependencies> <dependencies>
<dependency> <dependency>

View File

@ -119,8 +119,7 @@ public class OVFHelper {
boolean password = StringUtils.isNotBlank(passStr) && passStr.equalsIgnoreCase("true"); boolean password = StringUtils.isNotBlank(passStr) && passStr.equalsIgnoreCase("true");
String label = ovfParser.getChildNodeValue(node, "Label"); String label = ovfParser.getChildNodeValue(node, "Label");
String description = ovfParser.getChildNodeValue(node, "Description"); String description = ovfParser.getChildNodeValue(node, "Description");
logger.debug("Creating OVF property index " + index + (category == null ? "" : " for category " + category) logger.debug("Creating OVF property index {} {} with key = {}", index, (category == null ? "" : " for category " + category), key);
+ " with key = " + key);
return new OVFPropertyTO(key, type, value, qualifiers, userConfigurable, return new OVFPropertyTO(key, type, value, qualifiers, userConfigurable,
label, description, password, index, category); label, description, password, index, category);
} }
@ -152,7 +151,7 @@ public class OVFHelper {
if (child.getNodeName().equalsIgnoreCase("Category") || if (child.getNodeName().equalsIgnoreCase("Category") ||
child.getNodeName().endsWith(":Category")) { child.getNodeName().endsWith(":Category")) {
lastCategoryFound = child.getTextContent(); lastCategoryFound = child.getTextContent();
logger.info("Category found " + lastCategoryFound); logger.info("Category found {}", lastCategoryFound);
} else if (child.getNodeName().equalsIgnoreCase("Property") || } else if (child.getNodeName().equalsIgnoreCase("Property") ||
child.getNodeName().endsWith(":Property")) { child.getNodeName().endsWith(":Property")) {
OVFPropertyTO prop = createOVFPropertyFromNode(child, propertyIndex, lastCategoryFound); OVFPropertyTO prop = createOVFPropertyFromNode(child, propertyIndex, lastCategoryFound);
@ -250,13 +249,13 @@ public class OVFHelper {
int diskNumber = 0; int diskNumber = 0;
for (OVFVirtualHardwareItemTO diskItem : diskHardwareItems) { for (OVFVirtualHardwareItemTO diskItem : diskHardwareItems) {
if (StringUtils.isBlank(diskItem.getHostResource())) { if (StringUtils.isBlank(diskItem.getHostResource())) {
logger.error("Missing disk information for hardware item " + diskItem.getElementName() + " " + diskItem.getInstanceId()); logger.error("Missing disk information for hardware item {} {}", diskItem.getElementName(), diskItem.getInstanceId());
continue; continue;
} }
String diskId = extractDiskIdFromDiskHostResource(diskItem.getHostResource()); String diskId = extractDiskIdFromDiskHostResource(diskItem.getHostResource());
OVFDisk diskDefinition = getDiskDefinitionFromDiskId(diskId, disks); OVFDisk diskDefinition = getDiskDefinitionFromDiskId(diskId, disks);
if (diskDefinition == null) { if (diskDefinition == null) {
logger.error("Missing disk definition for disk ID " + diskId); logger.error("Missing disk definition for disk ID {}", diskId);
} }
OVFFile fileDefinition = getFileDefinitionFromDiskDefinition(diskDefinition._fileRef, files); OVFFile fileDefinition = getFileDefinitionFromDiskDefinition(diskDefinition._fileRef, files);
DatadiskTO datadiskTO = generateDiskTO(fileDefinition, diskDefinition, ovfParentPath, diskNumber, diskItem); DatadiskTO datadiskTO = generateDiskTO(fileDefinition, diskDefinition, ovfParentPath, diskNumber, diskItem);
@ -278,8 +277,8 @@ public class OVFHelper {
if (StringUtils.isNotBlank(path)) { if (StringUtils.isNotBlank(path)) {
File f = new File(path); File f = new File(path);
if (!f.exists() || f.isDirectory()) { if (!f.exists() || f.isDirectory()) {
logger.error("One of the attached disk or iso does not exists " + path); logger.error("One of the attached disk or ISOs does not exists {}", path);
throw new InternalErrorException("One of the attached disk or iso as stated on OVF does not exists " + path); throw new InternalErrorException("One of the attached disk or ISOs as stated on OVF does not exists " + path);
} }
} }
Long capacity = disk != null ? disk._capacity : file._size; Long capacity = disk != null ? disk._capacity : file._size;
@ -334,9 +333,7 @@ public class OVFHelper {
od._controller = getControllerType(items, od._diskId); od._controller = getControllerType(items, od._diskId);
vd.add(od); vd.add(od);
} }
if (logger.isTraceEnabled()) { logger.trace("Found {} disk definitions", vd.size());
logger.trace(String.format("found %d disk definitions",vd.size()));
}
return vd; return vd;
} }
@ -366,9 +363,7 @@ public class OVFHelper {
vf.add(of); vf.add(of);
} }
} }
if (logger.isTraceEnabled()) { logger.trace("Found {} file definitions in {}", vf.size(), ovfFile.getPath());
logger.trace(String.format("found %d file definitions in %s",vf.size(), ovfFile.getPath()));
}
return vf; return vf;
} }
@ -506,7 +501,7 @@ public class OVFHelper {
outfile.write(writer.toString()); outfile.write(writer.toString());
outfile.close(); outfile.close();
} catch (IOException | TransformerException e) { } catch (IOException | TransformerException e) {
logger.info("Unexpected exception caught while rewriting OVF:" + e.getMessage(), e); logger.info("Unexpected exception caught while rewriting OVF: {}", e.getMessage(), e);
throw new CloudRuntimeException(e); throw new CloudRuntimeException(e);
} }
} }
@ -522,9 +517,7 @@ public class OVFHelper {
public List<OVFNetworkTO> getNetPrerequisitesFromDocument(Document doc) throws InternalErrorException { public List<OVFNetworkTO> getNetPrerequisitesFromDocument(Document doc) throws InternalErrorException {
if (doc == null) { if (doc == null) {
if (logger.isTraceEnabled()) { logger.trace("No document to parse; returning no prerequisite networks");
logger.trace("no document to parse; returning no prerequisite networks");
}
return Collections.emptyList(); return Collections.emptyList();
} }
@ -540,9 +533,7 @@ public class OVFHelper {
private void matchNicsToNets(Map<String, OVFNetworkTO> nets, Node systemElement) { private void matchNicsToNets(Map<String, OVFNetworkTO> nets, Node systemElement) {
final DocumentTraversal traversal = (DocumentTraversal) systemElement; final DocumentTraversal traversal = (DocumentTraversal) systemElement;
final NodeIterator iterator = traversal.createNodeIterator(systemElement, NodeFilter.SHOW_ELEMENT, null, true); final NodeIterator iterator = traversal.createNodeIterator(systemElement, NodeFilter.SHOW_ELEMENT, null, true);
if (logger.isTraceEnabled()) { logger.trace("Starting out with {} network-prerequisites, parsing hardware", nets.size());
logger.trace(String.format("starting out with %d network-prerequisites, parsing hardware",nets.size()));
}
int nicCount = 0; int nicCount = 0;
for (Node n = iterator.nextNode(); n != null; n = iterator.nextNode()) { for (Node n = iterator.nextNode(); n != null; n = iterator.nextNode()) {
final Element e = (Element) n; final Element e = (Element) n;
@ -550,9 +541,7 @@ public class OVFHelper {
nicCount++; nicCount++;
String name = e.getTextContent(); // should be in our nets String name = e.getTextContent(); // should be in our nets
if(nets.get(name) == null) { if(nets.get(name) == null) {
if(logger.isInfoEnabled()) { logger.info("Found a NIC definition without a Network definition by name {}, adding it to the list.", name);
logger.info(String.format("found a nic definition without a network definition byname %s, adding it to the list.", name));
}
nets.put(name, new OVFNetworkTO()); nets.put(name, new OVFNetworkTO());
} }
OVFNetworkTO thisNet = nets.get(name); OVFNetworkTO thisNet = nets.get(name);
@ -561,9 +550,7 @@ public class OVFHelper {
} }
} }
} }
if (logger.isTraceEnabled()) { logger.trace("Ending up with {} network-prerequisites, parsed {} nics", nets.size(), nicCount);
logger.trace(String.format("ending up with %d network-prerequisites, parsed %d nics", nets.size(), nicCount));
}
} }
/** /**
@ -585,7 +572,7 @@ public class OVFHelper {
int addressOnParent = Integer.parseInt(addressOnParentStr); int addressOnParent = Integer.parseInt(addressOnParentStr);
nic.setAddressOnParent(addressOnParent); nic.setAddressOnParent(addressOnParent);
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
logger.warn("Encountered element of type \"AddressOnParent\", that could not be parse to an integer number: " + addressOnParentStr); logger.warn("Encountered element of type \"AddressOnParent\", that could not be parse to an integer number: {}", addressOnParentStr);
} }
boolean automaticAllocation = StringUtils.isNotBlank(automaticAllocationStr) && Boolean.parseBoolean(automaticAllocationStr); boolean automaticAllocation = StringUtils.isNotBlank(automaticAllocationStr) && Boolean.parseBoolean(automaticAllocationStr);
@ -597,7 +584,7 @@ public class OVFHelper {
int instanceId = Integer.parseInt(instanceIdStr); int instanceId = Integer.parseInt(instanceIdStr);
nic.setInstanceID(instanceId); nic.setInstanceID(instanceId);
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
logger.warn("Encountered element of type \"InstanceID\", that could not be parse to an integer number: " + instanceIdStr); logger.warn("Encountered element of type \"InstanceID\", that could not be parse to an integer number: {}", instanceIdStr);
} }
nic.setResourceSubType(resourceSubType); nic.setResourceSubType(resourceSubType);
@ -630,9 +617,7 @@ public class OVFHelper {
nets.put(networkName,network); nets.put(networkName,network);
} }
if (logger.isTraceEnabled()) { logger.trace("Found {} Networks in Template", nets.size());
logger.trace(String.format("found %d networks in template", nets.size()));
}
return nets; return nets;
} }
@ -771,7 +756,7 @@ public class OVFHelper {
try { try {
return Long.parseLong(value); return Long.parseLong(value);
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
logger.debug("Could not parse the value: " + value + ", ignoring it"); logger.debug("Could not parse the value: {}, ignoring it", value);
} }
} }
return null; return null;
@ -782,7 +767,7 @@ public class OVFHelper {
try { try {
return Integer.parseInt(value); return Integer.parseInt(value);
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
logger.debug("Could not parse the value: " + value + ", ignoring it"); logger.debug("Could not parse the value: {}, ignoring it", value);
} }
} }
return null; return null;
@ -820,7 +805,7 @@ public class OVFHelper {
try { try {
compressedLicense = compressOVFEula(eulaLicense); compressedLicense = compressOVFEula(eulaLicense);
} catch (IOException e) { } catch (IOException e) {
logger.error("Could not compress the license for info " + eulaInfo); logger.error("Could not compress the license for info {}", eulaInfo);
continue; continue;
} }
OVFEulaSectionTO eula = new OVFEulaSectionTO(eulaInfo, compressedLicense, eulaIndex); OVFEulaSectionTO eula = new OVFEulaSectionTO(eulaInfo, compressedLicense, eulaIndex);

View File

@ -54,7 +54,7 @@ public class OVFParser {
documentBuilderFactory.setNamespaceAware(true); documentBuilderFactory.setNamespaceAware(true);
documentBuilder = documentBuilderFactory.newDocumentBuilder(); documentBuilder = documentBuilderFactory.newDocumentBuilder();
} catch (ParserConfigurationException e) { } catch (ParserConfigurationException e) {
logger.error("Cannot start the OVF parser: " + e.getMessage(), e); logger.error("Cannot start the OVF parser: {}", e.getMessage(), e);
} }
} }
@ -70,7 +70,7 @@ public class OVFParser {
try { try {
return documentBuilder.parse(new File(ovfFilePath)); return documentBuilder.parse(new File(ovfFilePath));
} catch (SAXException | IOException e) { } catch (SAXException | IOException e) {
logger.error("Error parsing " + ovfFilePath + " " + e.getMessage(), e); logger.error("Error parsing {} {}", ovfFilePath, e.getMessage(), e);
return null; return null;
} }
} }

View File

@ -0,0 +1,182 @@
// 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.to;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class VirtualMachineMetadataTO {
// VM details
private final String name;
private final String internalName;
private final String displayName;
private final String instanceUuid;
private final Integer cpuCores;
private final Integer memory;
private final Long created;
private final Long started;
// Owner details
private final String ownerDomainUuid;
private final String ownerDomainName;
private final String ownerAccountUuid;
private final String ownerAccountName;
private final String ownerProjectUuid;
private final String ownerProjectName;
// Host and service offering
private final String serviceOfferingName;
private final List<String> serviceOfferingHostTags;
// zone, pod, and cluster details
private final String zoneName;
private final String zoneUuid;
private final String podName;
private final String podUuid;
private final String clusterName;
private final String clusterUuid;
// resource tags
private final Map<String, String> resourceTags;
public VirtualMachineMetadataTO(
String name, String internalName, String displayName, String instanceUuid, Integer cpuCores, Integer memory, Long created, Long started,
String ownerDomainUuid, String ownerDomainName, String ownerAccountUuid, String ownerAccountName, String ownerProjectUuid, String ownerProjectName,
String serviceOfferingName, List<String> serviceOfferingHostTags,
String zoneName, String zoneUuid, String podName, String podUuid, String clusterName, String clusterUuid, Map<String, String> resourceTags) {
/*
* Something failed in the metadata shall not be a fatal error, the VM can still be started
* Thus, the unknown fields just get an explicit "unknown" value so it can be fixed in case
* there are bugs on some execution paths.
* */
this.name = (name != null) ? name : "unknown";
this.internalName = (internalName != null) ? internalName : "unknown";
this.displayName = (displayName != null) ? displayName : "unknown";
this.instanceUuid = (instanceUuid != null) ? instanceUuid : "unknown";
this.cpuCores = (cpuCores != null) ? cpuCores : -1;
this.memory = (memory != null) ? memory : -1;
this.created = (created != null) ? created : 0;
this.started = (started != null) ? started : 0;
this.ownerDomainUuid = (ownerDomainUuid != null) ? ownerDomainUuid : "unknown";
this.ownerDomainName = (ownerDomainName != null) ? ownerDomainName : "unknown";
this.ownerAccountUuid = (ownerAccountUuid != null) ? ownerAccountUuid : "unknown";
this.ownerAccountName = (ownerAccountName != null) ? ownerAccountName : "unknown";
this.ownerProjectUuid = (ownerProjectUuid != null) ? ownerProjectUuid : "unknown";
this.ownerProjectName = (ownerProjectName != null) ? ownerProjectName : "unknown";
this.serviceOfferingName = (serviceOfferingName != null) ? serviceOfferingName : "unknown";
this.serviceOfferingHostTags = (serviceOfferingHostTags != null) ? serviceOfferingHostTags : new ArrayList<>();
this.zoneName = (zoneName != null) ? zoneName : "unknown";
this.zoneUuid = (zoneUuid != null) ? zoneUuid : "unknown";
this.podName = (podName != null) ? podName : "unknown";
this.podUuid = (podUuid != null) ? podUuid : "unknown";
this.clusterName = (clusterName != null) ? clusterName : "unknown";
this.clusterUuid = (clusterUuid != null) ? clusterUuid : "unknown";
this.resourceTags = (resourceTags != null) ? resourceTags : new HashMap<>();
}
public String getName() {
return name;
}
public String getInternalName() {
return internalName;
}
public String getDisplayName() {
return displayName;
}
public String getInstanceUuid() {
return instanceUuid;
}
public Integer getCpuCores() {
return cpuCores;
}
public Integer getMemory() {
return memory;
}
public Long getCreated() { return created; }
public Long getStarted() {
return started;
}
public String getOwnerDomainUuid() {
return ownerDomainUuid;
}
public String getOwnerDomainName() {
return ownerDomainName;
}
public String getOwnerAccountUuid() {
return ownerAccountUuid;
}
public String getOwnerAccountName() {
return ownerAccountName;
}
public String getOwnerProjectUuid() {
return ownerProjectUuid;
}
public String getOwnerProjectName() {
return ownerProjectName;
}
public String getserviceOfferingName() {
return serviceOfferingName;
}
public List<String> getserviceOfferingHostTags() {
return serviceOfferingHostTags;
}
public String getZoneName() {
return zoneName;
}
public String getZoneUuid() {
return zoneUuid;
}
public String getPodName() {
return podName;
}
public String getPodUuid() {
return podUuid;
}
public String getClusterName() {
return clusterName;
}
public String getClusterUuid() {
return clusterUuid;
}
public Map<String, String> getResourceTags() { return resourceTags; }
}

View File

@ -89,6 +89,7 @@ public class VirtualMachineTO {
private DeployAsIsInfoTO deployAsIsInfo; private DeployAsIsInfoTO deployAsIsInfo;
private String metadataManufacturer; private String metadataManufacturer;
private String metadataProductName; private String metadataProductName;
private VirtualMachineMetadataTO metadata;
public VirtualMachineTO(long id, String instanceName, VirtualMachine.Type type, int cpus, Integer speed, long minRam, long maxRam, BootloaderType bootloader, public VirtualMachineTO(long id, String instanceName, VirtualMachine.Type type, int cpus, Integer speed, long minRam, long maxRam, BootloaderType bootloader,
String os, boolean enableHA, boolean limitCpuUse, String vncPassword) { String os, boolean enableHA, boolean limitCpuUse, String vncPassword) {
@ -494,6 +495,14 @@ public class VirtualMachineTO {
this.metadataProductName = metadataProductName; this.metadataProductName = metadataProductName;
} }
public VirtualMachineMetadataTO getMetadata() {
return metadata;
}
public void setMetadata(VirtualMachineMetadataTO metadata) {
this.metadata = metadata;
}
@Override @Override
public String toString() { public String toString() {
return String.format("VM {id: \"%s\", name: \"%s\", uuid: \"%s\", type: \"%s\"}", id, name, uuid, type); return String.format("VM {id: \"%s\", name: \"%s\", uuid: \"%s\", type: \"%s\"}", id, name, uuid, type);

View File

@ -35,10 +35,10 @@ public class ListRecurringSnapshotScheduleCmd extends BaseListCmd {
//////////////// API parameters ///////////////////// //////////////// API parameters /////////////////////
///////////////////////////////////////////////////// /////////////////////////////////////////////////////
@Parameter(name = ApiConstants.SNAPSHOT_POLICY_ID, type = CommandType.LONG, description = "lists recurring snapshots by snapshot policy ID") @Parameter(name = ApiConstants.SNAPSHOT_POLICY_ID, type = CommandType.LONG, description = "Lists recurring Snapshots by Snapshot policy ID")
private Long snapshotPolicyId; private Long snapshotPolicyId;
@Parameter(name = ApiConstants.VOLUME_ID, type = CommandType.LONG, required = true, description = "list recurring snapshots by volume ID") @Parameter(name = ApiConstants.VOLUME_ID, type = CommandType.LONG, required = true, description = "List recurring Snapshots by volume ID")
private Long volumeId; private Long volumeId;
///////////////////////////////////////////////////// /////////////////////////////////////////////////////

View File

@ -22,7 +22,8 @@ public class CPU {
public enum CPUArch { public enum CPUArch {
x86("i686", 32), x86("i686", 32),
amd64("x86_64", 64), amd64("x86_64", 64),
arm64("aarch64", 64); arm64("aarch64", 64),
s390x("s390x", 64);
private final String type; private final String type;
private final int bits; private final int bits;

View File

@ -62,11 +62,11 @@ public interface DeploymentClusterPlanner extends DeploymentPlanner {
"vm.allocation.algorithm", "vm.allocation.algorithm",
"Advanced", "Advanced",
"random", "random",
"Order in which hosts within a cluster will be considered for VM allocation. The value can be 'random', 'firstfit', 'userdispersing', 'userconcentratedpod_random', 'userconcentratedpod_firstfit', or 'firstfitleastconsumed'.", "Order in which hosts within a cluster will be considered for VM allocation. The value can be 'random', 'firstfit', 'userdispersing', or 'firstfitleastconsumed'.",
true, true,
ConfigKey.Scope.Global, null, null, null, null, null, ConfigKey.Scope.Global, null, null, null, null, null,
ConfigKey.Kind.Select, ConfigKey.Kind.Select,
"random,firstfit,userdispersing,userconcentratedpod_random,userconcentratedpod_firstfit,firstfitleastconsumed"); "random,firstfit,userdispersing,firstfitleastconsumed");
/** /**
* This is called to determine list of possible clusters where a virtual * This is called to determine list of possible clusters where a virtual

View File

@ -70,7 +70,7 @@ public interface DeploymentPlanner extends Adapter {
boolean canHandle(VirtualMachineProfile vm, DeploymentPlan plan, ExcludeList avoid); boolean canHandle(VirtualMachineProfile vm, DeploymentPlan plan, ExcludeList avoid);
public enum AllocationAlgorithm { public enum AllocationAlgorithm {
random, firstfit, userdispersing, userconcentratedpod_random, userconcentratedpod_firstfit; random, firstfit, userdispersing;
} }
public enum PlannerResourceUsage { public enum PlannerResourceUsage {

View File

@ -503,6 +503,7 @@ public class EventTypes {
public static final String EVENT_S2S_VPN_CUSTOMER_GATEWAY_CREATE = "VPN.S2S.CUSTOMER.GATEWAY.CREATE"; public static final String EVENT_S2S_VPN_CUSTOMER_GATEWAY_CREATE = "VPN.S2S.CUSTOMER.GATEWAY.CREATE";
public static final String EVENT_S2S_VPN_CUSTOMER_GATEWAY_DELETE = "VPN.S2S.CUSTOMER.GATEWAY.DELETE"; public static final String EVENT_S2S_VPN_CUSTOMER_GATEWAY_DELETE = "VPN.S2S.CUSTOMER.GATEWAY.DELETE";
public static final String EVENT_S2S_VPN_CUSTOMER_GATEWAY_UPDATE = "VPN.S2S.CUSTOMER.GATEWAY.UPDATE"; public static final String EVENT_S2S_VPN_CUSTOMER_GATEWAY_UPDATE = "VPN.S2S.CUSTOMER.GATEWAY.UPDATE";
public static final String EVENT_S2S_VPN_GATEWAY_OBSOLETE_PARAMS = "VPN.S2S.GATEWAY.OBSOLETE.PARAMS";
public static final String EVENT_S2S_VPN_CONNECTION_CREATE = "VPN.S2S.CONNECTION.CREATE"; public static final String EVENT_S2S_VPN_CONNECTION_CREATE = "VPN.S2S.CONNECTION.CREATE";
public static final String EVENT_S2S_VPN_CONNECTION_DELETE = "VPN.S2S.CONNECTION.DELETE"; public static final String EVENT_S2S_VPN_CONNECTION_DELETE = "VPN.S2S.CONNECTION.DELETE";
public static final String EVENT_S2S_VPN_CONNECTION_RESET = "VPN.S2S.CONNECTION.RESET"; public static final String EVENT_S2S_VPN_CONNECTION_RESET = "VPN.S2S.CONNECTION.RESET";
@ -1151,6 +1152,7 @@ public class EventTypes {
entityEventDetails.put(EVENT_S2S_VPN_CUSTOMER_GATEWAY_CREATE, Site2SiteCustomerGateway.class); entityEventDetails.put(EVENT_S2S_VPN_CUSTOMER_GATEWAY_CREATE, Site2SiteCustomerGateway.class);
entityEventDetails.put(EVENT_S2S_VPN_CUSTOMER_GATEWAY_DELETE, Site2SiteCustomerGateway.class); entityEventDetails.put(EVENT_S2S_VPN_CUSTOMER_GATEWAY_DELETE, Site2SiteCustomerGateway.class);
entityEventDetails.put(EVENT_S2S_VPN_CUSTOMER_GATEWAY_UPDATE, Site2SiteCustomerGateway.class); entityEventDetails.put(EVENT_S2S_VPN_CUSTOMER_GATEWAY_UPDATE, Site2SiteCustomerGateway.class);
entityEventDetails.put(EVENT_S2S_VPN_GATEWAY_OBSOLETE_PARAMS, Site2SiteCustomerGateway.class);
entityEventDetails.put(EVENT_S2S_VPN_CONNECTION_CREATE, Site2SiteVpnConnection.class); entityEventDetails.put(EVENT_S2S_VPN_CONNECTION_CREATE, Site2SiteVpnConnection.class);
entityEventDetails.put(EVENT_S2S_VPN_CONNECTION_DELETE, Site2SiteVpnConnection.class); entityEventDetails.put(EVENT_S2S_VPN_CONNECTION_DELETE, Site2SiteVpnConnection.class);
entityEventDetails.put(EVENT_S2S_VPN_CONNECTION_RESET, Site2SiteVpnConnection.class); entityEventDetails.put(EVENT_S2S_VPN_CONNECTION_RESET, Site2SiteVpnConnection.class);

View File

@ -36,5 +36,4 @@ public interface HostStats {
public HostStats getHostStats(); public HostStats getHostStats();
public double getLoadAverage(); public double getLoadAverage();
// public double getXapiMemoryUsageKBs();
} }

View File

@ -45,7 +45,7 @@ public interface Ipv6Service extends PluggableService, Configurable {
static final ConfigKey<Boolean> Ipv6OfferingCreationEnabled = new ConfigKey<Boolean>("Advanced", Boolean.class, static final ConfigKey<Boolean> Ipv6OfferingCreationEnabled = new ConfigKey<Boolean>("Advanced", Boolean.class,
"ipv6.offering.enabled", "ipv6.offering.enabled",
"false", "false",
"Indicates whether creation of IPv6 network/VPC offering is enabled or not.", "Indicates whether creation of IPv6 Network/VPC offering is enabled or not.",
true); true);
static final ConfigKey<Integer> Ipv6PrefixSubnetCleanupInterval = new ConfigKey<Integer>("Advanced", Integer.class, static final ConfigKey<Integer> Ipv6PrefixSubnetCleanupInterval = new ConfigKey<Integer>("Advanced", Integer.class,

View File

@ -325,9 +325,9 @@ public interface Network extends ControlledEntity, StateObject<Network.State>, I
public enum State { public enum State {
Allocated("Indicates the network configuration is in allocated but not setup"), Setup("Indicates the network configuration is setup"), Implementing( Allocated("Indicates the Network configuration is in allocated but not setup"), Setup("Indicates the Network configuration is setup"), Implementing(
"Indicates the network configuration is being implemented"), Implemented("Indicates the network configuration is in use"), Shutdown( "Indicates the Network configuration is being implemented"), Implemented("Indicates the Network configuration is in use"), Shutdown(
"Indicates the network configuration is being destroyed"), Destroy("Indicates that the network is destroyed"); "Indicates the Network configuration is being destroyed"), Destroy("Indicates that the Network is destroyed");
protected static final StateMachine2<State, Network.Event, Network> s_fsm = new StateMachine2<State, Network.Event, Network>(); protected static final StateMachine2<State, Network.Event, Network> s_fsm = new StateMachine2<State, Network.Event, Network>();

View File

@ -125,6 +125,10 @@ public interface NetworkModel {
*/ */
String getNextAvailableMacAddressInNetwork(long networkConfigurationId) throws InsufficientAddressCapacityException; String getNextAvailableMacAddressInNetwork(long networkConfigurationId) throws InsufficientAddressCapacityException;
String getUniqueMacAddress(long macAddress, long networkId, long datacenterId) throws InsufficientAddressCapacityException;
boolean isMACUnique(String mac, long networkId);
PublicIpAddress getPublicIpAddress(long ipAddressId); PublicIpAddress getPublicIpAddress(long ipAddressId);
List<? extends Vlan> listPodVlans(long podId); List<? extends Vlan> listPodVlans(long podId);
@ -364,4 +368,8 @@ public interface NetworkModel {
boolean checkSecurityGroupSupportForNetwork(Account account, DataCenter zone, List<Long> networkIds, boolean checkSecurityGroupSupportForNetwork(Account account, DataCenter zone, List<Long> networkIds,
List<Long> securityGroupsIds); List<Long> securityGroupsIds);
default long getMacIdentifier(Long dataCenterId) {
return 0;
}
} }

View File

@ -81,7 +81,7 @@ public interface NetworkService {
true, ConfigKey.Scope.Zone); true, ConfigKey.Scope.Zone);
public static final ConfigKey<Boolean> AllowUsersToSpecifyVRMtu = new ConfigKey<>("Advanced", Boolean.class, public static final ConfigKey<Boolean> AllowUsersToSpecifyVRMtu = new ConfigKey<>("Advanced", Boolean.class,
"allow.end.users.to.specify.vr.mtu", "false", "Allow end users to specify VR MTU", "allow.end.users.to.specify.vr.mtu", "false", "Allow end Users to specify VR MTU",
true, ConfigKey.Scope.Zone); true, ConfigKey.Scope.Zone);
List<? extends Network> getIsolatedNetworksOwnedByAccountInZone(long zoneId, Account owner); List<? extends Network> getIsolatedNetworksOwnedByAccountInZone(long zoneId, Account owner);

View File

@ -78,7 +78,7 @@ public class Networks {
} }
@Override @Override
public String getValueFrom(URI uri) { public String getValueFrom(URI uri) {
return uri.getAuthority(); return uri == null ? null : uri.getAuthority();
} }
}, },
Vswitch("vs", String.class), LinkLocal(null, null), Vnet("vnet", Long.class), Storage("storage", Integer.class), Lswitch("lswitch", String.class) { Vswitch("vs", String.class), LinkLocal(null, null), Vnet("vnet", Long.class), Storage("storage", Integer.class), Lswitch("lswitch", String.class) {
@ -96,7 +96,7 @@ public class Networks {
*/ */
@Override @Override
public String getValueFrom(URI uri) { public String getValueFrom(URI uri) {
return uri.getSchemeSpecificPart(); return uri == null ? null : uri.getSchemeSpecificPart();
} }
}, },
Mido("mido", String.class), Pvlan("pvlan", String.class), Mido("mido", String.class), Pvlan("pvlan", String.class),
@ -177,7 +177,7 @@ public class Networks {
* @return the scheme as BroadcastDomainType * @return the scheme as BroadcastDomainType
*/ */
public static BroadcastDomainType getSchemeValue(URI uri) { public static BroadcastDomainType getSchemeValue(URI uri) {
return toEnumValue(uri.getScheme()); return toEnumValue(uri == null ? null : uri.getScheme());
} }
/** /**
@ -191,7 +191,7 @@ public class Networks {
if (com.cloud.dc.Vlan.UNTAGGED.equalsIgnoreCase(str)) { if (com.cloud.dc.Vlan.UNTAGGED.equalsIgnoreCase(str)) {
return Native; return Native;
} }
return getSchemeValue(new URI(str)); return getSchemeValue(str == null ? null : new URI(str));
} }
/** /**
@ -220,7 +220,7 @@ public class Networks {
* @return the host part as String * @return the host part as String
*/ */
public String getValueFrom(URI uri) { public String getValueFrom(URI uri) {
return uri.getHost(); return uri == null ? null : uri.getHost();
} }
/** /**
@ -243,7 +243,7 @@ public class Networks {
* @throws URISyntaxException the string is not even an uri * @throws URISyntaxException the string is not even an uri
*/ */
public static String getValue(String uriString) throws URISyntaxException { public static String getValue(String uriString) throws URISyntaxException {
return getValue(new URI(uriString)); return getValue(uriString == null ? null : new URI(uriString));
} }
/** /**

View File

@ -41,4 +41,6 @@ public interface PhysicalNetworkTrafficType extends InternalIdentity, Identity {
String getHypervNetworkLabel(); String getHypervNetworkLabel();
String getOvm3NetworkLabel(); String getOvm3NetworkLabel();
String getVlan();
} }

View File

@ -43,7 +43,7 @@ public interface AutoScaleVmGroup extends ControlledEntity, InternalIdentity, Di
} else if (state.equalsIgnoreCase("scaling")) { } else if (state.equalsIgnoreCase("scaling")) {
return SCALING; return SCALING;
} else { } else {
throw new IllegalArgumentException("Unexpected AutoScale VM group state : " + state); throw new IllegalArgumentException("Unexpected AutoScale Instance group state : " + state);
} }
} }
} }

View File

@ -108,8 +108,7 @@ public class LbStickinessMethod {
} }
public void addParam(String name, Boolean required, String description, Boolean isFlag) { public void addParam(String name, Boolean required, String description, Boolean isFlag) {
/* FIXME : UI is breaking if the capability string length is larger , temporarily description is commented out */ /* is this still a valid comment: FIXME : UI is breaking if the capability string length is larger , temporarily description is commented out */
// LbStickinessMethodParam param = new LbStickinessMethodParam(name, required, description);
LbStickinessMethodParam param = new LbStickinessMethodParam(name, required, " ", isFlag); LbStickinessMethodParam param = new LbStickinessMethodParam(name, required, " ", isFlag);
_paramList.add(param); _paramList.add(param);
return; return;
@ -133,7 +132,6 @@ public class LbStickinessMethod {
public void setDescription(String description) { public void setDescription(String description) {
/* FIXME : UI is breaking if the capability string length is larger , temporarily description is commented out */ /* FIXME : UI is breaking if the capability string length is larger , temporarily description is commented out */
//this.description = description;
this._description = " "; this._description = " ";
} }
} }

View File

@ -77,6 +77,8 @@ import com.cloud.alert.Alert;
import com.cloud.capacity.Capacity; import com.cloud.capacity.Capacity;
import com.cloud.dc.Pod; import com.cloud.dc.Pod;
import com.cloud.dc.Vlan; import com.cloud.dc.Vlan;
import com.cloud.deploy.DeploymentPlan;
import com.cloud.deploy.DeploymentPlanner.ExcludeList;
import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.ManagementServerException; import com.cloud.exception.ManagementServerException;
import com.cloud.exception.ResourceUnavailableException; import com.cloud.exception.ResourceUnavailableException;
@ -97,6 +99,7 @@ import com.cloud.utils.Ternary;
import com.cloud.vm.InstanceGroup; import com.cloud.vm.InstanceGroup;
import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachine.Type; import com.cloud.vm.VirtualMachine.Type;
import com.cloud.vm.VirtualMachineProfile;
/** /**
* Hopefully this is temporary. * Hopefully this is temporary.
@ -478,6 +481,19 @@ public interface ManagementService {
Ternary<Pair<List<? extends Host>, Integer>, List<? extends Host>, Map<Host, Boolean>> listHostsForMigrationOfVM(VirtualMachine vm, Long startIndex, Long pageSize, String keyword, List<VirtualMachine> vmList); Ternary<Pair<List<? extends Host>, Integer>, List<? extends Host>, Map<Host, Boolean>> listHostsForMigrationOfVM(VirtualMachine vm, Long startIndex, Long pageSize, String keyword, List<VirtualMachine> vmList);
/**
* Apply affinity group constraints and other exclusion rules for VM migration.
* This is a helper method that can be used independently for per-iteration affinity checks in DRS.
*
* @param vm The virtual machine to migrate
* @param vmProfile The VM profile
* @param plan The deployment plan
* @param vmList List of VMs with current/simulated placements for affinity processing
* @return ExcludeList containing hosts to avoid
*/
ExcludeList applyAffinityConstraints(VirtualMachine vm, VirtualMachineProfile vmProfile,
DeploymentPlan plan, List<VirtualMachine> vmList);
/** /**
* List storage pools for live migrating of a volume. The API returns list of all pools in the cluster to which the * 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. In case of vSphere datastore cluster storage pools, * volume can be migrated. Current pool is not included in the list. In case of vSphere datastore cluster storage pools,

View File

@ -128,7 +128,7 @@ public class Storage {
public static enum TemplateType { public static enum TemplateType {
ROUTING, // Router template ROUTING, // Router template
SYSTEM, /* routing, system vm template */ SYSTEM, /* routing, system vm template */
BUILTIN, /* buildin template */ BUILTIN, /* builtin template */
PERHOST, /* every host has this template, don't need to install it in secondary storage */ PERHOST, /* every host has this template, don't need to install it in secondary storage */
USER, /* User supplied template/iso */ USER, /* User supplied template/iso */
VNF, /* VNFs (virtual network functions) template */ VNF, /* VNFs (virtual network functions) template */

View File

@ -25,7 +25,7 @@ import org.apache.cloudstack.acl.RoleType;
import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.acl.SecurityChecker.AccessType;
import org.apache.cloudstack.api.command.admin.account.CreateAccountCmd; import org.apache.cloudstack.api.command.admin.account.CreateAccountCmd;
import org.apache.cloudstack.api.command.admin.user.GetUserKeysCmd; import org.apache.cloudstack.api.command.admin.user.GetUserKeysCmd;
import org.apache.cloudstack.api.command.admin.user.RegisterCmd; import org.apache.cloudstack.api.command.admin.user.RegisterUserKeyCmd;
import org.apache.cloudstack.api.command.admin.user.UpdateUserCmd; import org.apache.cloudstack.api.command.admin.user.UpdateUserCmd;
import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenter;
@ -36,6 +36,7 @@ import com.cloud.offering.DiskOffering;
import com.cloud.offering.NetworkOffering; import com.cloud.offering.NetworkOffering;
import com.cloud.offering.ServiceOffering; import com.cloud.offering.ServiceOffering;
import org.apache.cloudstack.auth.UserTwoFactorAuthenticator; import org.apache.cloudstack.auth.UserTwoFactorAuthenticator;
import org.apache.cloudstack.backup.BackupOffering;
public interface AccountService { public interface AccountService {
@ -95,7 +96,7 @@ public interface AccountService {
void markUserRegistered(long userId); void markUserRegistered(long userId);
public String[] createApiKeyAndSecretKey(RegisterCmd cmd); public String[] createApiKeyAndSecretKey(RegisterUserKeyCmd cmd);
public String[] createApiKeyAndSecretKey(final long userId); public String[] createApiKeyAndSecretKey(final long userId);
@ -115,6 +116,8 @@ public interface AccountService {
void checkAccess(Account account, VpcOffering vof, DataCenter zone) throws PermissionDeniedException; void checkAccess(Account account, VpcOffering vof, DataCenter zone) throws PermissionDeniedException;
void checkAccess(Account account, BackupOffering bof) throws PermissionDeniedException;
void checkAccess(User user, ControlledEntity entity); void checkAccess(User user, ControlledEntity entity);
void checkAccess(Account account, AccessType accessType, boolean sameOwner, String apiName, ControlledEntity... entities) throws PermissionDeniedException; void checkAccess(Account account, AccessType accessType, boolean sameOwner, String apiName, ControlledEntity... entities) throws PermissionDeniedException;

View File

@ -34,7 +34,7 @@ import com.cloud.template.VirtualMachineTemplate;
public interface ResourceLimitService { public interface ResourceLimitService {
static final ConfigKey<Long> MaxAccountSecondaryStorage = new ConfigKey<>("Account Defaults", Long.class, "max.account.secondary.storage", "400", static final ConfigKey<Long> MaxAccountSecondaryStorage = new ConfigKey<>("Account Defaults", Long.class, "max.account.secondary.storage", "400",
"The default maximum secondary storage space (in GiB) that can be used for an account", false); "The default maximum secondary storage space (in GiB) that can be used for an Account", false);
static final ConfigKey<Long> MaxProjectSecondaryStorage = new ConfigKey<>("Project Defaults", Long.class, "max.project.secondary.storage", "400", static final ConfigKey<Long> MaxProjectSecondaryStorage = new ConfigKey<>("Project Defaults", Long.class, "max.project.secondary.storage", "400",
"The default maximum secondary storage space (in GiB) that can be used for a project", false); "The default maximum secondary storage space (in GiB) that can be used for a project", false);
static final ConfigKey<Long> ResourceCountCheckInterval = new ConfigKey<>("Advanced", Long.class, "resourcecount.check.interval", "300", static final ConfigKey<Long> ResourceCountCheckInterval = new ConfigKey<>("Advanced", Long.class, "resourcecount.check.interval", "300",

View File

@ -55,6 +55,9 @@ public interface VmDetailConstants {
String NIC_MULTIQUEUE_NUMBER = "nic.multiqueue.number"; String NIC_MULTIQUEUE_NUMBER = "nic.multiqueue.number";
String NIC_PACKED_VIRTQUEUES_ENABLED = "nic.packed.virtqueues.enabled"; String NIC_PACKED_VIRTQUEUES_ENABLED = "nic.packed.virtqueues.enabled";
// KVM specific, disk controllers
String KVM_SKIP_FORCE_DISK_CONTROLLER = "skip.force.disk.controller";
// Mac OSX guest specific (internal) // Mac OSX guest specific (internal)
String SMC_PRESENT = "smc.present"; String SMC_PRESENT = "smc.present";
String FIRMWARE = "firmware"; String FIRMWARE = "firmware";

View File

@ -29,10 +29,10 @@ import com.cloud.utils.fsm.StateObject;
public interface VMSnapshot extends ControlledEntity, Identity, InternalIdentity, StateObject<VMSnapshot.State> { public interface VMSnapshot extends ControlledEntity, Identity, InternalIdentity, StateObject<VMSnapshot.State> {
enum State { enum State {
Allocated("The VM snapshot is allocated but has not been created yet."), Creating("The VM snapshot is being created."), Ready( Allocated("The Instance Snapshot is allocated but has not been created yet."), Creating("The Instance Snapshot is being created."), Ready(
"The VM snapshot is ready to be used."), Reverting("The VM snapshot is being used to revert"), Expunging("The volume is being expunging"), Removed( "The Instance Snapshot is ready to be used."), Reverting("The Instance Snapshot is being used to revert"), Expunging("The volume is being expunging"), Removed(
"The volume is destroyed, and can't be recovered."), Error("The volume is in error state, and can't be recovered"), "The volume is destroyed, and can't be recovered."), Error("The volume is in error state, and can't be recovered"),
Hidden("The VM snapshot is hidden from the user and cannot be recovered."); Hidden("The Instance snapshot is hidden from the user and cannot be recovered.");
String _description; String _description;

View File

@ -132,10 +132,10 @@ public enum RoleType {
* */ * */
public static Account.Type getAccountTypeByRole(final Role role, final Account.Type defautAccountType) { public static Account.Type getAccountTypeByRole(final Role role, final Account.Type defautAccountType) {
if (role != null) { if (role != null) {
LOGGER.debug(String.format("Role [%s] is not null; therefore, we use its account type [%s].", role, defautAccountType)); LOGGER.debug("Role [{}] is not null; therefore, we use its Account type [{}].", role, defautAccountType);
return role.getRoleType().getAccountType(); return role.getRoleType().getAccountType();
} }
LOGGER.debug(String.format("Role is null; therefore, we use the default account type [%s] value.", defautAccountType)); LOGGER.debug("Role is null; therefore, we use the default Account type [{}] value.", defautAccountType);
return defautAccountType; return defautAccountType;
} }
} }

View File

@ -27,6 +27,8 @@ import com.cloud.user.Account;
import com.cloud.user.User; import com.cloud.user.User;
import com.cloud.utils.component.Adapter; import com.cloud.utils.component.Adapter;
import org.apache.cloudstack.backup.BackupOffering;
/** /**
* SecurityChecker checks the ownership and access control to objects within * SecurityChecker checks the ownership and access control to objects within
*/ */
@ -145,4 +147,6 @@ public interface SecurityChecker extends Adapter {
boolean checkAccess(Account account, NetworkOffering nof, DataCenter zone) throws PermissionDeniedException; boolean checkAccess(Account account, NetworkOffering nof, DataCenter zone) throws PermissionDeniedException;
boolean checkAccess(Account account, VpcOffering vof, DataCenter zone) throws PermissionDeniedException; boolean checkAccess(Account account, VpcOffering vof, DataCenter zone) throws PermissionDeniedException;
boolean checkAccess(Account account, BackupOffering bof) throws PermissionDeniedException;
} }

View File

@ -34,27 +34,27 @@ import com.cloud.serializer.Param;
public class AffinityGroupResponse extends BaseResponse implements ControlledViewEntityResponse { public class AffinityGroupResponse extends BaseResponse implements ControlledViewEntityResponse {
@SerializedName(ApiConstants.ID) @SerializedName(ApiConstants.ID)
@Param(description = "the ID of the affinity group") @Param(description = "The ID of the affinity group")
private String id; private String id;
@SerializedName(ApiConstants.NAME) @SerializedName(ApiConstants.NAME)
@Param(description = "the name of the affinity group") @Param(description = "The name of the affinity group")
private String name; private String name;
@SerializedName(ApiConstants.DESCRIPTION) @SerializedName(ApiConstants.DESCRIPTION)
@Param(description = "the description of the affinity group") @Param(description = "The description of the affinity group")
private String description; private String description;
@SerializedName(ApiConstants.ACCOUNT) @SerializedName(ApiConstants.ACCOUNT)
@Param(description = "the account owning the affinity group") @Param(description = "The account owning the affinity group")
private String accountName; private String accountName;
@SerializedName(ApiConstants.DOMAIN_ID) @SerializedName(ApiConstants.DOMAIN_ID)
@Param(description = "the domain ID of the affinity group") @Param(description = "The domain ID of the affinity group")
private String domainId; private String domainId;
@SerializedName(ApiConstants.DOMAIN) @SerializedName(ApiConstants.DOMAIN)
@Param(description = "the domain name of the affinity group") @Param(description = "The domain name of the affinity group")
private String domainName; private String domainName;
@SerializedName(ApiConstants.DOMAIN_PATH) @SerializedName(ApiConstants.DOMAIN_PATH)
@ -62,19 +62,19 @@ public class AffinityGroupResponse extends BaseResponse implements ControlledVie
private String domainPath; private String domainPath;
@SerializedName(ApiConstants.PROJECT_ID) @SerializedName(ApiConstants.PROJECT_ID)
@Param(description = "the project ID of the affinity group") @Param(description = "The project ID of the affinity group")
private String projectId; private String projectId;
@SerializedName(ApiConstants.PROJECT) @SerializedName(ApiConstants.PROJECT)
@Param(description = "the project name of the affinity group") @Param(description = "The project name of the affinity group")
private String projectName; private String projectName;
@SerializedName(ApiConstants.TYPE) @SerializedName(ApiConstants.TYPE)
@Param(description = "the type of the affinity group") @Param(description = "The type of the affinity group")
private String type; private String type;
@SerializedName("virtualmachineIds") @SerializedName("virtualmachineIds")
@Param(description = "virtual machine IDs associated with this affinity group") @Param(description = "Instance IDs associated with this affinity group")
private List<String> vmIdList; private List<String> vmIdList;
@SerializedName("dedicatedresources") @SerializedName("dedicatedresources")

View File

@ -29,7 +29,7 @@ import com.cloud.serializer.Param;
public class AffinityGroupTypeResponse extends BaseResponse { public class AffinityGroupTypeResponse extends BaseResponse {
@SerializedName(ApiConstants.TYPE) @SerializedName(ApiConstants.TYPE)
@Param(description = "the type of the affinity group") @Param(description = "The type of the affinity group")
private String type; private String type;
public AffinityGroupTypeResponse() { public AffinityGroupTypeResponse() {

View File

@ -74,6 +74,7 @@ public interface AlertService {
public static final AlertType ALERT_TYPE_VR_PUBLIC_IFACE_MTU = new AlertType((short)32, "ALERT.VR.PUBLIC.IFACE.MTU", true); public static final AlertType ALERT_TYPE_VR_PUBLIC_IFACE_MTU = new AlertType((short)32, "ALERT.VR.PUBLIC.IFACE.MTU", true);
public static final AlertType ALERT_TYPE_VR_PRIVATE_IFACE_MTU = new AlertType((short)32, "ALERT.VR.PRIVATE.IFACE.MTU", true); public static final AlertType ALERT_TYPE_VR_PRIVATE_IFACE_MTU = new AlertType((short)32, "ALERT.VR.PRIVATE.IFACE.MTU", true);
public static final AlertType ALERT_TYPE_EXTENSION_PATH_NOT_READY = new AlertType((short)33, "ALERT.TYPE.EXTENSION.PATH.NOT.READY", true); public static final AlertType ALERT_TYPE_EXTENSION_PATH_NOT_READY = new AlertType((short)33, "ALERT.TYPE.EXTENSION.PATH.NOT.READY", true);
public static final AlertType ALERT_TYPE_VPN_GATEWAY_OBSOLETE_PARAMETERS = new AlertType((short)34, "ALERT.S2S.VPN.GATEWAY.OBSOLETE.PARAMETERS", true);
public static final AlertType ALERT_TYPE_BACKUP_STORAGE = new AlertType(Capacity.CAPACITY_TYPE_BACKUP_STORAGE, "ALERT.STORAGE.BACKUP", true); public static final AlertType ALERT_TYPE_BACKUP_STORAGE = new AlertType(Capacity.CAPACITY_TYPE_BACKUP_STORAGE, "ALERT.STORAGE.BACKUP", true);
public static final AlertType ALERT_TYPE_OBJECT_STORAGE = new AlertType(Capacity.CAPACITY_TYPE_OBJECT_STORAGE, "ALERT.STORAGE.OBJECT", true); public static final AlertType ALERT_TYPE_OBJECT_STORAGE = new AlertType(Capacity.CAPACITY_TYPE_OBJECT_STORAGE, "ALERT.STORAGE.OBJECT", true);

View File

@ -29,28 +29,28 @@ import org.apache.cloudstack.api.response.ZoneResponse;
public abstract class AbstractGetUploadParamsCmd extends BaseCmd { public abstract class AbstractGetUploadParamsCmd extends BaseCmd {
@Parameter(name = ApiConstants.NAME, type = CommandType.STRING, required = true, description = "the name of the volume/template/iso") @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, required = true, description = "The name of the Volume/Template/ISO")
private String name; private String name;
@Parameter(name = ApiConstants.FORMAT, type = CommandType.STRING, required = true, description = "the format for the volume/template/iso. Possible values include QCOW2, OVA, " @Parameter(name = ApiConstants.FORMAT, type = CommandType.STRING, required = true, description = "The format for the Volume/Template/ISO. Possible values include QCOW2, OVA, "
+ "and VHD.") + "and VHD.")
private String format; private String format;
@Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true, description = "the ID of the zone the volume/template/iso is " @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true, description = "The ID of the zone the Volume/Template/ISO is "
+ "to be hosted on") + "to be hosted on")
private Long zoneId; private Long zoneId;
@Parameter(name = ApiConstants.CHECKSUM, type = CommandType.STRING, description = "the checksum value of this volume/template/iso " + ApiConstants.CHECKSUM_PARAMETER_PREFIX_DESCRIPTION) @Parameter(name = ApiConstants.CHECKSUM, type = CommandType.STRING, description = "The checksum value of this Volume/Template/ISO " + ApiConstants.CHECKSUM_PARAMETER_PREFIX_DESCRIPTION)
private String checksum; private String checksum;
@Parameter(name = ApiConstants.ACCOUNT, type = CommandType.STRING, description = "an optional accountName. Must be used with domainId.") @Parameter(name = ApiConstants.ACCOUNT, type = CommandType.STRING, description = "An optional accountName. Must be used with domainId.")
private String accountName; private String accountName;
@Parameter(name = ApiConstants.DOMAIN_ID, type = CommandType.UUID, entityType = DomainResponse.class, description = "an optional domainId. If the account parameter is used, " @Parameter(name = ApiConstants.DOMAIN_ID, type = CommandType.UUID, entityType = DomainResponse.class, description = "An optional domainId. If the Account parameter is used, "
+ "domainId must also be used.") + "domainId must also be used.")
private Long domainId; private Long domainId;
@Parameter(name = ApiConstants.PROJECT_ID, type = CommandType.UUID, entityType = ProjectResponse.class, description = "Upload volume/template/iso for the project") @Parameter(name = ApiConstants.PROJECT_ID, type = CommandType.UUID, entityType = ProjectResponse.class, description = "Upload Volume/Template/ISO for the project")
private Long projectId; private Long projectId;
public String getName() { public String getName() {

View File

@ -375,6 +375,7 @@ public class ApiConstants {
public static final String MAC_ADDRESS = "macaddress"; public static final String MAC_ADDRESS = "macaddress";
public static final String MAC_ADDRESSES = "macaddresses"; public static final String MAC_ADDRESSES = "macaddresses";
public static final String MANUAL_UPGRADE = "manualupgrade"; public static final String MANUAL_UPGRADE = "manualupgrade";
public static final String MATCH_TYPE = "matchtype";
public static final String MAX = "max"; public static final String MAX = "max";
public static final String MAX_SNAPS = "maxsnaps"; public static final String MAX_SNAPS = "maxsnaps";
public static final String MAX_BACKUPS = "maxbackups"; public static final String MAX_BACKUPS = "maxbackups";
@ -1215,6 +1216,7 @@ public class ApiConstants {
public static final String DOCKER_REGISTRY_EMAIL = "dockerregistryemail"; public static final String DOCKER_REGISTRY_EMAIL = "dockerregistryemail";
public static final String ISO_NAME = "isoname"; public static final String ISO_NAME = "isoname";
public static final String ISO_STATE = "isostate"; public static final String ISO_STATE = "isostate";
public static final String ISO_URL = "isourl";
public static final String SEMANTIC_VERSION = "semanticversion"; public static final String SEMANTIC_VERSION = "semanticversion";
public static final String KUBERNETES_VERSION_ID = "kubernetesversionid"; public static final String KUBERNETES_VERSION_ID = "kubernetesversionid";
public static final String KUBERNETES_VERSION_NAME = "kubernetesversionname"; public static final String KUBERNETES_VERSION_NAME = "kubernetesversionname";
@ -1363,6 +1365,10 @@ public class ApiConstants {
public static final String RECURSIVE_DOMAINS = "recursivedomains"; public static final String RECURSIVE_DOMAINS = "recursivedomains";
public static final String VPN_CUSTOMER_GATEWAY_PARAMETERS = "vpncustomergatewayparameters";
public static final String OBSOLETE_PARAMETERS = "obsoleteparameters";
public static final String EXCLUDED_PARAMETERS = "excludedparameters";
/** /**
* This enum specifies IO Drivers, each option controls specific policies on I/O. * This enum specifies IO Drivers, each option controls specific policies on I/O.
* Qemu guests support "threads" and "native" options Since 0.8.8 ; "io_uring" is supported Since 6.3.0 (QEMU 5.0). * Qemu guests support "threads" and "native" options Since 0.8.8 ; "io_uring" is supported Since 6.3.0 (QEMU 5.0).

View File

@ -19,7 +19,7 @@ package org.apache.cloudstack.api;
public abstract class BaseAsyncCreateCustomIdCmd extends BaseAsyncCreateCmd { public abstract class BaseAsyncCreateCustomIdCmd extends BaseAsyncCreateCmd {
@Parameter(name = ApiConstants.CUSTOM_ID, @Parameter(name = ApiConstants.CUSTOM_ID,
type = CommandType.STRING, type = CommandType.STRING,
description = "an optional field, in case you want to set a custom id to the resource. Allowed to Root Admins only") description = "An optional field, in case you want to set a custom id to the resource. Allowed to Root Admins only")
private String customId; private String customId;
public String getCustomId() { public String getCustomId() {

View File

@ -21,7 +21,7 @@ import org.apache.cloudstack.acl.RoleType;
public abstract class BaseAsyncCustomIdCmd extends BaseAsyncCmd { public abstract class BaseAsyncCustomIdCmd extends BaseAsyncCmd {
@Parameter(name = ApiConstants.CUSTOM_ID, @Parameter(name = ApiConstants.CUSTOM_ID,
type = CommandType.STRING, type = CommandType.STRING,
description = "an optional field, in case you want to set a custom id to the resource. Allowed to Root Admins only", since = "4.4", authorized = {RoleType.Admin}) description = "An optional field, in case you want to set a custom id to the resource. Allowed to Root Admins only", since = "4.4", authorized = {RoleType.Admin})
private String customId; private String customId;
public String getCustomId() { public String getCustomId() {

View File

@ -25,7 +25,7 @@ import org.apache.cloudstack.api.response.ListResponse;
import org.apache.cloudstack.backup.BackupOffering; import org.apache.cloudstack.backup.BackupOffering;
import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.context.CallContext;
public abstract class BaseBackupListCmd extends BaseListCmd { public abstract class BaseBackupListCmd extends BaseListAccountResourcesCmd {
protected void setupResponseBackupOfferingsList(final List<BackupOffering> offerings, final Integer count) { protected void setupResponseBackupOfferingsList(final List<BackupOffering> offerings, final Integer count) {
final ListResponse<BackupOfferingResponse> response = new ListResponse<>(); final ListResponse<BackupOfferingResponse> response = new ListResponse<>();

View File

@ -382,7 +382,7 @@ public abstract class BaseCmd {
if (roleIsAllowed) { if (roleIsAllowed) {
validFields.add(field); validFields.add(field);
} else { } else {
logger.debug("Ignoring parameter " + parameterAnnotation.name() + " as the caller is not authorized to pass it in"); logger.debug("Ignoring parameter {} as the caller is not authorized to pass it in", parameterAnnotation.name());
} }
} }

View File

@ -22,7 +22,7 @@ public abstract class BaseCustomIdCmd extends BaseCmd {
@Parameter(name = ApiConstants.CUSTOM_ID, @Parameter(name = ApiConstants.CUSTOM_ID,
type = CommandType.STRING, type = CommandType.STRING,
description = "an optional field, in case you want to set a custom id to the resource. Allowed to Root Admins only", since = "4.4", authorized = {RoleType.Admin}) description = "An optional field, in case you want to set a custom id to the resource. Allowed to Root Admins only", since = "4.4", authorized = {RoleType.Admin})
private String customId; private String customId;
public String getCustomId() { public String getCustomId() {

View File

@ -19,7 +19,7 @@ package org.apache.cloudstack.api;
public abstract class BaseListAccountResourcesCmd extends BaseListDomainResourcesCmd implements IBaseListAccountResourcesCmd { public abstract class BaseListAccountResourcesCmd extends BaseListDomainResourcesCmd implements IBaseListAccountResourcesCmd {
@Parameter(name = ApiConstants.ACCOUNT, type = CommandType.STRING, description = "list resources by account. Must be used with the domainId parameter.") @Parameter(name = ApiConstants.ACCOUNT, type = CommandType.STRING, description = "List resources by Account. Must be used with the domainId parameter.")
private String accountName; private String accountName;
@Override @Override

View File

@ -27,10 +27,10 @@ public abstract class BaseListDomainResourcesCmd extends BaseListCmd implements
@Parameter(name = ApiConstants.DOMAIN_ID, @Parameter(name = ApiConstants.DOMAIN_ID,
type = CommandType.UUID, type = CommandType.UUID,
entityType = DomainResponse.class, entityType = DomainResponse.class,
description = "list only resources belonging to the domain specified") description = "List only resources belonging to the domain specified")
private Long domainId; private Long domainId;
@Parameter(name = ApiConstants.IS_RECURSIVE, type = CommandType.BOOLEAN, description = "defaults to false," @Parameter(name = ApiConstants.IS_RECURSIVE, type = CommandType.BOOLEAN, description = "Defaults to false,"
+ " but if true, lists all resources from the parent specified by the domainId till leaves.") + " but if true, lists all resources from the parent specified by the domainId till leaves.")
private Boolean recursive; private Boolean recursive;

View File

@ -20,7 +20,7 @@ import org.apache.cloudstack.api.response.ProjectResponse;
public abstract class BaseListProjectAndAccountResourcesCmd extends BaseListAccountResourcesCmd implements IBaseListProjectAndAccountResourcesCmd { public abstract class BaseListProjectAndAccountResourcesCmd extends BaseListAccountResourcesCmd implements IBaseListProjectAndAccountResourcesCmd {
@Parameter(name = ApiConstants.PROJECT_ID, type = CommandType.UUID, entityType = ProjectResponse.class, description = "list objects by project; if projectid=-1 lists All VMs") @Parameter(name = ApiConstants.PROJECT_ID, type = CommandType.UUID, entityType = ProjectResponse.class, description = "List objects by project; if projectid=-1 lists All Instances")
private Long projectId; private Long projectId;
@Override @Override

View File

@ -19,7 +19,7 @@ package org.apache.cloudstack.api;
import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.BooleanUtils;
public abstract class BaseListRetrieveOnlyResourceCountCmd extends BaseListTaggedResourcesCmd { public abstract class BaseListRetrieveOnlyResourceCountCmd extends BaseListTaggedResourcesCmd {
@Parameter(name = ApiConstants.RETRIEVE_ONLY_RESOURCE_COUNT, type = CommandType.BOOLEAN, description = "makes the API's response contains only the resource count") @Parameter(name = ApiConstants.RETRIEVE_ONLY_RESOURCE_COUNT, type = CommandType.BOOLEAN, description = "Makes the API's response contains only the resource count")
private Boolean retrieveOnlyResourceCount; private Boolean retrieveOnlyResourceCount;
public Boolean getRetrieveOnlyResourceCount() { public Boolean getRetrieveOnlyResourceCount() {

View File

@ -33,7 +33,7 @@ public abstract class BaseListTemplateOrIsoPermissionsCmd extends BaseCmd implem
//////////////// API parameters ///////////////////// //////////////// API parameters /////////////////////
///////////////////////////////////////////////////// /////////////////////////////////////////////////////
@Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = TemplatePermissionsResponse.class, required = true, description = "the template ID") @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = TemplatePermissionsResponse.class, required = true, description = "The Template ID")
private Long id; private Long id;
///////////////////////////////////////////////////// /////////////////////////////////////////////////////

View File

@ -25,11 +25,11 @@ public abstract class BaseResponse implements ResponseObject {
private transient String objectName; private transient String objectName;
@SerializedName(ApiConstants.JOB_ID) @SerializedName(ApiConstants.JOB_ID)
@Param(description = "the UUID of the latest async job acting on this object") @Param(description = "The UUID of the latest async job acting on this object")
protected String jobId; protected String jobId;
@SerializedName(ApiConstants.JOB_STATUS) @SerializedName(ApiConstants.JOB_STATUS)
@Param(description = "the current status of the latest async job acting on this object") @Param(description = "The current status of the latest async job acting on this object")
private Integer jobStatus; private Integer jobStatus;
public BaseResponse() { public BaseResponse() {

View File

@ -22,7 +22,7 @@ import com.google.gson.annotations.SerializedName;
public abstract class BaseResponseWithAnnotations extends BaseResponse { public abstract class BaseResponseWithAnnotations extends BaseResponse {
@SerializedName(ApiConstants.HAS_ANNOTATIONS) @SerializedName(ApiConstants.HAS_ANNOTATIONS)
@Param(description = "true if the entity/resource has annotations") @Param(description = "True if the entity/resource has annotations")
private Boolean hasAnnotation; private Boolean hasAnnotation;
public Boolean hasAnnotation() { public Boolean hasAnnotation() {

View File

@ -22,11 +22,11 @@ import com.google.gson.annotations.SerializedName;
public abstract class BaseResponseWithAssociatedNetwork extends BaseResponseWithAnnotations { public abstract class BaseResponseWithAssociatedNetwork extends BaseResponseWithAnnotations {
@SerializedName(ApiConstants.ASSOCIATED_NETWORK_ID) @SerializedName(ApiConstants.ASSOCIATED_NETWORK_ID)
@Param(description = "the ID of the Network associated with this private gateway") @Param(description = "The ID of the Network associated with this private gateway")
private String associatedNetworkId; private String associatedNetworkId;
@SerializedName(ApiConstants.ASSOCIATED_NETWORK) @SerializedName(ApiConstants.ASSOCIATED_NETWORK)
@Param(description = "the name of the Network associated with this private gateway") @Param(description = "The name of the Network associated with this private gateway")
private String associatedNetworkName; private String associatedNetworkName;
public void setAssociatedNetworkId(String associatedNetworkId) { public void setAssociatedNetworkId(String associatedNetworkId) {

View File

@ -26,7 +26,7 @@ import com.google.gson.annotations.SerializedName;
public abstract class BaseResponseWithTagInformation extends BaseResponseWithAnnotations { public abstract class BaseResponseWithTagInformation extends BaseResponseWithAnnotations {
@SerializedName(ApiConstants.TAGS) @SerializedName(ApiConstants.TAGS)
@Param(description = "the list of resource tags associated", responseObject = ResourceTagResponse.class) @Param(description = "The list of resource tags associated", responseObject = ResourceTagResponse.class)
protected Set<ResourceTagResponse> tags; protected Set<ResourceTagResponse> tags;
public void addTag(ResourceTagResponse tag) { public void addTag(ResourceTagResponse tag) {

View File

@ -30,49 +30,49 @@ public abstract class BaseUpdateTemplateOrIsoCmd extends BaseCmd {
//////////////// API parameters ///////////////////// //////////////// API parameters /////////////////////
///////////////////////////////////////////////////// /////////////////////////////////////////////////////
@Parameter(name = ApiConstants.BOOTABLE, type = CommandType.BOOLEAN, description = "true if image is bootable, false otherwise; available only for updateIso API") @Parameter(name = ApiConstants.BOOTABLE, type = CommandType.BOOLEAN, description = "True if image is bootable, false otherwise; available only for updateIso API")
private Boolean bootable; private Boolean bootable;
@Parameter(name = ApiConstants.REQUIRES_HVM, type = CommandType.BOOLEAN, description = "true if the template requires HVM, false otherwise; available only for updateTemplate API") @Parameter(name = ApiConstants.REQUIRES_HVM, type = CommandType.BOOLEAN, description = "True if the Template requires HVM, false otherwise; available only for updateTemplate API")
private Boolean requiresHvm; private Boolean requiresHvm;
@Parameter(name = ApiConstants.DISPLAY_TEXT, type = CommandType.STRING, description = "the display text of the image", length = 4096) @Parameter(name = ApiConstants.DISPLAY_TEXT, type = CommandType.STRING, description = "The display text of the image", length = 4096)
private String displayText; private String displayText;
@Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = TemplateResponse.class, required = true, description = "the ID of the image file") @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = TemplateResponse.class, required = true, description = "The ID of the image file")
private Long id; private Long id;
@Parameter(name = ApiConstants.NAME, type = CommandType.STRING, description = "the name of the image file") @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, description = "The name of the image file")
private String templateName; private String templateName;
@Parameter(name = ApiConstants.OS_TYPE_ID, @Parameter(name = ApiConstants.OS_TYPE_ID,
type = CommandType.UUID, type = CommandType.UUID,
entityType = GuestOSResponse.class, entityType = GuestOSResponse.class,
description = "the ID of the OS type that best represents the OS of this image.") description = "The ID of the OS type that best represents the OS of this image.")
private Long osTypeId; private Long osTypeId;
@Parameter(name = ApiConstants.FORCE_UPDATE_OS_TYPE, type = CommandType.BOOLEAN, since = "4.21", description = "Force OS type update. Warning: Updating OS type will " + @Parameter(name = ApiConstants.FORCE_UPDATE_OS_TYPE, type = CommandType.BOOLEAN, since = "4.21", description = "Force OS type update. Warning: Updating OS type will " +
"update the guest OS configuration for all the existing Instances deployed with this template/iso, which may affect their behavior.") "update the guest OS configuration for all the existing Instances deployed with this template/iso, which may affect their behavior.")
private Boolean forceUpdateOsType; private Boolean forceUpdateOsType;
@Parameter(name = ApiConstants.FORMAT, type = CommandType.STRING, description = "the format for the image") @Parameter(name = ApiConstants.FORMAT, type = CommandType.STRING, description = "The format for the image")
private String format; private String format;
@Parameter(name = ApiConstants.PASSWORD_ENABLED, type = CommandType.BOOLEAN, description = "true if the image supports the password reset feature; default is false") @Parameter(name = ApiConstants.PASSWORD_ENABLED, type = CommandType.BOOLEAN, description = "True if the image supports the password reset feature; default is false")
private Boolean passwordEnabled; private Boolean passwordEnabled;
@Parameter(name = ApiConstants.SSHKEY_ENABLED, type = CommandType.BOOLEAN, description = "true if the template supports the sshkey upload feature; default is false") @Parameter(name = ApiConstants.SSHKEY_ENABLED, type = CommandType.BOOLEAN, description = "True if the Template supports the SSHkey upload feature; default is false")
private Boolean sshKeyEnabled; private Boolean sshKeyEnabled;
@Parameter(name = ApiConstants.SORT_KEY, type = CommandType.INTEGER, description = "sort key of the template, integer") @Parameter(name = ApiConstants.SORT_KEY, type = CommandType.INTEGER, description = "Sort key of the Template, integer")
private Integer sortKey; private Integer sortKey;
@Parameter(name = ApiConstants.IS_DYNAMICALLY_SCALABLE, @Parameter(name = ApiConstants.IS_DYNAMICALLY_SCALABLE,
type = CommandType.BOOLEAN, type = CommandType.BOOLEAN,
description = "true if template/ISO contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory") description = "True if Template/ISO contains XS/VMWare tools in order to support dynamic scaling of Instance CPU/memory")
private Boolean isDynamicallyScalable; private Boolean isDynamicallyScalable;
@Parameter(name = ApiConstants.ROUTING, type = CommandType.BOOLEAN, description = "true if the template type is routing i.e., if template is used to deploy router") @Parameter(name = ApiConstants.ROUTING, type = CommandType.BOOLEAN, description = "True if the Template type is routing i.e., if Template is used to deploy router")
protected Boolean isRoutingType; protected Boolean isRoutingType;
@Parameter(name = ApiConstants.DETAILS, type = CommandType.MAP, description = "Details in key/value pairs using format details[i].keyname=keyvalue. Example: details[0].hypervisortoolsversion=xenserver61") @Parameter(name = ApiConstants.DETAILS, type = CommandType.MAP, description = "Details in key/value pairs using format details[i].keyname=keyvalue. Example: details[0].hypervisortoolsversion=xenserver61")
@ -80,11 +80,11 @@ public abstract class BaseUpdateTemplateOrIsoCmd extends BaseCmd {
@Parameter(name = ApiConstants.CLEAN_UP_DETAILS, @Parameter(name = ApiConstants.CLEAN_UP_DETAILS,
type = CommandType.BOOLEAN, type = CommandType.BOOLEAN,
description = "optional boolean field, which indicates if details should be cleaned up or not (if set to true, details removed for this resource, details field ignored; if false or not set, no action)") description = "Optional boolean field, which indicates if details should be cleaned up or not (if set to true, details removed for this resource, details field ignored; if false or not set, no action)")
private Boolean cleanupDetails; private Boolean cleanupDetails;
@Parameter(name = ApiConstants.ARCH, type = CommandType.STRING, @Parameter(name = ApiConstants.ARCH, type = CommandType.STRING,
description = "the CPU arch of the template/ISO. Valid options are: x86_64, aarch64", description = "the CPU arch of the template/ISO. Valid options are: x86_64, aarch64, s390x",
since = "4.20") since = "4.20")
private String arch; private String arch;

View File

@ -40,31 +40,31 @@ public abstract class BaseUpdateTemplateOrIsoPermissionsCmd extends BaseCmd {
@Parameter(name = ApiConstants.ACCOUNTS, @Parameter(name = ApiConstants.ACCOUNTS,
type = CommandType.LIST, type = CommandType.LIST,
collectionType = CommandType.STRING, collectionType = CommandType.STRING,
description = "a comma delimited list of accounts within caller's domain. If specified, \"op\" parameter has to be passed in.") description = "A comma delimited list of Accounts within caller's domain. If specified, \"op\" parameter has to be passed in.")
private List<String> accountNames; private List<String> accountNames;
@Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = TemplateResponse.class, required = true, description = "the template ID") @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = TemplateResponse.class, required = true, description = "The Template ID")
private Long id; private Long id;
@Parameter(name = ApiConstants.IS_FEATURED, type = CommandType.BOOLEAN, description = "true for featured template/iso, false otherwise") @Parameter(name = ApiConstants.IS_FEATURED, type = CommandType.BOOLEAN, description = "True for featured Template/ISO, false otherwise")
private Boolean featured; private Boolean featured;
@Parameter(name = ApiConstants.IS_PUBLIC, type = CommandType.BOOLEAN, description = "true for public template/iso, false for private templates/isos") @Parameter(name = ApiConstants.IS_PUBLIC, type = CommandType.BOOLEAN, description = "True for public Template/ISO, false for private Templates/ISOs")
private Boolean isPublic; private Boolean isPublic;
@Parameter(name = ApiConstants.IS_EXTRACTABLE, @Parameter(name = ApiConstants.IS_EXTRACTABLE,
type = CommandType.BOOLEAN, type = CommandType.BOOLEAN,
description = "true if the template/iso is extractable, false other wise. Can be set only by root admin") description = "True if the Template/ISO is extractable, false otherwise. Can be set only by root admin")
private Boolean isExtractable; private Boolean isExtractable;
@Parameter(name = ApiConstants.OP, type = CommandType.STRING, description = "permission operator (add, remove, reset)") @Parameter(name = ApiConstants.OP, type = CommandType.STRING, description = "Permission operator (add, remove, reset)")
private String operation; private String operation;
@Parameter(name = ApiConstants.PROJECT_IDS, @Parameter(name = ApiConstants.PROJECT_IDS,
type = CommandType.LIST, type = CommandType.LIST,
collectionType = CommandType.UUID, collectionType = CommandType.UUID,
entityType = ProjectResponse.class, entityType = ProjectResponse.class,
description = "a comma delimited list of projects. If specified, \"op\" parameter has to be passed in.") description = "A comma delimited list of projects. If specified, \"op\" parameter has to be passed in.")
private List<Long> projectIds; private List<Long> projectIds;
// /////////////////////////////////////////////////// // ///////////////////////////////////////////////////
@ -121,7 +121,7 @@ public abstract class BaseUpdateTemplateOrIsoPermissionsCmd extends BaseCmd {
SuccessResponse response = new SuccessResponse(getCommandName()); SuccessResponse response = new SuccessResponse(getCommandName());
setResponseObject(response); setResponseObject(response);
} else { } else {
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to update template/iso permissions"); throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to update Template/ISO permissions");
} }
} }
} }

View File

@ -50,12 +50,12 @@ public class CreateAccountCmd extends BaseCmd {
@Parameter(name = ApiConstants.ACCOUNT, @Parameter(name = ApiConstants.ACCOUNT,
type = CommandType.STRING, type = CommandType.STRING,
description = "Name of the account to be created. The user will be added to this newly created account. If no account is specified, the username will be used as the account name.") description = "Name of the Account to be created. The user will be added to this newly created account. If no Account is specified, the username will be used as the Account name.")
private String accountName; private String accountName;
@Parameter(name = ApiConstants.ACCOUNT_TYPE, @Parameter(name = ApiConstants.ACCOUNT_TYPE,
type = CommandType.INTEGER, type = CommandType.INTEGER,
description = "Type of the account. Specify 0 for user, 1 for root admin, and 2 for domain admin") description = "Type of the account. Specify 0 for user, 1 for root admin, and 2 for domain admin")
private Integer accountType; private Integer accountType;
@Parameter(name = ApiConstants.ROLE_ID, type = CommandType.UUID, entityType = RoleResponse.class, description = "Creates the account under the specified role.") @Parameter(name = ApiConstants.ROLE_ID, type = CommandType.UUID, entityType = RoleResponse.class, description = "Creates the account under the specified role.")
@ -64,13 +64,13 @@ public class CreateAccountCmd extends BaseCmd {
@Parameter(name = ApiConstants.DOMAIN_ID, type = CommandType.UUID, entityType = DomainResponse.class, description = "Creates the user under the specified domain.") @Parameter(name = ApiConstants.DOMAIN_ID, type = CommandType.UUID, entityType = DomainResponse.class, description = "Creates the user under the specified domain.")
private Long domainId; private Long domainId;
@Parameter(name = ApiConstants.EMAIL, type = CommandType.STRING, required = true, description = "email") @Parameter(name = ApiConstants.EMAIL, type = CommandType.STRING, required = true, description = "E-mail")
private String email; private String email;
@Parameter(name = ApiConstants.FIRSTNAME, type = CommandType.STRING, required = true, description = "firstname") @Parameter(name = ApiConstants.FIRSTNAME, type = CommandType.STRING, required = true, description = "First name")
private String firstName; private String firstName;
@Parameter(name = ApiConstants.LASTNAME, type = CommandType.STRING, required = true, description = "lastname") @Parameter(name = ApiConstants.LASTNAME, type = CommandType.STRING, required = true, description = "Last name")
private String lastName; private String lastName;
@Parameter(name = ApiConstants.PASSWORD, @Parameter(name = ApiConstants.PASSWORD,
@ -87,16 +87,16 @@ public class CreateAccountCmd extends BaseCmd {
@Parameter(name = ApiConstants.USERNAME, type = CommandType.STRING, required = true, description = "Unique username.") @Parameter(name = ApiConstants.USERNAME, type = CommandType.STRING, required = true, description = "Unique username.")
private String userName; private String userName;
@Parameter(name = ApiConstants.NETWORK_DOMAIN, type = CommandType.STRING, description = "Network domain for the account's networks") @Parameter(name = ApiConstants.NETWORK_DOMAIN, type = CommandType.STRING, description = "Network domain for the Account's Networks")
private String networkDomain; private String networkDomain;
@Parameter(name = ApiConstants.ACCOUNT_DETAILS, type = CommandType.MAP, description = "details for account used to store specific parameters") @Parameter(name = ApiConstants.ACCOUNT_DETAILS, type = CommandType.MAP, description = "Details for Account used to store specific parameters")
private Map<String, String> details; private Map<String, String> details;
@Parameter(name = ApiConstants.ACCOUNT_ID, type = CommandType.STRING, description = "Account UUID, required for adding account from external provisioning system") @Parameter(name = ApiConstants.ACCOUNT_ID, type = CommandType.STRING, description = "Account UUID, required for adding Account from external provisioning system")
private String accountUUID; private String accountUUID;
@Parameter(name = ApiConstants.USER_ID, type = CommandType.STRING, description = "User UUID, required for adding account from external provisioning system") @Parameter(name = ApiConstants.USER_ID, type = CommandType.STRING, description = "User UUID, required for adding Account from external provisioning system")
private String userUUID; private String userUUID;
///////////////////////////////////////////////////// /////////////////////////////////////////////////////

View File

@ -35,7 +35,7 @@ import org.apache.cloudstack.region.RegionService;
import com.cloud.event.EventTypes; import com.cloud.event.EventTypes;
import com.cloud.user.Account; import com.cloud.user.Account;
@APICommand(name = "deleteAccount", description = "Deletes a account, and all users associated with this account", responseObject = SuccessResponse.class, entityType = {Account.class}, @APICommand(name = "deleteAccount", description = "Deletes an Account and all Users associated with this Account", responseObject = SuccessResponse.class, entityType = {Account.class},
requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
public class DeleteAccountCmd extends BaseAsyncCmd { public class DeleteAccountCmd extends BaseAsyncCmd {
@ -79,8 +79,8 @@ public class DeleteAccountCmd extends BaseAsyncCmd {
@Override @Override
public String getEventDescription() { public String getEventDescription() {
Account account = _accountService.getAccount(getId()); Account account = _accountService.getAccount(getId());
return (account != null ? "Deleting user account " + account.getAccountName() + " (ID: " + account.getUuid() + ") and all corresponding users" return (account != null ? "Deleting user Account " + account.getAccountName() + " (ID: " + account.getUuid() + ") and all corresponding users"
: "Account delete, but this account does not exist in the system"); : "Cannot delete Account - it does not exist in the system");
} }
@Override @Override

View File

@ -50,13 +50,13 @@ public class DisableAccountCmd extends BaseAsyncCmd {
@Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = AccountResponse.class, description = "Account id") @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = AccountResponse.class, description = "Account id")
private Long id; private Long id;
@Parameter(name = ApiConstants.ACCOUNT, type = CommandType.STRING, description = "Disables specified account.") @Parameter(name = ApiConstants.ACCOUNT, type = CommandType.STRING, description = "Disables specified Account.")
private String accountName; private String accountName;
@Parameter(name = ApiConstants.DOMAIN_ID, type = CommandType.UUID, entityType = DomainResponse.class, description = "Disables specified account in this domain.") @Parameter(name = ApiConstants.DOMAIN_ID, type = CommandType.UUID, entityType = DomainResponse.class, description = "Disables specified Account in this domain.")
private Long domainId; private Long domainId;
@Parameter(name = ApiConstants.LOCK, type = CommandType.BOOLEAN, required = true, description = "If true, only lock the account; else disable the account") @Parameter(name = ApiConstants.LOCK, type = CommandType.BOOLEAN, required = true, description = "If true, only lock the Account; else disable the Account")
private Boolean lockRequested; private Boolean lockRequested;
@Inject @Inject
@ -108,7 +108,7 @@ public class DisableAccountCmd extends BaseAsyncCmd {
@Override @Override
public String getEventDescription() { public String getEventDescription() {
return "disabling account: " + getAccountName() + " in domain: " + getDomainId(); return "Disabling Account: " + getAccountName() + " in domain: " + getDomainId();
} }
@Override @Override
@ -120,7 +120,7 @@ public class DisableAccountCmd extends BaseAsyncCmd {
response.setResponseName(getCommandName()); response.setResponseName(getCommandName());
setResponseObject(response); setResponseObject(response);
} else { } else {
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, lockRequested == true ? "Failed to lock account" : "Failed to disable account"); throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, lockRequested == true ? "Failed to lock Account" : "Failed to disable Account");
} }
} }

View File

@ -46,10 +46,10 @@ public class EnableAccountCmd extends BaseCmd {
@Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = AccountResponse.class, description = "Account id") @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = AccountResponse.class, description = "Account id")
private Long id; private Long id;
@Parameter(name = ApiConstants.ACCOUNT, type = CommandType.STRING, description = "Enables specified account.") @Parameter(name = ApiConstants.ACCOUNT, type = CommandType.STRING, description = "Enables specified Account.")
private String accountName; private String accountName;
@Parameter(name = ApiConstants.DOMAIN_ID, type = CommandType.UUID, entityType = DomainResponse.class, description = "Enables specified account in this domain.") @Parameter(name = ApiConstants.DOMAIN_ID, type = CommandType.UUID, entityType = DomainResponse.class, description = "Enables specified Account in this domain.")
private Long domainId; private Long domainId;
@Inject @Inject
@ -98,7 +98,7 @@ public class EnableAccountCmd extends BaseCmd {
response.setResponseName(getCommandName()); response.setResponseName(getCommandName());
setResponseObject(response); setResponseObject(response);
} else { } else {
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to enable account"); throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to enable Account");
} }
} }

View File

@ -23,7 +23,7 @@ import org.apache.cloudstack.api.response.AccountResponse;
import com.cloud.user.Account; import com.cloud.user.Account;
@APICommand(name = "listAccounts", description = "Lists accounts and provides detailed account information for listed accounts", responseObject = AccountResponse.class, responseView = ResponseView.Full, entityType = {Account.class}, @APICommand(name = "listAccounts", description = "Lists Accounts and provides detailed Account information for listed Accounts", responseObject = AccountResponse.class, responseView = ResponseView.Full, entityType = {Account.class},
requestHasSensitiveInfo = false, responseHasSensitiveInfo = true) requestHasSensitiveInfo = false, responseHasSensitiveInfo = true)
public class ListAccountsCmdByAdmin extends ListAccountsCmd { public class ListAccountsCmdByAdmin extends ListAccountsCmd {
} }

View File

@ -28,7 +28,7 @@ import com.cloud.user.Account;
import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.exception.CloudRuntimeException;
@APICommand(name = "lockAccount", @APICommand(name = "lockAccount",
description = "This deprecated function used to locks an account. Look for the API DisableAccount instead", description = "This deprecated function used to lock an Account. Look for the API DisableAccount instead",
responseObject = AccountResponse.class, responseObject = AccountResponse.class,
entityType = {Account.class}, entityType = {Account.class},
requestHasSensitiveInfo = false, requestHasSensitiveInfo = false,
@ -47,7 +47,7 @@ public class LockAccountCmd extends BaseCmd {
type = CommandType.UUID, type = CommandType.UUID,
entityType = DomainResponse.class, entityType = DomainResponse.class,
required = true, required = true,
description = "Locks the specified account on this domain.") description = "Locks the specified Account on this domain.")
private Long domainId; private Long domainId;
///////////////////////////////////////////////////// /////////////////////////////////////////////////////
@ -78,6 +78,6 @@ public class LockAccountCmd extends BaseCmd {
@Override @Override
public void execute() { public void execute() {
throw new CloudRuntimeException("LockAccount does not lock accounts. Its implementation is disabled. Use DisableAccount instead"); throw new CloudRuntimeException("LockAccount does not lock Accounts. Its implementation is disabled. Use DisableAccount instead.");
} }
} }

View File

@ -41,7 +41,7 @@ import org.apache.cloudstack.region.RegionService;
import com.cloud.user.Account; import com.cloud.user.Account;
@APICommand(name = "updateAccount", description = "Updates account information for the authenticated user", responseObject = AccountResponse.class, entityType = {Account.class}, @APICommand(name = "updateAccount", description = "Updates Account information for the authenticated user", responseObject = AccountResponse.class, entityType = {Account.class},
responseView = ResponseView.Restricted, requestHasSensitiveInfo = false, responseHasSensitiveInfo = true) responseView = ResponseView.Restricted, requestHasSensitiveInfo = false, responseHasSensitiveInfo = true)
public class UpdateAccountCmd extends BaseCmd implements UserCmd { public class UpdateAccountCmd extends BaseCmd implements UserCmd {
@ -52,24 +52,24 @@ public class UpdateAccountCmd extends BaseCmd implements UserCmd {
@Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = AccountResponse.class, description = "Account UUID") @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = AccountResponse.class, description = "Account UUID")
private Long id; private Long id;
@Parameter(name = ApiConstants.ACCOUNT, type = CommandType.STRING, description = "Current account name") @Parameter(name = ApiConstants.ACCOUNT, type = CommandType.STRING, description = "Current Account name")
private String accountName; private String accountName;
@Parameter(name = ApiConstants.DOMAIN_ID, type = CommandType.UUID, entityType = DomainResponse.class, description = "The UUID of the domain where the account exists") @Parameter(name = ApiConstants.DOMAIN_ID, type = CommandType.UUID, entityType = DomainResponse.class, description = "The UUID of the domain where the Account exists")
private Long domainId; private Long domainId;
@Parameter(name = ApiConstants.ROLE_ID, type = CommandType.UUID, entityType = RoleResponse.class, description = "The UUID of the dynamic role to set for the account") @Parameter(name = ApiConstants.ROLE_ID, type = CommandType.UUID, entityType = RoleResponse.class, description = "The UUID of the dynamic role to set for the Account")
private Long roleId; private Long roleId;
@Parameter(name = ApiConstants.NEW_NAME, type = CommandType.STRING, description = "New name for the account") @Parameter(name = ApiConstants.NEW_NAME, type = CommandType.STRING, description = "New name for the Account")
private String newName; private String newName;
@Parameter(name = ApiConstants.NETWORK_DOMAIN, @Parameter(name = ApiConstants.NETWORK_DOMAIN,
type = CommandType.STRING, type = CommandType.STRING,
description = "Network domain for the account's networks; empty string will update domainName with NULL value") description = "Network domain for the Account's networks; empty string will update domainName with NULL value")
private String networkDomain; private String networkDomain;
@Parameter(name = ApiConstants.ACCOUNT_DETAILS, type = CommandType.MAP, description = "Details for the account used to store specific parameters") @Parameter(name = ApiConstants.ACCOUNT_DETAILS, type = CommandType.MAP, description = "Details for the Account used to store specific parameters")
private Map details; private Map details;
@Parameter(name = ApiConstants.API_KEY_ACCESS, type = CommandType.STRING, description = "Determines if Api key access for this user is enabled, disabled or inherits the value from its parent, the domain level setting api.key.access", since = "4.20.1.0", authorized = {RoleType.Admin}) @Parameter(name = ApiConstants.API_KEY_ACCESS, type = CommandType.STRING, description = "Determines if Api key access for this user is enabled, disabled or inherits the value from its parent, the domain level setting api.key.access", since = "4.20.1.0", authorized = {RoleType.Admin})
@ -144,7 +144,7 @@ public class UpdateAccountCmd extends BaseCmd implements UserCmd {
response.setResponseName(getCommandName()); response.setResponseName(getCommandName());
setResponseObject(response); setResponseObject(response);
} else { } else {
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to update account"); throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to update Account");
} }
} }

View File

@ -109,7 +109,7 @@ public class CreateRoleCmd extends RoleCmd {
} }
if (getRoleId() != null && getRoleId() < 1L) { if (getRoleId() != null && getRoleId() < 1L) {
throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Invalid role id provided"); throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Invalid role ID provided");
} }
} }

View File

@ -46,7 +46,7 @@ public class UpdateRoleCmd extends RoleCmd {
description = "ID of the role", validations = {ApiArgValidator.PositiveNumber}) description = "ID of the role", validations = {ApiArgValidator.PositiveNumber})
private Long roleId; private Long roleId;
@Parameter(name = ApiConstants.NAME, type = BaseCmd.CommandType.STRING, description = "creates a role with this unique name") @Parameter(name = ApiConstants.NAME, type = BaseCmd.CommandType.STRING, description = "Creates a role with this unique name")
private String roleName; private String roleName;
@Parameter(name = ApiConstants.DESCRIPTION, type = BaseCmd.CommandType.STRING, description = "The description of the role") @Parameter(name = ApiConstants.DESCRIPTION, type = BaseCmd.CommandType.STRING, description = "The description of the role")

View File

@ -53,7 +53,7 @@ public class UpdateRolePermissionCmd extends BaseCmd {
private Long roleId; private Long roleId;
@Parameter(name = ApiConstants.RULE_ORDER, type = CommandType.LIST, collectionType = CommandType.UUID, entityType = RolePermissionResponse.class, @Parameter(name = ApiConstants.RULE_ORDER, type = CommandType.LIST, collectionType = CommandType.UUID, entityType = RolePermissionResponse.class,
description = "The parent role permission uuid, use 0 to move this rule at the top of the list") description = "The parent role permission UUID, use 0 to move this rule at the top of the list")
private List<Long> rulePermissionOrder; private List<Long> rulePermissionOrder;
@Parameter(name = ApiConstants.RULE_ID, type = CommandType.UUID, entityType = RolePermissionResponse.class, @Parameter(name = ApiConstants.RULE_ID, type = CommandType.UUID, entityType = RolePermissionResponse.class,

View File

@ -41,7 +41,7 @@ public class CreateProjectRoleCmd extends ProjectRoleCmd {
///////////////////////////////////////////////////// /////////////////////////////////////////////////////
@Parameter(name = ApiConstants.NAME, type = BaseCmd.CommandType.STRING, required = true, @Parameter(name = ApiConstants.NAME, type = BaseCmd.CommandType.STRING, required = true,
description = "creates a project role with this unique name") description = "Creates a project role with this unique name")
private String projectRoleName; private String projectRoleName;
///////////////////////////////////////////////////// /////////////////////////////////////////////////////

View File

@ -43,7 +43,7 @@ public class UpdateProjectRoleCmd extends ProjectRoleCmd {
private Long id; private Long id;
@Parameter(name = ApiConstants.NAME, type = BaseCmd.CommandType.STRING, @Parameter(name = ApiConstants.NAME, type = BaseCmd.CommandType.STRING,
description = "creates a project role with this unique name", validations = {ApiArgValidator.NotNullOrEmpty}) description = "Creates a project role with this unique name", validations = {ApiArgValidator.NotNullOrEmpty})
private String projectRoleName; private String projectRoleName;
///////////////////////////////////////////////////// /////////////////////////////////////////////////////

View File

@ -57,7 +57,7 @@ public class UpdateProjectRolePermissionCmd extends BaseCmd {
private Long projectId; private Long projectId;
@Parameter(name = ApiConstants.RULE_ORDER, type = CommandType.LIST, collectionType = CommandType.UUID, entityType = ProjectRolePermissionResponse.class, @Parameter(name = ApiConstants.RULE_ORDER, type = CommandType.LIST, collectionType = CommandType.UUID, entityType = ProjectRolePermissionResponse.class,
description = "The parent role permission uuid, use 0 to move this rule at the top of the list") description = "ID of the parent role permission, use 0 to move this rule at the top of the list")
private List<Long> projectRulePermissionOrder; private List<Long> projectRulePermissionOrder;
@Parameter(name = ApiConstants.PROJECT_ROLE_PERMISSION_ID, type = CommandType.UUID, entityType = ProjectRolePermissionResponse.class, @Parameter(name = ApiConstants.PROJECT_ROLE_PERMISSION_ID, type = CommandType.UUID, entityType = ProjectRolePermissionResponse.class,

View File

@ -40,7 +40,7 @@ public class AcquirePodIpCmdByAdmin extends BaseCmd {
//////////////// API parameters ///////////////////// //////////////// API parameters /////////////////////
///////////////////////////////////////////////////// /////////////////////////////////////////////////////
@Parameter(name = ApiConstants.ZONE_ID, type = CommandType.STRING, entityType = ZoneResponse.class, required = true, description = "the ID of the zone") @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.STRING, entityType = ZoneResponse.class, required = true, description = "The ID of the zone")
private String zoneId; private String zoneId;
@Parameter(name = ApiConstants.POD_ID, type = CommandType.STRING, entityType = ZoneResponse.class, required = false, description = "Pod ID") @Parameter(name = ApiConstants.POD_ID, type = CommandType.STRING, entityType = ZoneResponse.class, required = false, description = "Pod ID")

View File

@ -23,7 +23,7 @@ import org.apache.cloudstack.api.command.admin.AdminCmd;
import org.apache.cloudstack.api.command.user.address.AssociateIPAddrCmd; import org.apache.cloudstack.api.command.user.address.AssociateIPAddrCmd;
import org.apache.cloudstack.api.response.IPAddressResponse; import org.apache.cloudstack.api.response.IPAddressResponse;
@APICommand(name = "associateIpAddress", description = "Acquires and associates a public IP to an account.", responseObject = IPAddressResponse.class, responseView = ResponseView.Full, @APICommand(name = "associateIpAddress", description = "Acquires and associates a public IP to an Account.", responseObject = IPAddressResponse.class, responseView = ResponseView.Full,
requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
public class AssociateIPAddrCmdByAdmin extends AssociateIPAddrCmd implements AdminCmd { public class AssociateIPAddrCmdByAdmin extends AssociateIPAddrCmd implements AdminCmd {
} }

View File

@ -24,6 +24,6 @@ import org.apache.cloudstack.api.response.IPAddressResponse;
import com.cloud.network.IpAddress; import com.cloud.network.IpAddress;
@APICommand(name = "listPublicIpAddresses", description = "Lists all public ip addresses", responseObject = IPAddressResponse.class, responseView = ResponseView.Full, @APICommand(name = "listPublicIpAddresses", description = "Lists all public IP addresses", responseObject = IPAddressResponse.class, responseView = ResponseView.Full,
requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, entityType = {IpAddress.class}) requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, entityType = {IpAddress.class})
public class ListPublicIpAddressesCmdByAdmin extends ListPublicIpAddressesCmd implements AdminCmd {} public class ListPublicIpAddressesCmdByAdmin extends ListPublicIpAddressesCmd implements AdminCmd {}

View File

@ -70,7 +70,7 @@ public class ReleasePodIpCmdByAdmin extends BaseCmd {
response.setDisplayText("IP is released successfully"); response.setDisplayText("IP is released successfully");
setResponseObject(response); setResponseObject(response);
} else { } else {
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to release Pod ip "); throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to release Pod IP");
} }
} }
} }

View File

@ -26,7 +26,7 @@ import org.apache.cloudstack.api.response.UserVmResponse;
import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachine;
@APICommand(name = "updateVMAffinityGroup", description = "Updates the affinity/anti-affinity group associations of a virtual machine. The VM has to be stopped and restarted for the " @APICommand(name = "updateVMAffinityGroup", description = "Updates the affinity/anti-affinity group associations of an Instance. The Instance has to be stopped and restarted for the "
+ "new properties to take effect.", responseObject = UserVmResponse.class, responseView = ResponseView.Full, + "new properties to take effect.", responseObject = UserVmResponse.class, responseView = ResponseView.Full,
entityType = {VirtualMachine.class}, entityType = {VirtualMachine.class},
requestHasSensitiveInfo = false, requestHasSensitiveInfo = false,

View File

@ -33,22 +33,22 @@ import org.apache.cloudstack.api.response.AnnotationResponse;
import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.context.CallContext;
import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.BooleanUtils;
@APICommand(name = "addAnnotation", description = "add an annotation.", responseObject = AnnotationResponse.class, @APICommand(name = "addAnnotation", description = "Add an annotation.", responseObject = AnnotationResponse.class,
requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, since = "4.11", authorized = {RoleType.Admin}) requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, since = "4.11", authorized = {RoleType.Admin})
public class AddAnnotationCmd extends BaseCmd { public class AddAnnotationCmd extends BaseCmd {
@Parameter(name = ApiConstants.ANNOTATION, type = CommandType.STRING, description = "the annotation text") @Parameter(name = ApiConstants.ANNOTATION, type = CommandType.STRING, description = "The annotation text")
private String annotation; private String annotation;
@Parameter(name = ApiConstants.ENTITY_TYPE, type = CommandType.STRING, description = "The following entity types are allowed VM, VOLUME, SNAPSHOT, VM_SNAPSHOT, INSTANCE_GROUP, SSH_KEYPAIR, USER_DATA, NETWORK, VPC, PUBLIC_IP_ADDRESS, VPN_CUSTOMER_GATEWAY, TEMPLATE, ISO, KUBERNETES_CLUSTER, SERVICE_OFFERING, DISK_OFFERING, NETWORK_OFFERING, ZONE, POD, CLUSTER, HOST, DOMAIN, PRIMARY_STORAGE, SECONDARY_STORAGE, VR, SYSTEM_VM, AUTOSCALE_VM_GROUP, MANAGEMENT_SERVER") @Parameter(name = ApiConstants.ENTITY_TYPE, type = CommandType.STRING, description = "The following entity types are allowed VM, VOLUME, SNAPSHOT, VM_SNAPSHOT, INSTANCE_GROUP, SSH_KEYPAIR, USER_DATA, NETWORK, VPC, PUBLIC_IP_ADDRESS, VPN_CUSTOMER_GATEWAY, TEMPLATE, ISO, KUBERNETES_CLUSTER, SERVICE_OFFERING, DISK_OFFERING, NETWORK_OFFERING, ZONE, POD, CLUSTER, HOST, DOMAIN, PRIMARY_STORAGE, SECONDARY_STORAGE, VR, SYSTEM_VM, AUTOSCALE_VM_GROUP, MANAGEMENT_SERVER")
private String entityType; private String entityType;
@Parameter(name = ApiConstants.ENTITY_ID, type = CommandType.STRING, description = "the id of the entity to annotate") @Parameter(name = ApiConstants.ENTITY_ID, type = CommandType.STRING, description = "The ID of the entity to annotate")
private String entityUuid; private String entityUuid;
@Parameter(name = ApiConstants.ADMINS_ONLY, type = CommandType.BOOLEAN, since = "4.16.0", @Parameter(name = ApiConstants.ADMINS_ONLY, type = CommandType.BOOLEAN, since = "4.16.0",
description = "the annotation is visible for admins only") description = "The annotation is visible for admins only")
private Boolean adminsOnly; private Boolean adminsOnly;
public String getAnnotation() { public String getAnnotation() {
@ -77,7 +77,7 @@ public class AddAnnotationCmd extends BaseCmd {
public void execute() public void execute()
throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException,
NetworkRuleConflictException { NetworkRuleConflictException {
Preconditions.checkNotNull(getEntityUuid(),"I have to have an entity to set an annotation on!"); Preconditions.checkNotNull(getEntityUuid(),"I need to have an entity to set an annotation on!");
Preconditions.checkState(AnnotationService.EntityType.contains(entityType),(java.lang.String)"'%s' is not a valid EntityType to put annotations on", entityType); Preconditions.checkState(AnnotationService.EntityType.contains(entityType),(java.lang.String)"'%s' is not a valid EntityType to put annotations on", entityType);
AnnotationResponse annotationResponse = annotationService.addAnnotation(this); AnnotationResponse annotationResponse = annotationService.addAnnotation(this);
annotationResponse.setResponseName(getCommandName()); annotationResponse.setResponseName(getCommandName());

View File

@ -37,22 +37,22 @@ import org.apache.commons.lang3.StringUtils;
public class ListAnnotationsCmd extends BaseListCmd { public class ListAnnotationsCmd extends BaseListCmd {
@Parameter(name = ApiConstants.ID, type = CommandType.STRING, description = "the id of the annotation") @Parameter(name = ApiConstants.ID, type = CommandType.STRING, description = "The ID of the annotation")
private String uuid; private String uuid;
@Parameter(name = ApiConstants.ENTITY_TYPE, type = CommandType.STRING, description = "the entity type") @Parameter(name = ApiConstants.ENTITY_TYPE, type = CommandType.STRING, description = "The entity type")
private String entityType; private String entityType;
@Parameter(name = ApiConstants.ENTITY_ID, type = CommandType.STRING, description = "the id of the entity for which to show annotations") @Parameter(name = ApiConstants.ENTITY_ID, type = CommandType.STRING, description = "The ID of the entity for which to show annotations")
private String entityUuid; private String entityUuid;
@Parameter(name = ApiConstants.USER_ID, type = CommandType.STRING, since = "4.16.0", @Parameter(name = ApiConstants.USER_ID, type = CommandType.STRING, since = "4.16.0",
description = "optional: the id of the user of the annotation", required = false) description = "Optional: The ID of the user of the annotation", required = false)
private String userUuid; private String userUuid;
@Parameter(name = ApiConstants.ANNOTATION_FILTER, @Parameter(name = ApiConstants.ANNOTATION_FILTER,
type = CommandType.STRING, since = "4.16.0", type = CommandType.STRING, since = "4.16.0",
description = "possible values are \"self\" and \"all\". " description = "Possible values are \"self\" and \"all\". "
+ "* self : annotations that have been created by the calling user. " + "* self : annotations that have been created by the calling user. "
+ "* all : all the annotations the calling user can access") + "* all : all the annotations the calling user can access")
private String annotationFilter; private String annotationFilter;

View File

@ -30,12 +30,12 @@ import org.apache.cloudstack.api.ServerApiException;
import org.apache.cloudstack.api.response.AnnotationResponse; import org.apache.cloudstack.api.response.AnnotationResponse;
import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.context.CallContext;
@APICommand(name = "removeAnnotation", description = "remove an annotation.", responseObject = AnnotationResponse.class, @APICommand(name = "removeAnnotation", description = "Remove an annotation.", responseObject = AnnotationResponse.class,
requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, since = "4.11", authorized = {RoleType.Admin}) requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, since = "4.11", authorized = {RoleType.Admin})
public class RemoveAnnotationCmd extends BaseCmd { public class RemoveAnnotationCmd extends BaseCmd {
@Parameter(name = ApiConstants.ID, type = CommandType.STRING, required = true, description = "the id of the annotation") @Parameter(name = ApiConstants.ID, type = CommandType.STRING, required = true, description = "The ID of the annotation")
private String uuid; private String uuid;
public String getUuid() { public String getUuid() {

View File

@ -30,7 +30,7 @@ import org.apache.cloudstack.api.ServerApiException;
import org.apache.cloudstack.api.response.AnnotationResponse; import org.apache.cloudstack.api.response.AnnotationResponse;
import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.context.CallContext;
@APICommand(name = "updateAnnotationVisibility", description = "update an annotation visibility.", @APICommand(name = "updateAnnotationVisibility", description = "Update an annotation visibility.",
responseObject = AnnotationResponse.class, responseObject = AnnotationResponse.class,
requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false,
since = "4.16", authorized = {RoleType.Admin}) since = "4.16", authorized = {RoleType.Admin})
@ -38,11 +38,11 @@ public class UpdateAnnotationVisibilityCmd extends BaseCmd {
@Parameter(name = ApiConstants.ID, type = CommandType.STRING, required = true, @Parameter(name = ApiConstants.ID, type = CommandType.STRING, required = true,
description = "the id of the annotation") description = "The ID of the annotation")
private String uuid; private String uuid;
@Parameter(name = ApiConstants.ADMINS_ONLY, type = CommandType.BOOLEAN, required = true, @Parameter(name = ApiConstants.ADMINS_ONLY, type = CommandType.BOOLEAN, required = true,
description = "the annotation is visible for admins only") description = "The annotation is visible for admins only")
private Boolean adminsOnly; private Boolean adminsOnly;
public String getUuid() { public String getUuid() {

View File

@ -32,7 +32,7 @@ import com.cloud.event.EventTypes;
import com.cloud.network.as.Counter; import com.cloud.network.as.Counter;
import com.cloud.user.Account; import com.cloud.user.Account;
@APICommand(name = "createCounter", description = "Adds metric counter for VM auto scaling", responseObject = CounterResponse.class, @APICommand(name = "createCounter", description = "Adds metric counter for Instance auto scaling", responseObject = CounterResponse.class,
requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
public class CreateCounterCmd extends BaseAsyncCreateCmd { public class CreateCounterCmd extends BaseAsyncCreateCmd {
private static final String s_name = "counterresponse"; private static final String s_name = "counterresponse";
@ -116,7 +116,7 @@ public class CreateCounterCmd extends BaseAsyncCreateCmd {
@Override @Override
public String getEventDescription() { public String getEventDescription() {
return "creating a new Counter"; return "Creating a new Counter";
} }
@Override @Override

View File

@ -32,7 +32,7 @@ import com.cloud.event.EventTypes;
import com.cloud.exception.ResourceInUseException; import com.cloud.exception.ResourceInUseException;
import com.cloud.user.Account; import com.cloud.user.Account;
@APICommand(name = "deleteCounter", description = "Deletes a counter for VM auto scaling", responseObject = SuccessResponse.class, @APICommand(name = "deleteCounter", description = "Deletes a counter for Instance auto scaling", responseObject = SuccessResponse.class,
requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
public class DeleteCounterCmd extends BaseAsyncCmd { public class DeleteCounterCmd extends BaseAsyncCmd {
@ -40,7 +40,7 @@ public class DeleteCounterCmd extends BaseAsyncCmd {
// ////////////// API parameters ///////////////////// // ////////////// API parameters /////////////////////
// /////////////////////////////////////////////////// // ///////////////////////////////////////////////////
@Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = CounterResponse.class, required = true, description = "the ID of the counter") @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = CounterResponse.class, required = true, description = "The ID of the counter")
private Long id; private Long id;
// /////////////////////////////////////////////////// // ///////////////////////////////////////////////////
@ -61,7 +61,7 @@ public class DeleteCounterCmd extends BaseAsyncCmd {
SuccessResponse response = new SuccessResponse(getCommandName()); SuccessResponse response = new SuccessResponse(getCommandName());
this.setResponseObject(response); this.setResponseObject(response);
} else { } else {
logger.warn("Failed to delete counter with Id: " + getId()); logger.warn("Failed to delete counter with Id: {}", getId());
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete counter."); throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete counter.");
} }
} }

View File

@ -27,6 +27,7 @@ import org.apache.cloudstack.api.BaseCmd;
import org.apache.cloudstack.api.Parameter; import org.apache.cloudstack.api.Parameter;
import org.apache.cloudstack.api.ServerApiException; import org.apache.cloudstack.api.ServerApiException;
import org.apache.cloudstack.api.response.BackupOfferingResponse; import org.apache.cloudstack.api.response.BackupOfferingResponse;
import org.apache.cloudstack.api.response.DomainResponse;
import org.apache.cloudstack.api.response.ZoneResponse; import org.apache.cloudstack.api.response.ZoneResponse;
import org.apache.cloudstack.backup.BackupManager; import org.apache.cloudstack.backup.BackupManager;
import org.apache.cloudstack.backup.BackupOffering; import org.apache.cloudstack.backup.BackupOffering;
@ -40,6 +41,11 @@ import com.cloud.exception.NetworkRuleConflictException;
import com.cloud.exception.ResourceAllocationException; import com.cloud.exception.ResourceAllocationException;
import com.cloud.exception.ResourceUnavailableException; import com.cloud.exception.ResourceUnavailableException;
import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.exception.CloudRuntimeException;
import org.apache.commons.collections.CollectionUtils;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
@APICommand(name = "importBackupOffering", @APICommand(name = "importBackupOffering",
description = "Imports a backup offering using a backup provider", description = "Imports a backup offering using a backup provider",
@ -55,11 +61,11 @@ public class ImportBackupOfferingCmd extends BaseAsyncCmd {
//////////////////////////////////////////////////// ////////////////////////////////////////////////////
@Parameter(name = ApiConstants.NAME, type = CommandType.STRING, required = true, @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, required = true,
description = "the name of the backup offering") description = "The name of the backup offering")
private String name; private String name;
@Parameter(name = ApiConstants.DESCRIPTION, type = CommandType.STRING, required = true, @Parameter(name = ApiConstants.DESCRIPTION, type = CommandType.STRING, required = true,
description = "the description of the backup offering") description = "The description of the backup offering")
private String description; private String description;
@Parameter(name = ApiConstants.EXTERNAL_ID, @Parameter(name = ApiConstants.EXTERNAL_ID,
@ -76,6 +82,13 @@ public class ImportBackupOfferingCmd extends BaseAsyncCmd {
description = "Whether users are allowed to create adhoc backups and backup schedules", required = true) description = "Whether users are allowed to create adhoc backups and backup schedules", required = true)
private Boolean userDrivenBackups; private Boolean userDrivenBackups;
@Parameter(name = ApiConstants.DOMAIN_ID,
type = CommandType.LIST,
collectionType = CommandType.UUID,
entityType = DomainResponse.class,
description = "the ID of the containing domain(s), null for public offerings")
private List<Long> domainIds;
///////////////////////////////////////////////////// /////////////////////////////////////////////////////
/////////////////// Accessors /////////////////////// /////////////////// Accessors ///////////////////////
///////////////////////////////////////////////////// /////////////////////////////////////////////////////
@ -100,6 +113,15 @@ public class ImportBackupOfferingCmd extends BaseAsyncCmd {
return userDrivenBackups == null ? false : userDrivenBackups; return userDrivenBackups == null ? false : userDrivenBackups;
} }
public List<Long> getDomainIds() {
if (CollectionUtils.isNotEmpty(domainIds)) {
Set<Long> set = new LinkedHashSet<>(domainIds);
domainIds.clear();
domainIds.addAll(set);
}
return domainIds;
}
///////////////////////////////////////////////////// /////////////////////////////////////////////////////
/////////////// API Implementation/////////////////// /////////////// API Implementation///////////////////
///////////////////////////////////////////////////// /////////////////////////////////////////////////////

View File

@ -25,19 +25,24 @@ import org.apache.cloudstack.api.ApiErrorCode;
import org.apache.cloudstack.api.BaseCmd; import org.apache.cloudstack.api.BaseCmd;
import org.apache.cloudstack.api.Parameter; import org.apache.cloudstack.api.Parameter;
import org.apache.cloudstack.api.ServerApiException; import org.apache.cloudstack.api.ServerApiException;
import org.apache.cloudstack.api.command.offering.DomainAndZoneIdResolver;
import org.apache.cloudstack.api.response.BackupOfferingResponse; import org.apache.cloudstack.api.response.BackupOfferingResponse;
import org.apache.cloudstack.backup.BackupManager; import org.apache.cloudstack.backup.BackupManager;
import org.apache.cloudstack.backup.BackupOffering; import org.apache.cloudstack.backup.BackupOffering;
import org.apache.cloudstack.utils.reflectiontostringbuilderutils.ReflectionToStringBuilderUtils; import org.apache.cloudstack.utils.reflectiontostringbuilderutils.ReflectionToStringBuilderUtils;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.InvalidParameterValueException;
import com.cloud.user.Account; import com.cloud.user.Account;
import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.exception.CloudRuntimeException;
import java.util.List;
import java.util.function.LongFunction;
@APICommand(name = "updateBackupOffering", description = "Updates a backup offering.", responseObject = BackupOfferingResponse.class, @APICommand(name = "updateBackupOffering", description = "Updates a backup offering.", responseObject = BackupOfferingResponse.class,
requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, since = "4.16.0") requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, since = "4.16.0")
public class UpdateBackupOfferingCmd extends BaseCmd { public class UpdateBackupOfferingCmd extends BaseCmd implements DomainAndZoneIdResolver {
@Inject @Inject
private BackupManager backupManager; private BackupManager backupManager;
@ -57,6 +62,13 @@ public class UpdateBackupOfferingCmd extends BaseCmd {
@Parameter(name = ApiConstants.ALLOW_USER_DRIVEN_BACKUPS, type = CommandType.BOOLEAN, description = "Whether to allow user driven backups or not") @Parameter(name = ApiConstants.ALLOW_USER_DRIVEN_BACKUPS, type = CommandType.BOOLEAN, description = "Whether to allow user driven backups or not")
private Boolean allowUserDrivenBackups; private Boolean allowUserDrivenBackups;
@Parameter(name = ApiConstants.DOMAIN_ID,
type = CommandType.STRING,
description = "the ID of the containing domain(s) as comma separated string, public for public offerings",
since = "4.23.0",
length = 4096)
private String domainIds;
///////////////////////////////////////////////////// /////////////////////////////////////////////////////
/////////////////// Accessors /////////////////////// /////////////////// Accessors ///////////////////////
///////////////////////////////////////////////////// /////////////////////////////////////////////////////
@ -82,7 +94,7 @@ public class UpdateBackupOfferingCmd extends BaseCmd {
@Override @Override
public void execute() { public void execute() {
try { try {
if (StringUtils.isAllEmpty(getName(), getDescription()) && getAllowUserDrivenBackups() == null) { if (StringUtils.isAllEmpty(getName(), getDescription()) && getAllowUserDrivenBackups() == null && CollectionUtils.isEmpty(getDomainIds())) {
throw new InvalidParameterValueException(String.format("Can't update Backup Offering [id: %s] because there are no parameters to be updated, at least one of the", throw new InvalidParameterValueException(String.format("Can't update Backup Offering [id: %s] because there are no parameters to be updated, at least one of the",
"following should be informed: name, description or allowUserDrivenBackups.", id)); "following should be informed: name, description or allowUserDrivenBackups.", id));
} }
@ -98,11 +110,23 @@ public class UpdateBackupOfferingCmd extends BaseCmd {
this.setResponseObject(response); this.setResponseObject(response);
} catch (CloudRuntimeException e) { } catch (CloudRuntimeException e) {
ApiErrorCode paramError = e instanceof InvalidParameterValueException ? ApiErrorCode.PARAM_ERROR : ApiErrorCode.INTERNAL_ERROR; ApiErrorCode paramError = e instanceof InvalidParameterValueException ? ApiErrorCode.PARAM_ERROR : ApiErrorCode.INTERNAL_ERROR;
logger.error(String.format("Failed to update Backup Offering [id: %s] due to: [%s].", id, e.getMessage()), e); logger.error("Failed to update Backup Offering [id: {}] due to: [{}].", id, e.getMessage(), e);
throw new ServerApiException(paramError, e.getMessage()); throw new ServerApiException(paramError, e.getMessage());
} }
} }
public List<Long> getDomainIds() {
// backupManager may be null in unit tests where the command is spied without injection.
// Avoid creating a method reference to a null receiver which causes NPE. When backupManager
// is null, pass null as the defaultDomainsProvider so resolveDomainIds will simply return
// an empty list or parse the explicit domainIds string.
LongFunction<List<Long>> defaultDomainsProvider = null;
if (backupManager != null) {
defaultDomainsProvider = backupManager::getBackupOfferingDomains;
}
return resolveDomainIds(domainIds, id, defaultDomainsProvider, "backup offering");
}
@Override @Override
public long getEntityOwnerId() { public long getEntityOwnerId() {
return Account.ACCOUNT_ID_SYSTEM; return Account.ACCOUNT_ID_SYSTEM;

View File

@ -52,7 +52,7 @@ public class ProvisionCertificateCmd extends BaseAsyncCmd {
///////////////////////////////////////////////////// /////////////////////////////////////////////////////
@Parameter(name = ApiConstants.HOST_ID, type = CommandType.UUID, required = true, entityType = HostResponse.class, @Parameter(name = ApiConstants.HOST_ID, type = CommandType.UUID, required = true, entityType = HostResponse.class,
description = "The host/agent uuid to which the certificate has to be provisioned (issued and propagated)") description = "The host/agent ID to which the certificate has to be provisioned (issued and propagated)")
private Long hostId; private Long hostId;
@Parameter(name = ApiConstants.RECONNECT, type = CommandType.BOOLEAN, @Parameter(name = ApiConstants.RECONNECT, type = CommandType.BOOLEAN,
@ -108,7 +108,7 @@ public class ProvisionCertificateCmd extends BaseAsyncCmd {
@Override @Override
public String getEventDescription() { public String getEventDescription() {
return "provisioning certificate for host id=" + hostId + " using provider=" + provider; return "Provisioning certificate for host id=" + hostId + " using provider=" + provider;
} }
@Override @Override

View File

@ -105,6 +105,6 @@ public class RevokeCertificateCmd extends BaseAsyncCmd {
@Override @Override
public String getEventDescription() { public String getEventDescription() {
return "revoking certificate with serial id=" + serial + ", cn=" + cn; return "Revoking certificate with serial id=" + serial + ", cn=" + cn;
} }
} }

View File

@ -44,48 +44,48 @@ import com.cloud.user.Account;
requestHasSensitiveInfo = true, responseHasSensitiveInfo = false) requestHasSensitiveInfo = true, responseHasSensitiveInfo = false)
public class AddClusterCmd extends BaseCmd { public class AddClusterCmd extends BaseCmd {
@Parameter(name = ApiConstants.CLUSTER_NAME, type = CommandType.STRING, required = true, description = "the cluster name") @Parameter(name = ApiConstants.CLUSTER_NAME, type = CommandType.STRING, required = true, description = "The cluster name")
private String clusterName; private String clusterName;
@Parameter(name = ApiConstants.PASSWORD, type = CommandType.STRING, required = false, description = "the password for the host") @Parameter(name = ApiConstants.PASSWORD, type = CommandType.STRING, required = false, description = "The password for the host")
private String password; private String password;
@Parameter(name = ApiConstants.POD_ID, type = CommandType.UUID, entityType = PodResponse.class, required = true, description = "the Pod ID for the host") @Parameter(name = ApiConstants.POD_ID, type = CommandType.UUID, entityType = PodResponse.class, required = true, description = "The Pod ID for the host")
private Long podId; private Long podId;
@Parameter(name = ApiConstants.URL, type = CommandType.STRING, required = false, description = "the URL") @Parameter(name = ApiConstants.URL, type = CommandType.STRING, required = false, description = "The URL")
private String url; private String url;
@Parameter(name = ApiConstants.USERNAME, type = CommandType.STRING, required = false, description = "the username for the cluster") @Parameter(name = ApiConstants.USERNAME, type = CommandType.STRING, required = false, description = "The username for the cluster")
private String username; private String username;
@Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true, description = "the Zone ID for the cluster") @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true, description = "The Zone ID for the cluster")
private Long zoneId; private Long zoneId;
@Parameter(name = ApiConstants.HYPERVISOR, @Parameter(name = ApiConstants.HYPERVISOR,
type = CommandType.STRING, type = CommandType.STRING,
required = true, required = true,
description = "hypervisor type of the cluster: XenServer,KVM,VMware,Hyperv,BareMetal,Simulator,Ovm3,External") description = "Hypervisor type of the cluster: XenServer,KVM,VMware,Hyperv,BareMetal,Simulator,Ovm3,External")
private String hypervisor; private String hypervisor;
@Parameter(name = ApiConstants.ARCH, type = CommandType.STRING, @Parameter(name = ApiConstants.ARCH, type = CommandType.STRING,
description = "the CPU arch of the cluster. Valid options are: x86_64, aarch64", description = "The CPU arch of the cluster. Valid options are: x86_64, aarch64, s390x",
since = "4.20") since = "4.20")
private String arch; private String arch;
@Parameter(name = ApiConstants.CLUSTER_TYPE, type = CommandType.STRING, required = true, description = "type of the cluster: CloudManaged, ExternalManaged") @Parameter(name = ApiConstants.CLUSTER_TYPE, type = CommandType.STRING, required = true, description = "Type of the cluster: CloudManaged, ExternalManaged")
private String clusterType; private String clusterType;
@Parameter(name = ApiConstants.ALLOCATION_STATE, type = CommandType.STRING, description = "Allocation state of this cluster for allocation of new resources") @Parameter(name = ApiConstants.ALLOCATION_STATE, type = CommandType.STRING, description = "Allocation state of this cluster for allocation of new resources")
private String allocationState; private String allocationState;
@Parameter(name = ApiConstants.VSM_USERNAME, type = CommandType.STRING, required = false, description = "the username for the VSM associated with this cluster") @Parameter(name = ApiConstants.VSM_USERNAME, type = CommandType.STRING, required = false, description = "The username for the VSM associated with this cluster")
private String vsmusername; private String vsmusername;
@Parameter(name = ApiConstants.VSM_PASSWORD, type = CommandType.STRING, required = false, description = "the password for the VSM associated with this cluster") @Parameter(name = ApiConstants.VSM_PASSWORD, type = CommandType.STRING, required = false, description = "The password for the VSM associated with this cluster")
private String vsmpassword; private String vsmpassword;
@Parameter(name = ApiConstants.VSM_IPADDRESS, type = CommandType.STRING, required = false, description = "the ipaddress of the VSM associated with this cluster") @Parameter(name = ApiConstants.VSM_IPADDRESS, type = CommandType.STRING, required = false, description = "The IP address of the VSM associated with this cluster")
private String vsmipaddress; private String vsmipaddress;
@Parameter(name = ApiConstants.VSWITCH_TYPE_GUEST_TRAFFIC, @Parameter(name = ApiConstants.VSWITCH_TYPE_GUEST_TRAFFIC,
@ -109,7 +109,7 @@ public class AddClusterCmd extends BaseCmd {
@Parameter(name = ApiConstants.VSWITCH_NAME_PUBLIC_TRAFFIC, @Parameter(name = ApiConstants.VSWITCH_NAME_PUBLIC_TRAFFIC,
type = CommandType.STRING, type = CommandType.STRING,
required = false, required = false,
description = "Name of virtual switch used for public traffic in the cluster. This would override zone wide traffic label setting.") description = "Name of virtual switch used for public traffic in the cluster. This would override zone wide traffic label setting.")
private String vSwitchNamePublicTraffic; private String vSwitchNamePublicTraffic;
@Parameter(name = ApiConstants.OVM3_POOL, type = CommandType.STRING, required = false, description = "Ovm3 native pooling enabled for cluster") @Parameter(name = ApiConstants.OVM3_POOL, type = CommandType.STRING, required = false, description = "Ovm3 native pooling enabled for cluster")

View File

@ -38,7 +38,7 @@ public class DeleteClusterCmd extends BaseCmd {
//////////////// API parameters ///////////////////// //////////////// API parameters /////////////////////
///////////////////////////////////////////////////// /////////////////////////////////////////////////////
@Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = ClusterResponse.class, required = true, description = "the cluster ID") @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = ClusterResponse.class, required = true, description = "The cluster ID")
private Long id; private Long id;
///////////////////////////////////////////////////// /////////////////////////////////////////////////////

View File

@ -52,31 +52,31 @@ public class ListClustersCmd extends BaseListCmd {
//////////////// API parameters ///////////////////// //////////////// API parameters /////////////////////
///////////////////////////////////////////////////// /////////////////////////////////////////////////////
@Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = ClusterResponse.class, description = "lists clusters by the cluster ID") @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = ClusterResponse.class, description = "Lists clusters by the cluster ID")
private Long id; private Long id;
@Parameter(name = ApiConstants.NAME, type = CommandType.STRING, description = "lists clusters by the cluster name") @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, description = "Lists clusters by the cluster name")
private String clusterName; private String clusterName;
@Parameter(name = ApiConstants.POD_ID, type = CommandType.UUID, entityType = PodResponse.class, description = "lists clusters by Pod ID") @Parameter(name = ApiConstants.POD_ID, type = CommandType.UUID, entityType = PodResponse.class, description = "Lists clusters by Pod ID")
private Long podId; private Long podId;
@Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, description = "lists clusters by Zone ID") @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, description = "Lists clusters by Zone ID")
private Long zoneId; private Long zoneId;
@Parameter(name = ApiConstants.HYPERVISOR, type = CommandType.STRING, description = "lists clusters by hypervisor type") @Parameter(name = ApiConstants.HYPERVISOR, type = CommandType.STRING, description = "Lists clusters by hypervisor type")
private String hypervisorType; private String hypervisorType;
@Parameter(name = ApiConstants.CLUSTER_TYPE, type = CommandType.STRING, description = "lists clusters by cluster type") @Parameter(name = ApiConstants.CLUSTER_TYPE, type = CommandType.STRING, description = "Lists clusters by cluster type")
private String clusterType; private String clusterType;
@Parameter(name = ApiConstants.ALLOCATION_STATE, type = CommandType.STRING, description = "lists clusters by allocation state") @Parameter(name = ApiConstants.ALLOCATION_STATE, type = CommandType.STRING, description = "Lists clusters by allocation state")
private String allocationState; private String allocationState;
@Parameter(name = ApiConstants.MANAGED_STATE, type = CommandType.STRING, description = "whether this cluster is managed by cloudstack") @Parameter(name = ApiConstants.MANAGED_STATE, type = CommandType.STRING, description = "Whether this cluster is managed by cloudstack")
private String managedState; private String managedState;
@Parameter(name = ApiConstants.SHOW_CAPACITIES, type = CommandType.BOOLEAN, description = "flag to display the capacity of the clusters") @Parameter(name = ApiConstants.SHOW_CAPACITIES, type = CommandType.BOOLEAN, description = "Flag to display the capacity of the clusters")
private Boolean showCapacities; private Boolean showCapacities;
@Parameter(name = ApiConstants.ARCH, type = CommandType.STRING, @Parameter(name = ApiConstants.ARCH, type = CommandType.STRING,

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