Compare commits

...

2799 Commits

Author SHA1 Message Date
Pierre Brunet
88495d763d feat: aggregate errors in backup runners 2026-05-20 17:10:43 +02:00
OlivierFL
e3a58ed351 chore(xo-core/xo-6): introduce form validation (#9630) 2026-05-20 14:47:32 +02:00
Mathieu
a3d8ab8dbb feat(rest-api): add RBAC check for host endpoints (#9840)
RBAC for 
  - `/hosts/:id/actions/disable`  
  - `/hosts/:id/actions/enable` 
  - `/hosts/:id/actions/management_reconfigure`
2026-05-20 13:12:00 +02:00
Florent BEAUCHAMP
680b810886 feat(backups): bi directional replication (#9806)
following the symmetrical backup PR

reuse any snapshot in common between the source and destination if 
* using incremental replication
* only one target
 * a common snapshot exists between source and destination , even from another job, based on the CONTENT_KEY

The same rule of reuse the existing VM target / create a new one of symmetrical backups applies

if the destination don't have any data between the snapshot and the active disk 
    update an existing VM 
else create a new VM but chain disks
2026-05-20 12:33:34 +02:00
spacotte-vates
a0a302430d fix(encryption): fix orphaned entry issue (#9854)
When a Redis entry has an ID but no corresponding data key, undefined was returned which caused errors when new data was added.

Error case was the configuration of a plugin failing to save.
2026-05-20 11:16:47 +02:00
Grandalf
7c9c7efb77 feat(xo-server-ipmi-sensors) : Migrated the old ipmi feature to a new plugin and added user defined sensors (#9724)
Move ipmi sensor discovery to it's own plugin and removed old logic, ships with a default configuration with the same behaviour as the old system.
The plugin can be configured via the UI, accepts an exact match for the vendor and regexes for the ipmi matching.

Tested via unit tests.

Tested with R620-L1 host on xo-lab by adding and removing Dell from configured vendors
2026-05-20 10:58:53 +02:00
Pierre Brunet
60fbce0df9 fix(backup-archive): resolve xva path relative to backup directory (#9865)
Path needs to be relative, not absolute in metadata

introduced by #9765
2026-05-20 10:48:43 +02:00
Florent BEAUCHAMP
5e717b6e04 fix(qa-text): better logs, better env , less magic (#9833)
- Add `getRequiredEnv()`: replaces all `process.env.X || 'default'` fallbacks
  with a hard throw so a missing or typo'd .env key fails immediately with a
  diagnostic message instead of silently operating on wrong defaults
- Add `logSetup.js`: dual-transport logging — console filtered by $DEBUG,
  plus a full debug-level file in /tmp for post-mortem inspection
- Add `assertRepositoryMatchesConfig()`: fails fast when a named repository
  in XO points at a different path than the one declared in .env
- Make `getAllowedCleanupPaths()` lazy so env vars are read after .env is
  loaded, not at ESM module evaluation time
- Pass full error objects (not `.message`) to all structured log calls
- Add retry logic on flaky operations and surface more detail on failures
- Fix: only purge non-empty backup repositories
- Fix: backup jobs no longer skipped under some conditions
- Fix: missing `backuprepository.delete` function
- Add `.USAGE.md` and update `README.md`
2026-05-19 16:12:33 +02:00
Florent BEAUCHAMP
ed558e9854 fix(xo-server): ssh cli tool script name (#9861) 2026-05-19 15:49:37 +02:00
Florent BEAUCHAMP
8a51c621da feat(xo-server): ssh tool to connect to hosts (#9844)
add xo-server-ssh executable that ease a connection to the hypervisors

Without parameters it list the pool uuid/master ip
With a pool uuid parameter it opens a sshg connection to the pool master 
With a pool uuid and ip, it will reuse the pool credentials to connect to the slave host
2026-05-19 15:41:37 +02:00
Enée DI IORIO
f464803053 feat(lite): create robots.txt (#9858) 2026-05-19 14:12:05 +02:00
Mathieu
09c352244e feat(mcp): support HTTP_PROXY, HTTPS_PROXY, NO_PROXY env vars (#9820)
* feat(mcp): support HTTP_PROXY, HTTPS_PROXY, NO_PROXY env vars

* chore(changelog): mention MCP proxy env var support

* refactor(mcp): delegate proxy env handling to undici
2026-05-19 12:06:21 +02:00
Mathieu
ec365231dd fix(@vates/types): explicit XoUser permission type (#9829) 2026-05-19 11:51:13 +02:00
Laudin Alessandro Molina Troconis
e0ae3db341 fix(docs): formatting and minor grammar errors in CONTRIBUTING.md (#9827) 2026-05-19 11:45:01 +02:00
spacotte-vates
16d1c7ce9d feat(rest): add revert snapshot route (#9788) 2026-05-19 10:53:05 +02:00
MlssFrncJrg
64422066c2 feat(@xen-orchestra/rest-api): add delete SR (#9464) 2026-05-18 17:06:57 +02:00
Pierre Brunet
abbdfe6cb7 fix(xo-web): update sanitize-html (#9851)
dependabot alert : https://github.com/vatesfr/xen-orchestra/security/dependabot/484
2026-05-18 16:19:13 +02:00
Joris K
4e1c8b7188 fix(xo6/tasks): issue with task type and size when accessing backup runs (#9841) 2026-05-18 16:06:36 +02:00
Pierre Brunet
100f11308a refactor(backups): rewrite and test cleanVm (#9765)
the cleanVm script was a monolith in charge of cleaning the backup, 
detecting any corrupted data, deleting the irrecoverable one, removing
and merging older backups 

this PR do a complete rewrite, using the RemoteDisk abstraction and add
tests
2026-05-18 15:15:56 +02:00
spacotte-vates
d810ea0c46 feat(rest-api): refactor registerRestApi (#9553) 2026-05-13 17:53:15 +02:00
Mathieu
2b08359bcf fix(xo-server): fix read-only role by adding acl resources (#9839) 2026-05-13 15:00:21 +02:00
Thomas Moraine
0ede983c61 docs: add TOTP setup instructions to user documentation (#9843)
Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2026-05-13 14:56:27 +02:00
OlivierFL
8c00ccefd4 chore(xo-stack): update Vite, Typescript and Vue related libs (#9703) 2026-05-13 09:49:29 +02:00
spacotte-vates
6f68b04f7e feat(xo-server): encrypt/decrypt credentials in redis (#9735)
Implements encryption and decryption feature for Redis content with migration.
2026-05-12 16:29:34 +02:00
Pierre Brunet
ee53cd0723 fix(xo5/new-job): fix cpuMask options while using vm.set (#9823) 2026-05-12 15:25:10 +02:00
Grandalf
5985ac63f2 docs: added documentation for traffic rule REST endpoints (#9816) 2026-05-11 16:27:05 +02:00
Pierre Brunet
c89c184073 feat(fs): add custom user-agent in s3 client (#9815)
clientConfig:
  apiVersion: '2006-03-01',
  customUserAgent: [ [ 'xen-orchestra-fs-4.8.0' ] ],
2026-05-11 16:02:25 +02:00
Pierre Donias
407432b4e6 feat(xo-web/config): hide passphrase by default when exporting config (#9824)
* feat(xo-web/config): hide passphrase by default when exporting config

* PR
2026-05-11 11:05:35 +02:00
Pierre Donias
acdfcb4235 fix(xo-server/config): typo in comment of ignoreVmSnapshotResources field (#9822) 2026-05-11 11:03:41 +02:00
Enée DI IORIO
070a3da7e2 feat(web-core): Update UiChip component to V8 (#9491) 2026-05-11 10:47:35 +02:00
Enée DI IORIO
7a69b2c09a feat(web-core): Update UiTag to VtsTag and add tertiary (#9811) 2026-05-11 10:20:08 +02:00
Florent BEAUCHAMP
40eab4f4e7 feat(xo-web/xo-server): import qcow2 disk from form (#9817) 2026-05-11 08:19:01 +02:00
Julien Fontanet
c5b7e7d2cb fix(complex-matcher): avoid array allocation in isRawString (#9813) 2026-05-07 17:02:25 +02:00
Thomas Moraine
fd9e271139 docs(backup_reports.md) document the transport-nagios plugin (#9819)
The transport-nagios plugin lets users monitors backup jobs from the Nagios interface.
This was previously documented only in a Xen Orchestra blog post.
This commit completes the existing Backup reports page, by explaining how
to get backup reports in Nagios, using that plugin.

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2026-05-07 16:57:47 +02:00
Grandalf
008ec6ed6a feat(rest-api): add support for txChecksumming and rateLimitting on V… (#9793) 2026-05-06 19:16:22 +02:00
Florent BEAUCHAMP
2791a8c42d feat(qa-test): console.log=>xen-orchestra/log (#9810) 2026-05-06 16:50:32 +02:00
Enée DI IORIO
d4f1798530 feat(web-core/UiInfo): upgrade UiInfo to v6 (#9773) 2026-05-06 14:43:09 +02:00
Enée DI IORIO
7ef3dd3bbe feat(web-core/UiLink): upgrade UiLink to v6 (#9784) 2026-05-06 14:21:31 +02:00
Bastien Nollet
7e144234b9 feat: release 6.4.1 (#9808) 2026-05-05 12:30:45 +02:00
Bastien Nollet
b4f0e5f64d feat: technical release (#9807) 2026-05-05 10:42:40 +02:00
Mathieu
93e38c0280 fix(rest-api): early return for admin user in acl check (#9798)
* fix(rest-api): early return for non admin user in acl check
2026-05-05 10:09:10 +02:00
Sebastien Marie
93aba2dcc7 xo-server-sdn-controller: small cleanup (#9794)
This PR contains several commits to do some code cleanup in xo-server-sdn-controller.
They doesn't belong to any specific tasks, but it was done while working in the code.
They will be better upstreamed than in my local worktree.

    unify createLogger inside xo-server-sdn-controller package : it simplifies filter usage in configuration to have debug output of the sdn-controller
    in openflow-plugin.js, avoid using log.error() for a not fatal error but use log.warn(). reorder a bit the throw code to make it more readable (the error is throw only if no plugin call successed)
2026-05-05 10:04:39 +02:00
Florent BEAUCHAMP
80ba88bb0e fix(immutable-backups): use date in filename nstead of modified time to lock/unlock + fixes
Fixes: 
* better support of localized systems
* types
* add a retry on chattr error, selinux and / or xfs seems to need a little more time before locking it
* force a complete check on startup to remove immutables files that should not be froma previous run 
* don't try to lock deleted files
2026-05-05 10:00:16 +02:00
OlivierFL
ef1fe13667 feat(xo-stack): update system pages layout (#9746) 2026-05-05 09:26:19 +02:00
Thomas Moraine
225d1699e8 docs(sdn_controller.md): openSSL 3 + sdn upgrade path: fix error in code sample (#9805)
docs(sdn_controller.md): fix error in code sample

As reported by Jon Sands, the previous version of the code sample showed the script executing line by line. It works as expected after removing the -xe

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2026-05-05 08:34:21 +02:00
Thomas Moraine
0338013220 docs(v2v migration guide): Highlight link to V2V troubleshooting doc (#9797) 2026-04-30 18:28:05 +02:00
Thomas Moraine
893b229265 docs(aclv2): fix broken links to and from the new ACLv2 page (#9796)
docs(aclv2): fix broken links

The ACLv2 page was created and merged at roughly the same time we split the documentation pages into two sections (XO6 and XO5), so the change in file structure broke some links to and from that ACLv2 page.

This commit fixes the links so that the Docusaurus build can complete without errors.

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2026-04-30 10:34:47 +02:00
Thomas Moraine
598c71ca3c docs(xo): create a dedicated xo6 doc section (#9730)
XO6 has become the default interface for Xen Orchestra,
but not all features have been ported to XO5 yet
and they don't work the same way.
To make the documentation easier to maintain
and prevent confusion,
we're moving the current pages to a new section called 'XO 5'
and create a new section for XO6-specific documentation. The XO 6 section will be completed gradually.
On top of that, this commit updates internal links and redirections
to adapt to this new doc architecture.
Finally, most of the pages in the Support category
have been moved to a new section called General support,
since these pages apply the same way to XO 5 and XO 6.

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2026-04-30 09:48:45 +02:00
Mathieu
a04c5d671f feat(acl-v2): ACL v2 documentation (#9795)
#9754 was merged into the wrong branch
2026-04-30 09:34:21 +02:00
Bastien Nollet
13f987ff3d feat(lite): 0.21.0 (#9792) 2026-04-29 17:41:36 +02:00
Bastien Nollet
ad85a881dd feat: release 6.4.0 (#9791) 2026-04-29 16:54:08 +02:00
Grandalf
b0c4b7c4cc chore(docs): update installation command to include libfuse2 (#9751) 2026-04-29 16:26:19 +02:00
Bastien Nollet
2f1155af78 chore(changelog): forgotten package (#9790) 2026-04-29 16:24:49 +02:00
Bastien Nollet
81f83d6f22 feat: technical release (#9789)
* feat(@xen-orchestra/web): 0.49.0

* feat(xo-server-sdn-controller): 1.3.1

* chore(CHANGELOG): update next
2026-04-29 14:50:23 +02:00
Pierre Briffaux
c388d998d8 fix(vm/console): fix VNC reconnection causing focus loss (#9727) 2026-04-29 14:21:41 +02:00
Elise-F
b6a303e02a fix(xo6): remove dev routes from prod (#9787)
Introduced by: #9747
2026-04-29 14:07:53 +02:00
Joris K
a1f660d31b feat(xo6): add possibility to connect or disconnect a VBD (#9726) 2026-04-29 13:54:16 +02:00
Pierre Briffaux
c632fd2032 feat(xo6/vm/new): removed new VM form alert (#9757) 2026-04-29 13:46:45 +02:00
spacotte-vates
cfb91c8a1c fix(sdn-controller): fix invalidParameters import (#9786)
Introduced by 1f0a3d8
2026-04-29 11:30:22 +02:00
Bastien Nollet
33b9106da9 feat: technical release (#9785)
* feat(@vates/types): 1.24.0

* feat(@xen-orchestra/acl): 1.0.0

* feat(@xen-orchestra/backups): 0.72.1

* feat(@xen-orchestra/web-core): 0.51.0

* feat(@xen-orchestra/mixins): 0.20.0

* feat(@xen-orchestra/proxy): 0.30.1

* feat(@xen-orchestra/rest-api): 0.30.0

* feat(@xen-orchestra/web): 0.48.0

* feat(xo-server): 5.200.0

* feat(xo-server-sdn-controller): 1.3.0

* chore(CHANGELOG): update next
2026-04-29 11:00:24 +02:00
Florent BEAUCHAMP
12fb701686 fix(backups): handle diskless vm snapshot retention (#9758)
* fix(backups): handle diskless vm snapshot retention
2026-04-29 10:25:23 +02:00
Joris K
b83a7f9758 feat(xo6): add possibility to connect or disconnect a VIF (#9756) 2026-04-29 10:20:42 +02:00
Grandalf
95b9d28e6a feat : Make "allow = false " accepted in the traffic rules Rest API (#9783) 2026-04-29 09:42:29 +02:00
Bastien Nollet
3d1df14373 fix(backups): missing logs (#9781)
Fix some types of backup and restore logs not being returned by getBackupNgLogs
Make log garbage collector treat restore logs as backup logs
2026-04-29 09:21:52 +02:00
Elise-F
0eb5c2fb65 feat(xo6): implement security tab on pool to display traffic rules (#9770) 2026-04-29 09:13:00 +02:00
Florent BEAUCHAMP
c998f99e9d fix(proxy): improve error to better differentiate between source error and import error (#9775) 2026-04-28 16:49:59 +02:00
MlssFrncJrg
ec1ebd1687 feat(xo-server): add DNS-01 challenge support (#9592) 2026-04-28 16:40:12 +02:00
Grandalf
c868b788fb feat(rest-api): add and remove vif rules routes (#9759) 2026-04-28 15:39:56 +02:00
Florent BEAUCHAMP
144d95aac7 fix(backups): failed cleanVm test (#9778)
- ancestor (blocks 1, 3) merged into child (blocks 1, 2) -> 3 blocks
 - cleanAncestor merged into clean -> 0 blocks
 grandchild is not merged so its size is not counted here
2026-04-28 14:40:41 +02:00
OlivierFL
781e8a357f feat(xo-6/network): implement network deletion (#9714) 2026-04-28 11:59:24 +02:00
Julien Porschen
a4382b7687 fix(xo-server): display of RHEL 10 icons in vm list (#9766)
os_version.distro changed from "rhel" to "red hat enterprise linux" since version 10
2026-04-28 11:32:55 +02:00
jhoustek
7378bde4a8 fix(backups): record actual incremental VHD size (#9637)
* fix(backups): record actual incremental VHD size
* fix(backups): record merged VHD size from merge result
* fix(backups): only rewrite metadata after actual merge
* fix(backups): record actual incremental VHD size
2026-04-28 11:28:12 +02:00
spacotte-vates
1f0a3d8115 feat(rest-api): add and remove network rules routes (#9448) 2026-04-28 11:27:22 +02:00
vates-bot
7f1b8949cb feat(web-stack/i18n): update Xen Orchestra 6 (#9729) 2026-04-28 11:23:59 +02:00
Mathieu
71b2e373ab feat(mcp) : openapi bootstrap (#9641)
* refactor(mcp): split monolithic index.mts into modular file structure

* feat(mcp): add markdown formatters for LLM-optimized responses

* feat(mcp): dynamic tool generation from OpenAPI spec at startup

* fix(mcp): remove orphan tests and fix mock client after rebase

* refactor(mcp): clean up dead code, consolidate formatters, use
human-format

* docs(mcp): reflect dynamic tool generation + actions flag

* refactor(mcp): generate tools directly from OpenAPI spec

* refactor(mcp): drop redundant tool annotation hints
2026-04-28 11:12:58 +02:00
Mathieu
63d4334837 feat(rest-api): ACL V2 integration (#9774) 2026-04-28 11:03:49 +02:00
Sebastien Marie
00560dd418 feat(xo-server-sdn-controller): add the openflow controller method used to pool:other-config
it will be used by xapi to know if the OpenFlow channel is used and so if port 6653 needs to be opened or not.
it might also be used later to know how to interprete of-rules in the migration path from channel to xapi-plugin, if needed.

XCPNG-2470
XO-2282
2026-04-28 09:42:57 +02:00
Sebastien Marie
d56b68d49a fix(xo-server-sdn-controller): allow pool.certificate_uninstall to fail with CERTIFICATE_DOES_NOT_EXIST
It could happens if xapi database is out-of-sync with filesystem.

As the purpose of this block is to decide if the certificate should be installed,
assume that on CERTIFICATE_DOES_NOT_EXIST you need to install the new certificate.
2026-04-28 09:42:03 +02:00
Sebastien Marie
954a611399 fix(xo-server-sdn-controller): generate psk password using cryptographically secure pseudorandom number generator
For strong passwords, you need a good source of entropy (true randomness).  
lodash.sample's randomness relies on the JavaScript runtime's PRNG, which might 
not have enough entropy.
2026-04-28 09:42:03 +02:00
Sebastien Marie
c5c3cc23a2 fix(xo-server-sdn-controller): fix VM events to propagate Network Rules on changes
on topology changes (VM started/stopped/migrated/...), network rules needs to be 
refreshed as they are installed on each port of virtual switch.

add the same logic than VIF rules to refresh them.
2026-04-28 09:42:03 +02:00
Sebastien Marie
657c639de2 fix(xo-server-sdn-controller): fix function name in error message (copy/paste error) 2026-04-28 09:42:03 +02:00
Sebastien Marie
b57765231f fix(xo-server-sdn-controller): manage network rules deletion with cookie
Enable the usage of `cookie` parameter exposed by sdn-controller xapi plugin
- https://github.com/xcp-ng/xcp-ng-xapi-plugins/pull/58

It fixes several cases where OF rules where leaked and left behind.

Upgrade notes (apply to Network Rules only, VIF Rules are not impacted):
- a new xapi-plugin with old XO is compatible (and no behaviour change)
- an old xapi-plugin with new XO will fail to communicate
  XO will try to use `cookie` but xapi-plugin will complain about invalid parameter
- a new xapi-plugin with new XO will use new behaviour
  and existing OF rules will migrate smoothly from old to new behaviour
2026-04-28 09:42:03 +02:00
Pierre Briffaux
20dfa98575 feat(xo6/host): show management IP first in hosts table IP column (#9747) 2026-04-27 16:38:42 +02:00
Elise-F
3bb0850626 fix(xo6): remove dev pages in prod (#9700) 2026-04-27 16:10:54 +02:00
Joris K
699fb196fb feat(xo6): add possibility to remove a snapshot (#9749) 2026-04-27 10:25:14 +02:00
Mathieu
00e0bee372 fix(xo-server): fix default-template still in xo after deletion (#9760)
When VM_destroy is called on a default template, it is first converted to a simple template (and then to a VM).

After converting a default template to a simple template, the object received after the xapiObjectToXo transformation has a different ID (the default template's ID = pool.uuid + template.uuid, and non default template ID = template.uuid).

Since this object does not already exist in the XO server cache(because the ID is new), XO treats it as a new object and not as an update, so the old object with ID pool.uuid + template.uuid stay in the cache
2026-04-27 08:39:51 +02:00
Florent BEAUCHAMP
da045e0de1 fix(backups): use a delta transfer even if the VM is modified (#9709)
* fix(backups): use a delta transfer even if the VM is modified
* test(backup): fix date test without timezone
* refactor(backups): extract method that check which snapshot can be reused for replica target
* reset before launching the replication
2026-04-24 19:30:51 +02:00
Bastien Nollet
fdb82ed68a feat: technical release (#9768) 2026-04-24 14:38:15 +02:00
Pierre Brunet
112c22e748 fix: add chainPhysicalUsage property in vdi object (#9708)
*add  chainPhysicalUsage property to vdi
2026-04-23 16:29:55 +02:00
Thomas Moraine
c540a49643 doc(users.md): recommend against using local users in prod environments (#9761) 2026-04-23 15:13:14 +02:00
Joris K
f6484a0695 feat(xo6): add possibility to delete a VBD (#9698) 2026-04-21 16:34:13 +02:00
Joris K
5593f27110 feat(xo6): add possibility to remove VDIs (#9689) 2026-04-21 15:41:15 +02:00
Joris K
81813c7e5b feat(xo6): add possibility to remove VIFs (#9601) 2026-04-21 15:19:06 +02:00
Mathieu
0bf0a468b5 fix(rest-api): fix other_config being ignored on VDI creation (#9695) 2026-04-21 12:35:33 +02:00
Pierre Brunet
e78275f046 docs: fix typo (#9739) 2026-04-21 11:39:49 +02:00
spacotte-vates
89c7551293 feat(rest-api): add connect/disconnect vif actions (#9643) 2026-04-21 10:25:24 +02:00
Mathieu
ed30291993 fix(rest-api): fix double slash in the href property (#9741)
Introduced by dd5f0cdaa9
2026-04-21 10:07:52 +02:00
Pierre Donias
9765435471 feat(xo-web/servers): remind users to only add pool masters (#9742) 2026-04-20 15:43:02 +02:00
spacotte-vates
e2a4bd2231 fix(changelog): add version 6.2.3 (#9743) 2026-04-20 15:10:02 +02:00
Florent BEAUCHAMP
c6ccd987e2 fix(xo-server): TLSSocket memory leak — stoppable + http-server-plus incompatibility (#9725)
xo-server uses two libraries for its web server:

    http-server-plus — a multi-protocol server facade that multiplexes HTTP and HTTPS listeners behind a single EventEmitter interface ( introduced here JsCommunity/http-server-plus@ec63f3f )
    stoppable — wraps the server to track open connections for graceful shutdown, using an internal reqsPerSocket Map (server._pendingSockets) (introduced here : 782505b )


Fix

@vates/http-server-plus (fork of JsCommunity/http-server-plus): add 'secureConnection' to the forwardedEvents list so that webServer.on('secureConnection', handler) is propagated to underlying https.Server instances at listen() time.

xo-server/src/index.mjs: register the missing handler that stoppable was supposed to add but never did:
2026-04-20 14:38:37 +02:00
Mathieu
45f810c044 feat(openmetrics): add VM status and uptime metrics (#9684)
* feat(openmetrics): add VM status and uptime metrics

* refactor(openmetrics): address review feedback on VM status/uptime
2026-04-20 14:09:28 +02:00
Bastien Nollet
fbba05bbde feat(backups): use XO Tasks (#9734)
Change the backups so they stop using their own task system, and use the same system as XO Tasks.

For the moment, it shouldn't affect the users, but when the previous backup logs will be old enough to be erased, this will allow us to have shorter loading times for backup logs.

XO-52
2026-04-17 17:49:18 +02:00
OlivierFL
9dc52f2e5b fix(xo-6/network-form): toRef causes TS error on build (#9736) 2026-04-17 17:33:06 +02:00
Mathieu
271d123395 fix(rest-api): SSE MiB limit instead percent (#9731) 2026-04-17 16:58:26 +02:00
Enée DI IORIO
88a89cc3a9 fix(changelog): fix PR link formatting in changelogs (#9732) 2026-04-17 11:46:47 +02:00
Florent BEAUCHAMP
5f7fab9d34 test(backups): replication and full mirror backups
* test(replication): test the new snapshot based replication

* fix(tests): use mergeBackupsSynchronously to ensure the backups don't fails with lock already heled error

* fix: ensure the repository that will be purged start empty

* test(backup): add test for full mirror backups
2026-04-17 11:25:38 +02:00
spacotte-vates
8df8ef0af8 feat(backups): log merge size (#9679)
XO-2050

Add the merged size in the cleanVm task log
2026-04-17 09:58:12 +02:00
Mathieu
6fbb961e7f fix(xo-server): fix 408 timeout when copying a VM with compression (#9699)
* fix compression not used on front whe copying a VM
* ensure the first bytes are ready before starting to import the VM 

---------

Co-authored-by: Florent BEAUCHAMP <florent.beauchamp@vates.tech>
2026-04-17 09:56:39 +02:00
Mathieu
6b1a2afc9c docs(@vates/types): document vm.videoram (#9694) 2026-04-16 16:05:28 +02:00
Pierre Donias
3ed8c7b689 feat(netbox): introduce sub-platforms with major version number (#9644)
Fixes #7773
See Zammad#53857

On Netbox >= 4.4 (which introduced platform hierarchies):
- If the major version number is available: create a versioned child platform (e.g. "Debian 12") with the distro-only platform (e.g. "Debian") as its parent, and assign the child to the VM
- Otherwise: keep previous behaviour and assign the VM to the distro-only platform
2026-04-16 10:31:32 +02:00
Mathieu
db9c4815b1 feat(openmetrics): add 9 missing host RRD metrics (#9696) 2026-04-15 19:27:03 +02:00
Mathieu
3e21edad4e chore: upgrade dependencies with known security vulnerabilities (#9640)
* chore: upgrade dependencies with known security vulnerabilities

* Update Node.js version in CI workflow

* chore: upgrade additional security dependencies

* chore: stabilize yarn.lock path-to-regexp entry

* chore: bump minimum version ranges for security-patched dependencies

* chore: update CHANGELOG.unreleased.md with security upgrades

* chore: revert vite upgrade to 6.4.1 (6.4.2 breaks vue-tsc)

* chore: fix vite upgrade and pin vue to 3.5.28
2026-04-15 16:56:43 +02:00
vates-bot
1b12aebb47 feat(web-stack/i18n): update Xen Orchestra 6 (#9649) 2026-04-15 14:43:26 +02:00
p-bo
2e009535aa fix(i18n): shutdown -> reboot in force reboot dialog (as in French) (#9683)
99d19012ad/%40xen-orchestra/web-core/lib/locales/fr.json (L485)
2026-04-15 14:36:13 +02:00
Elise-F
5af32683ce feat(web-core): update default tab functionality (#9651) 2026-04-15 12:40:20 +02:00
Mathieu
0fef765ce6 fix(rest-api): fix memory-leak on subscription (#9707) 2026-04-15 12:18:06 +02:00
Pierre Donias
4508e01644 fix(CHANGELOG): markdown, URLs, labels, ... (#9723) 2026-04-15 11:56:25 +02:00
Pierre Briffaux
f60203a927 fix(web): fix lost focus on vdi name input (#9685) 2026-04-15 11:29:11 +02:00
Mathieu
5ebefb0af2 feat(openmetrics): add VDI disk size and physical usage metrics (#9680)
Fixes XO-1995
2026-04-15 09:52:26 +02:00
Thomas Moraine
fa8844037f docs(xen-orchestra): upgrade docusaurus to v3.10.0 (#9682) 2026-04-15 09:40:19 +02:00
Bastien Nollet
2098c02e7f chore(xo-web): remove unused function (#9691) 2026-04-15 09:37:11 +02:00
Mathieu
c4763d5eec feat(rest-api,mcp): add ?markdown=true output format to REST API (#9624) 2026-04-15 09:30:20 +02:00
Elise-F
0b78cab0b3 fix(web-core): match npm package version (#9721)
web-core 0.49.0 was accidentally published to npm.
This commit bumps the version to match what is already on npm.
2026-04-14 18:18:38 +02:00
Elise-F
bbf3e1e446 feat: release 6.3.3 (#9720) 2026-04-14 17:19:55 +02:00
Elise-F
d94de6090b feat: technical release (#9716) 2026-04-14 15:31:22 +02:00
Bastien Nollet
816b60f11b docs(backups): extra details (#9693) 2026-04-14 14:20:07 +02:00
Florent BEAUCHAMP
6b36b41d68 fix(xo-web): toggle distributed replication (#9715)
introduced by #9433
2026-04-14 11:44:26 +02:00
spacotte-vates
e9caeafd7a fix(bakups): fix merge resume issue when child is disk chain (#9668)
* fix(bakups): fix merge resume issue when child is disk chain
2026-04-14 11:04:23 +02:00
Pierre Brunet
06c3933756 test(backups): add unit test to check #9667 (#9670) 2026-04-13 18:30:17 +02:00
Mathieu
30ff04d88a docs(mcp): add multi-instance configuration (#9705) 2026-04-13 18:25:27 +02:00
Florent BEAUCHAMP
43d86038b1 fix(backups): Fix "Storage_error ([S(Illegal_transition);[[S(Activated);S(RO)];[S(Activated);S(RW)]]])" (#9702)
* don't connect NBD server if we only want the block list
* wait for the disk to be disconnected from dom0 before trying to write into it
2026-04-13 16:46:23 +02:00
Thomas Moraine
415207d1ba docs(intro_backup.md): fix broken youtube embed (#9701) 2026-04-13 10:41:57 +02:00
spacotte-vates
b21e5e8c53 fix(backups): fix vhd directory merge speed regression (#9692)
* fix(backups): fix vhd directory merge speed regression

* add changelog
2026-04-13 09:35:40 +02:00
OlivierFL
aa605639e4 feat(xo-6): network creation forms (#9629) 2026-04-10 17:35:21 +02:00
Elise-F
8ecaa6d817 fix(xo6): increase SSE ping timeout (#9681)
Introduced by #9375
2026-04-09 10:14:54 +02:00
Mathieu
76655a9e05 fix(@xen-orchestra/immutable-backups): fix missing prepublishOnly entry (#9687)
See zammad#51952
2026-04-08 16:12:20 +02:00
Elise-F
58b56a0749 fix(XO6): 'please wait' page not displayed on dev pages (#9686) 2026-04-08 14:41:50 +02:00
Thomas Moraine
99d19012ad docs(xo): replace some XO5 screenshots with the XO6 versions (#9678) 2026-04-07 09:24:38 +02:00
Elise-F
c1e5f2e8d7 feat: release XO 6.3.2 (#9676) 2026-04-03 15:21:41 +02:00
Elise-F
372a2be21d feat: technical release (#9673) 2026-04-03 10:47:59 +02:00
Florent BEAUCHAMP
3acd35142c fix(backups): don't fail incremental replication when the VM has VTPM (#9671) 2026-04-03 10:06:44 +02:00
Florent BEAUCHAMP
28c5e5f138 fix(backups): schedule reference is missing (#9667)
introduced by #9635
2026-04-02 14:47:00 +02:00
Elise-F
a6c508be46 feat(lite): 0.20.0 (#9666) 2026-04-01 16:27:01 +02:00
Elise-F
875ceb7cab feat: release XO 6.3.1 (#9665) 2026-04-01 15:08:02 +02:00
Thomas Moraine
d98dd78168 docs(manage-infrastructure.md): fix formatting errors in info panels (#9664)
Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2026-04-01 13:07:04 +02:00
Elise-F
df0c69c023 feat: technical release (#9663) 2026-04-01 10:37:53 +02:00
Mathieu
df7ffbb90c fix(web-core): fix objects store not updated (#9660)
* fix(web-core): fix objects store not updated
2026-04-01 10:10:23 +02:00
Mathieu
8553f1cd08 fix(rest-api): fix no such VDI for /vms/:id/(dashboard|vdis) (#9662)
* fix(rest-api): fix no such VDI for /vms/:id/(dashboard|vdis)
2026-04-01 10:07:10 +02:00
Florent BEAUCHAMP
41de7528bf fix(backups): full when going from 6.2 to 6.3 (#9661) 2026-04-01 09:48:55 +02:00
Elise-F
bfb0a052ef feat: release XO 6.3.0 (#9658) 2026-03-31 16:37:31 +02:00
Elise-F
5bd04b0736 feat: technical release (#9656) 2026-03-31 14:52:50 +02:00
Mathieu
4015987b03 fix(web-core): fix performance issue when lot of new events (#9627) 2026-03-31 12:05:00 +02:00
Elise-F
25db113349 feat: technical release (#9654) 2026-03-31 10:00:56 +02:00
spacotte-vates
b8637097c2 fix(backups): fix double close on merge (#9636)
* fix(backups): fix double close on merge

* set dispose to promise instead of empty func
2026-03-31 09:20:06 +02:00
Mathieu
9226c51df7 fix(rest-api): cannot read properties of undefined for vms/:id/dashboard (#9650)
Fix forum#12031
2026-03-30 20:07:45 +02:00
Joris K
14328ad62a feat(web-core): add stepper component (#9569) 2026-03-30 17:19:29 +02:00
Florent BEAUCHAMP
ac8dfeb7f5 feat(backups): improve incremental replication (#9635) 2026-03-30 17:04:16 +02:00
OlivierFL
bce3c88915 fix(xo-core): wrong translation key on PT locale (#9652)
Introduced by 658de40
2026-03-30 15:55:53 +02:00
DustyArmstrong
658de40f9e fix(web-core): fix some grammar issues on the XO 6 Dashboard (#9647) 2026-03-30 15:31:16 +02:00
Pierre Donias
b413db14e7 fix(xo-server-netbox): avoid mutating TYPES_WITH_UUID constant (#9607) 2026-03-30 15:24:58 +02:00
Enée DI IORIO
e6e5031964 feat(xo6/lite): add bug tools download button (#9419) 2026-03-30 14:35:45 +02:00
Florent BEAUCHAMP
484b9a02a3 docs(openmetrics): add documentation for xo metrics (#9631)
introduced by 9535
2026-03-30 14:34:32 +02:00
OlivierFL
a7829414b0 chore(web-core/query-builder): add query builder documentation (#9541) 2026-03-30 10:56:05 +02:00
vates-bot
39acc6b3a0 feat(web-stack/i18n): update Xen Orchestra 6 (#9554) 2026-03-30 10:55:00 +02:00
Mathieu
465c00b71d fix(xo-stack): return null instead of 0 for every NaN stats (#9634) 2026-03-27 17:26:55 +01:00
Mathieu
6814f6b2ef feat(qa-test): migrate xo-qatest into monorepo as @xen-orchestra/qa-test (#9626)
* feat(qa-test): migrate xo-qatest into monorepo as @xen-orchestra/qa-test
2026-03-27 14:35:03 +01:00
Elise-F
cc4cc1796b feat: technical release (#9646) 2026-03-27 14:22:03 +01:00
Florent BEAUCHAMP
1d81c0b26e fix(xapi): add missing package to changelog (#9645)
introduced by #9596
2026-03-27 13:46:38 +01:00
Elise-F
04a6fb3805 feat: technical release (#9642) 2026-03-27 10:23:50 +01:00
Florent BEAUCHAMP
1302618f90 fix(backup): compute the restore size for incremental restore (#9632)
introduced by #8432
2026-03-26 11:48:44 +01:00
Elise-F
7a39e45ffb feat(xo6): add please wait page for first connection in xo server (#9568) 2026-03-26 11:27:16 +01:00
Florent BEAUCHAMP
4bbfa77ec8 feat(xo5/sr): add preferred-image-format field (#9596) 2026-03-26 10:43:52 +01:00
Elise-F
57414dafce feat(xo6): implement vm snapshot tab page (#9521) 2026-03-26 10:03:19 +01:00
Elise-F
e28e768c72 Fix(xo6): remove scrollbar from console tab (#9609) 2026-03-26 09:14:24 +01:00
Joris K
8e5809a675 feat(xo6): add backup replication on vm dashboard (#9545) 2026-03-25 14:55:54 +01:00
Mathieu
56b17ce7f6 feat(rest-api): expose create internal and bonded network (#9611) 2026-03-25 11:25:06 +01:00
Mathieu
27a119f037 refactor(mcp): split monolithic index.mts into modular file structure (#9621)
XO-2221
2026-03-25 11:14:48 +01:00
Elise-F
60ba5070c9 fix(XO6): update watch to avoid reset template select in new VM (#9603) 2026-03-24 17:33:01 +01:00
Florent BEAUCHAMP
0efa078190 fix(backups): vhd directory have empty names (#9633) 2026-03-24 17:05:49 +01:00
Mathieu
c3dcb8fd50 feat(mcp): add list_srs and get_sr_details tools for SR (#9599)
* feat(mcp): add list_srs and get_sr_details tools for storage
repositories

* docs(mcp): add list_srs and get_sr_details to documentation

* fix(mcp): extract expected tool names into a constant in tests

* docs(mcp): add link to live filter syntax documentation for all filter
parameters
2026-03-24 16:39:58 +01:00
Florent BEAUCHAMP
0286f7786a fix(immutable-backups): decrease resource consumption, add tests and typing (#9548) 2026-03-24 16:00:01 +01:00
Florent BEAUCHAMP
f2b1931408 feat(disk-cli): implement disk cli tooling (#9551)
* feat(disk-cli): implement disk cli tooling

* changelog

* fix test path

* fix following review

* fix following rebase

* ci

* fix following rebase

* more tests
2026-03-24 14:35:05 +01:00
Florent BEAUCHAMP
f546849494 feat(xo-server): use index for getAllUnhealthyVdiChainsLength (#9622) 2026-03-24 10:37:18 +01:00
Florent BEAUCHAMP
6ae70a424a fix(backups): correctly rename replicated VMs (#9606) 2026-03-24 09:16:43 +01:00
Florent BEAUCHAMP
41751a8599 fix(backups): use the snapshot of the source (#9612)
* fix(backups): use the snapshot of the source

introduced by 9524

use only the vdi from the source VM as the source on backup
this bug could only occurs if the replication was intra pool, if
not the different xapi was filtering the results
2026-03-24 09:16:16 +01:00
Joris K
7ea8640ad0 fix(xo6/lite): fixed duplicated ip addresses in vm networks tab (#9547) 2026-03-23 16:29:41 +01:00
Enée DI IORIO
2994761178 fix(xo-lite/header): Fix menu button on large screen (#9558) 2026-03-23 10:12:56 +01:00
Mathieu
d1736e01f7 feat(mcp): add list_networks and get_network_details tools (#9595) 2026-03-20 09:38:59 +01:00
Mathieu
a2e3343b6e fix(rest-api/dashboard): exlude ISO SRs from dashboard (#9608) 2026-03-19 14:07:54 +01:00
Bastien Nollet
e325c6af51 docs(load-balancer): add info on migration cooldown (#9604) 2026-03-18 10:09:40 +01:00
Florent BEAUCHAMP
598ab85446 feat(vmware-explorer): make V2V import cancellable (#9552) 2026-03-17 18:17:08 +01:00
Pierre Brunet
1591749a23 fix(fs/s3): add check before using DeleteObjectsCommand (#9598)
fallback to delete object by object on multiple delete error  to handle backends that can't handle this command
2026-03-16 16:56:33 +01:00
Mathieu
800fd97996 feat(openmetrics): add missing VBD and DCMI metrics (#9563)
XO-1491
2026-03-16 11:37:19 +01:00
Pierre Brunet
45aee36ae7 typescript: Add types in several packages (#9583)
* feat: add types for fs (#9515)

* feat: add types for fs

* fix: update from review

* fix: update devDep

* feat: add types from @xen-orchestra/fs/path

* feat: export types based on async-each

* fix: remove ts-expect-error because async-each is now typed

* fix: export backups types and packages

* fix: update tsconfig async-each and fix types in MergeRemoteDisk

* fix: extractIdsFromSimplePattern from backups

* fix: package.json

* feat: export vhd-lib types

* feat(disks): export types

* fix(backups/disks): make params optional

* fix(backups/disks): small update in jsdoc

* bump: update yarn.lock

* fix: update vhd-lib exports

* fix(vhd-lib): update package exports

* fix: revert to previous import

* fix: new approach without exports

* fix: revert types except for asyncEach, openDisk

* fix(disks): import in vhd-lib

* fix(remoteVhdDisk): update typedef
2026-03-16 10:55:18 +01:00
Mathieu
2aff87d6d6 feat(mcp): add list_vdis tool to list virtual disks (#9559) 2026-03-13 15:54:40 +01:00
Mathieu
449e79de21 feat(rest-api): add disable/enable action endpoints for hosts (#9532) 2026-03-13 10:03:56 +01:00
MlssFrncJrg
9d657ac7cc feat(@xen-orchestra/rest-api): expose forget SR (#9505) 2026-03-12 16:12:43 +01:00
Enée DI IORIO
f4cc40233c fix(xo6/backups): backupLog transfer size calculation (#9496) 2026-03-12 15:09:19 +01:00
MlssFrncJrg
2cd5ba0319 feat(@xen-orchestra/rest-api): expose vms/:id/actions/clone (#9453) 2026-03-11 15:58:18 +01:00
Mathieu
2444861082 fix(rest-api/xo6): cpu at VM creation was not working (#9591)
* fix(rest-api/xo6): cpu at VM creation was not working

* changelog
2026-03-11 15:07:56 +01:00
Florent BEAUCHAMP
7ddff121de feat(fs): make part size configurable for s3 (#9561)
from https://xcp-ng.org/forum/topic/10587/s3-backup-maximum-number-of-parts/
2026-03-11 09:54:08 +01:00
Florent BEAUCHAMP
c1e9b83adc feat(backups): symetrical backups (#9524) 2026-03-11 09:34:09 +01:00
Mathieu
18d9b33c87 feat(mcp): support token authentication via XO_TOKEN (#9577) 2026-03-11 09:20:40 +01:00
Bastien Nollet
673e729afe fix(xo-server): incorrect import (#9589) 2026-03-10 19:25:55 +01:00
Florent BEAUCHAMP
4e0655dc3d fix(backups): better handling of generator cleanup (#9557) 2026-03-10 15:55:59 +01:00
bleader
a78870b473 docs(sdn-controller): mention xapi plugin is in BETA (#9556) 2026-03-10 15:42:16 +01:00
Thomas Moraine
0bf309a4ad docs(sdn_controller.md): clarify requirements for regenerating certificates (#9584) 2026-03-10 09:54:01 +01:00
spacotte-vates
5bdd76a955 feat: release 6.2.2 (#9579) 2026-03-09 14:41:09 +01:00
Pierre Brunet
e11530ea7c feat: technical release (#9576) 2026-03-09 10:10:36 +01:00
Florent BEAUCHAMP
c70f911b5e fix(changelog): remove package from release list (#9575)
introduced during rebase by #9572
2026-03-09 09:56:22 +01:00
Mathieu
82f047ef9d fix(xo-server): proxy issue if hostname defined (#9572)
fix #9500
2026-03-09 09:49:24 +01:00
Mathieu
57aec1ab2d fix(xo-server): race condition on XOA WebSocket during plugin loading (#9402) 2026-03-09 09:42:53 +01:00
Pierre Donias
385fcf3810 fix(xo-server/vm): allocate resource set quotas when not using DMC (#9566)
When editing VM RAM, the high-level `memory` field dispatches to `memoryMax` or
`_memory` depending on whether the VM uses DMC. Both paths need `limitName:
'memory'` on their spec so the resource set quota counter is correctly updated,
but `_memory` was missing it, causing memory resizes on non-DMC VMs to silently
create a stale `_memory` counter instead of updating the actual memory quota.
2026-03-09 09:37:24 +01:00
Florent BEAUCHAMP
6699bd1f5d fix(backups): remove snapshot of vm with cdrommounted (#9571) 2026-03-06 17:28:50 +01:00
Pierre Brunet
844c07e166 feat: technical release (#9570) 2026-03-06 14:49:29 +01:00
spacotte-vates
7676978c78 fix(backups): fix out of range error on merge (#9567)
Fixes out of range error during merge that was happening on delta backups when the child disk was bigger than the parent disk but no blocks where written in the "new" space.

Also added a test for this error.
2026-03-06 14:17:17 +01:00
Elise-F
7054fefdbd Style(xo6): update color for status paused VM icon (#9562) 2026-03-05 11:21:06 +01:00
Enée DI IORIO
acd84649ed feat(xo6): add backupRuns and BackupArchives card on vm dashboard (#9303) 2026-03-05 10:32:07 +01:00
Florent BEAUCHAMP
7460bf93d1 feat(openmetrics): add XO related metrics (#9535) 2026-03-04 10:30:20 +01:00
Mathieu
61e4a77cab fix(openmetrics): convert latency from µs to seconds instead of ms (#9550) 2026-03-03 10:01:56 +01:00
vates-bot
55130311f3 feat(web-stack/i18n): update Xen Orchestra 6 (#9531) 2026-03-03 09:18:35 +01:00
Florent BEAUCHAMP
f0cbd1bd72 docs(backup): document distributed backups (#9528)
* docs(backup): document distributed backups

* Apply suggestions from MPT code review

Co-authored-by: Mathieu <goore.csmoviz@gmail.com>

---------

Co-authored-by: Mathieu <goore.csmoviz@gmail.com>
2026-03-03 09:11:36 +01:00
Enée DI IORIO
561e2349e9 feat(xo6-lite/dashboard): add reactivity on resize (#9378) 2026-03-02 14:59:51 +01:00
Enée DI IORIO
7c83ed63f1 fix(web-core/treeItemLabel): fix treeview tooltip overlap (#9319) 2026-03-02 10:41:26 +01:00
Enée DI IORIO
9525abdee5 feat(xo6/Lite): add secureBoot support (#9423) 2026-02-27 15:09:49 +01:00
spacotte-vates
c6172b7b74 feat: release 6.2.1 (#9546) 2026-02-27 14:42:27 +01:00
Pierre Brunet
1b865bbf89 feat: technical release (#9544)
* feat(@xen-orchestra/backups): 0.69.2

* feat(@xen-orchestra/proxy): 0.29.49

* feat(xo-server): 5.197.3

* chore(CHANGELOG): update next

* fix: update changelog
2026-02-27 11:56:10 +01:00
spacotte-vates
815f4be76c fix(backups): changelog (#9543) 2026-02-27 11:44:13 +01:00
spacotte-vates
53f5c63fa2 fix(backups): race condition on merge (#9542) 2026-02-27 11:29:42 +01:00
spacotte-vates
4ffd1b4e13 feat(lite): 0.19.0 (#9540) 2026-02-26 18:29:55 +01:00
spacotte-vates
d25d15efd7 feat: release 6.2.0 (#9539) 2026-02-26 17:46:07 +01:00
Pierre Brunet
322205d203 feat: technical release (#9537) 2026-02-26 14:57:42 +01:00
Mathieu
89494457a1 fix(mcp): use bin wrapper to fix npx permission denied (#9536)
Fix npx @xen-orchestra/mcp failing with "Permission denied".

tsc does not preserve the executable bit on compiled files, so bin pointing to ./dist/index.mjs (mode 644) caused the error. This adds a bin/xo-mcp.mjs wrapper tracked by git with mode 755, following the same pattern as other packages (@xen-orchestra/xapi, @xen-orchestra/proxy, etc.).
2026-02-26 13:34:08 +01:00
Pierre Briffaux
6bc2844092 feat(xo6/new-vm): add custom user-config to new VM creation (#9427) 2026-02-26 13:15:30 +01:00
Mathieu
53c15bc9e4 docs(mcp) : documentation (#9529)
docs(mcp): add README and Docusaurus documentation page
2026-02-25 17:19:38 +01:00
Pierre Brunet
1dd8c1603f Release (#9534) 2026-02-25 16:19:54 +01:00
Mathieu
52513fc898 feat(xo-server): add transient option to host.disable (#9503)
Add optional transient parameter (boolean) to host.disable API endpoint.

When transient=true, passes auto_enable=false to XAPI, keeping the host disabled across reboots and toolstack restarts (requires XAPI >= 25.31.0). Default behavior unchanged (backward compatible).

XAPI 25.31.0 introduced a new auto_enable parameter to Host.disable (xen-api#6652). When set to false, the host stays disabled regardless of toolstack restarts, host reboots, or consider_enabling_host calls. Only an explicit Host.enable can re-activate it.
2026-02-25 15:54:26 +01:00
spacotte-vates
ed508ec04f feat: technical release (#9533)
* feat(@xen-orchestra/backups): 0.69.1

* feat(complex-matcher): 1.1.0

* feat(@xen-orchestra/web-core): 0.44.0

* feat(@xen-orchestra/mcp): 1.0.0

* feat(@xen-orchestra/proxy): 0.29.48

* feat(@xen-orchestra/rest-api): 0.26.0

* feat(@xen-orchestra/web): 0.42.0

* feat(xo-server): 5.197.1

* feat(xo-web): 5.194.0

* chore(CHANGELOG): update next

---------

Co-authored-by: Pierre Brunet <pierre.brunet@vates.tech>
Co-authored-by: Pierre Donias <pierre.donias@gmail.com>
2026-02-25 15:39:25 +01:00
MathieuRA
21823bf430 feat: add rest-api debug 2026-02-25 14:13:30 +01:00
Florent BEAUCHAMP
e36e1012e2 fix(xo-web): reducing polling for patches and license 2026-02-25 14:13:30 +01:00
Elise-F
3fcf582087 feat(new VM): add ssh key to vm creation form (#9413) 2026-02-25 10:24:29 +01:00
vates-bot
f1389cff6e feat(web-stack/i18n): update Xen Orchestra 6 (#9462) 2026-02-25 09:39:32 +01:00
Mathieu
438a7cc746 feat(mcp): add @xen-orchestra/mcp package (#9519)
This PR adds the new @xen-orchestra/mcp package — an MCP (Model Context Protocol) server that enables AI assistants (Claude Desktop, Claude Code, or any MCP-compatible client) to query a Xen Orchestra infrastructure in read-only mode.
2026-02-24 17:10:32 +01:00
Florent BEAUCHAMP
31e2ff1b02 feat(backups): only check size for full backups (#9527)
The size is computed from the blocksize * nb allocated blocks during the backups
which is not aligned with the real size on disk
Checking the file on disk is too costly for vhd directory
This will be eventually reimplemented by the next cleanVm rework
2026-02-24 17:04:58 +01:00
Thomas Moraine
44a23fb33f docs(sdn_controller.md): document openssl 3 + sdn upgrade path (#9525)
This pull request documents the manual steps that will be needed for the SDN controller, with the incoming March 2026 update of XCP-ng that will include OpenSSL3.
2026-02-24 13:21:26 +01:00
Pierre Donias
f8501c1a1e feat(xo-web/patches): warn about updating XOSTOR before installing patches (#9517) 2026-02-24 12:07:44 +01:00
spacotte-vates
6cab502260 feat(rest-api): sr scan route (#9514) 2026-02-24 11:05:18 +01:00
Pierre Donias
157e7fe757 feat(xo-web/licenses): display bundle name next to license name (#9512) 2026-02-23 16:20:46 +01:00
OlivierFL
0866a5db81 feat(xo-stack): implement Query Builder (#9488) 2026-02-23 15:35:23 +01:00
Pierre Donias
1c245acca5 feat(xo-web/network): reconfigure management PIF (#9510) 2026-02-23 14:36:18 +01:00
spacotte-vates
58c2c518a3 feat: technical release (#9523)
* feat(@xen-orchestra/fs): 4.6.7

* feat(@vates/types): 1.20.0

* feat(@xen-orchestra/backups): 0.69.0

* feat(@xen-orchestra/backups-cli): 1.1.8

* feat(@xen-orchestra/immutable-backups): 1.0.30

* feat(@xen-orchestra/web-core): 0.43.0

* feat(@xen-orchestra/proxy): 0.29.47

* feat(@xen-orchestra/rest-api): 0.25.0

* feat(@xen-orchestra/vmware-explorer): 0.11.0

* feat(@xen-orchestra/web): 0.41.0

* feat(xo-server): 5.197.0

* feat(xo-server-load-balancer): 0.12.0

* feat(xo-server-netbox): 1.11.0

* feat(xo-server-openmetrics): 1.2.0

* feat(xo-server-sdn-controller): 1.2.1

* feat(xo-web): 5.193.0

* chore(CHANGELOG): update next

---------

Co-authored-by: Pierre Brunet <pierre.brunet@vates.tech>
2026-02-23 10:23:57 +01:00
Elise-F
755ac108f2 feat(xo6): adds a banner when access to the xo server fails (#9375) 2026-02-20 17:12:29 +01:00
Bastien Nollet
f88c0e8be2 feat(rest-api): expose POST vdis (#9492) 2026-02-20 16:24:18 +01:00
Philippe Coval
109e37695c fix(sdn-controller): Support openssl-3 for ca/cert generation (#9507)
OpenSSL-3 (on xcp-ng) requires CA set to true in basicConstraints.

"All CAs should have the CA flag set to true."

For context, here are additional resources:

- https://docs.openssl.org/3.0/man1/openssl-verification-options/#basic-constraints
- https://docs.openssl.org/1.0.2/man1/x509v3_config/#basic-constraints
- https://datatracker.ietf.org/doc/html/rfc5280#section-4.2.1.9

To connect to OpenSSL 3, certificates should be re-generated if they
already exist (just remove xo-server/data/sdn-controller).

Renewed certs were tested on XCP-ng host on "OpenSSL 1.0.2k-fips"
without regression, so it is safe to assume those ext are designed to
be backward compatible.

Observed issue:

    openssl verify \
      -CAfile .../xo-server/data/sdn-controller/ca-cert.pem \
      .../xo-server/data/sdn-controller/client-cert.pem

    C=XX, L=Default City, O=Default Company LTD
    error 79 at 1 depth lookup: invalid CA certificate
    error .../xo-server/data/sdn-controller/client-cert.pem: \
      verification failed

The expected output is now:

    .../xo-server/data/sdn-controller/client-cert.pem: OK

The expected output is now:

    .../xo-server/data/sdn-controller/client-cert.pem: OK

It was tested along ovsdb-server (Open vSwitch) 2.17.7 :

    openssl s_client \
      -connect  10.1.75.62:6640 \
      -cert .../xo-server/data/sdn-controller/client-cert.pem \
      -key .../xo-server/data/sdn-controller/client-key.pem

    (...)
    CONNECTED(00000003)
    Can't use SSL_get_servername
    (...)
    verify error:num=18:self-signed certificate
    (...)
    SSL handshake has read 2713 bytes and written 3799 bytes
    Verification error: self-signed certificate
    (...)
    New, TLSv1.2, Cipher is AES128-GCM-SHA256
    (...)
    {"id":"echo","method":"echo","params":[]}

Extra info at:

- https://xapi-project.github.io/new-docs/design/pool-certificates/

Origin: https://github.com/vatesfr/xen-orchestra/pull/9507
Relate-to: XCPNG-2710
Relate-to: XO-1986
Signed-off-by: Philippe Coval <philippe.coval@vates.tech>
2026-02-20 09:34:13 +01:00
spacotte-vates
a4b480de4a feat(rest-api): add relaim_space action to sr (#9486) 2026-02-19 17:26:12 +01:00
spacotte-vates
db8addbc45 fix(backups): fix RemoteVhdDisk & DiskChain parent and directory issue (#9508)
* fix(backups): fix RemoteVhdDisk & DiskChain parent and directory issue
2026-02-18 14:06:05 +01:00
Sebastien Marie
9dbc090116 fix(xo-server-sdn-controller): communicate with enabled hosts only (#9442)
permit to have working traffic rules when a pool is in a 'degraded' mode (for
example, one host temporary down or unreachable).

currently, exceptions occurs and nothing happens (no rules added or deleted).
with it, unreachable hosts are ignored and reachable hosts properly updated.
2026-02-17 13:31:44 +01:00
OlivierFL
353678e754 feat(xo-6/internal-links): normalize internal links (#9276) 2026-02-17 08:20:01 +01:00
Florent BEAUCHAMP
a313986694 feat(backups): implements distributed backup and replications (#9433)
The deletion of old backups is done globally
For Full backups/replication:
 * retention is computed on the total of the target
 * choose the storage with the most free size ( if possible, since some backup repositories don't have any size used/ free )
 * one vm is written on the same target ( xva, index, checksum )
 * healthcheck ( if enabled ) will run only on the target that received the data
 * the cleanup of old backups/replication is done on the right target ( but considering the full lenght across all the targets )

For incremental: 
 * delta chain are continued on the same target 
 
For mirror : 
if a vm has multiple backups to transfer during the same run, then
they will all go to teh same remote
 
UX : 
* show a toggle on remote/sr selectors
* toggle is disabled if 1 or less targets are selected
* for backup and mirror backup forms
* show the details in the job list
  

More details on the PR page
2026-02-16 18:17:03 +01:00
Florent BEAUCHAMP
983ac2d2c9 docs(config): explain the config files priorities (#9463) 2026-02-16 18:11:50 +01:00
spacotte-vates
4e50858526 feat(@xen-orchestra/backups): refactor backup merge code (#9300)
this merge code leverage the new classes introduced to handle qcow2, improving our flexibility, and future uses.

this also improve the performance on "block mode" backups (s3/ azure and other storage with the option), since it reliably updates the block allocation table only at the end of the merge instead of each time a new block is detected
2026-02-16 18:04:12 +01:00
Mathieu
c497ae3d38 fix(web): use the store's object type and not type from vates/types (#9421) 2026-02-16 17:01:26 +01:00
spacotte-vates
9d9b5d5e33 feat(rest-api): add plug and unplug pbd routes to rest api (#9477) 2026-02-16 16:52:04 +01:00
OlivierFL
5834070e77 fix(xo-6/xo-lite): missing required prop for UiRadioButtonGroup in new VM creation form (#9504) 2026-02-16 16:50:40 +01:00
Enée DI IORIO
5c5f27f92b fix(xo-stack): fix VM creation on small screen (#9344) 2026-02-16 16:16:11 +01:00
Cyrille G.
8fc04bc03b fix(hub/recipe): remove DHCP option for the Kubernetes recipe (#9454) 2026-02-16 10:20:11 +01:00
Pierre Brunet
87135c7469 feat: add qcow2 support in vdi creation (#9493)
Add qcow2 image-format when size is higher than 2TB. It will still be a VHD if PBD.preferred-image-formats do not list qcow2
2026-02-16 09:56:08 +01:00
Mathieu
fb030a590e docs(openmetrics): update documentation for host uptime, host status and is_control_domain (#9497)
docs(openmetrics): update documentation for host uptime, host status and
is_control_domain
2026-02-16 09:55:02 +01:00
Florent BEAUCHAMP
0be2392519 feat(xo-server/V2V): automatically take a snapshot if needed (#9471) 2026-02-12 17:07:56 +01:00
Florent BEAUCHAMP
546d42427c feat(xo-web): remember V2V connections settings (#9490) 2026-02-12 15:42:47 +01:00
Mathieu
fc86fda13d fix(rest-api): exclude removable storage from top 5 SRs usage (#9495) 2026-02-12 14:04:12 +01:00
Elise-F
b44bed6d10 feat(web-core): new ui rich radio button component created (#9198) 2026-02-12 11:53:35 +01:00
Mathieu
4e66889233 fix(xo-server-openmetrics): bind to localhost instead of 127.0.0.1 (#9489) 2026-02-12 09:51:42 +01:00
Pierre Donias
10bb1741e7 chore: split changelog file (#9390) 2026-02-11 14:57:35 +01:00
Mathieu
a0f890f301 feat(openmetrics): add host uptime metric (#9449) 2026-02-11 11:08:43 +01:00
Pierre Donias
839a484017 fix(xo-web/host/patches): remove obsolete yum install command instruction (#9451) 2026-02-11 10:34:02 +01:00
MlssFrncJrg
dc9e029bdb feat(netbox): support Netbox v4.5.x (#9445)
Fixes #9379
See https://github.com/netbox-community/netbox/releases
2026-02-11 10:31:47 +01:00
Mathieu
f203b1f1e1 feat(rest-api): expose vms/:id/actions/migrate (#9414) 2026-02-11 09:55:51 +01:00
Mathieu
7399a9fec5 feat(openmetrics): add xcp_host_status metric (#9457) 2026-02-10 16:39:40 +01:00
Olivier Lambert
c69b2336f6 feat(xo-server-load-balancer): add migration cooldown to prevent VM flapping (#9388) 2026-02-10 16:11:27 +01:00
Florent BEAUCHAMP
80ab29de29 feat(xo-server): warm migration works with non running VM 2026-02-10 16:08:10 +01:00
Florent BEAUCHAMP
1449a8482e feat(xo-server): vm.warmMigration now return the uuid 2026-02-10 16:08:10 +01:00
Mathieu
ec9806e081 feat(rest-api): add objectType to tasks from actions (#9429) 2026-02-10 15:22:03 +01:00
Pierre Brunet
c6c31524e1 build: bump all dependencies (#9481) 2026-02-10 14:42:37 +01:00
Mathieu
49fce9b61f feat(openmetrics): add is_control_domain label to differentiate dom0 VMs (#9474) 2026-02-10 14:41:42 +01:00
Thomas Moraine
f52a35c093 docs(metadata_backup): clarify the two types of metadata backups (#9487) 2026-02-10 14:11:42 +01:00
Mathieu
9d74585bd4 fix(@xen-orchestra/web): fix build issue (#9482)
Introduced by #7851
2026-02-10 10:59:37 +01:00
Mathieu
12f4360100 feat: release 6.1.2 (#9485) 2026-02-10 10:01:17 +01:00
Pierre Brunet
771ce8c6d5 fix(backups/s3): add fallback if deleteObjects unsupported (#9450) 2026-02-10 09:29:53 +01:00
Mathieu
41c9a6c7c2 feat: release 6.1.2 (#9480) 2026-02-09 09:43:51 +01:00
Florent BEAUCHAMP
7e08a016bd fix(backups): ensure vm created by backups are removable by backups : halthcheck/replication (#9473) 2026-02-06 15:15:37 +01:00
Mathieu
91c5d98489 feat: release 6.1.1 (#9470) 2026-02-05 16:59:00 +01:00
Mathieu
b895f48a4f feat: technical release (#9469) 2026-02-05 16:01:47 +01:00
Mathieu
d68d878747 fix(changelog): add missing package to release (#9468) 2026-02-05 15:46:55 +01:00
Mathieu
5155a9d5f1 feat: technical release (#9467) 2026-02-05 14:58:41 +01:00
Florent BEAUCHAMP
7437427fae fix(backups): refresh the snapshot name after removing the temp name (#9466)
introduced by #9434
2026-02-05 13:13:39 +01:00
spacotte-vates
a16b4cb540 feat(rest-api): add post vifs and delete vifs/:id routes to rest api (#9393) 2026-02-05 12:05:26 +01:00
Florent BEAUCHAMP
21508c97bc fix(immutable-backups): really protect pool metadata
Apply suggestion from @MathieuRA

Co-authored-by: Mathieu <70369997+MathieuRA@users.noreply.github.com>

Apply suggestion from @MathieuRA

Co-authored-by: Mathieu <70369997+MathieuRA@users.noreply.github.com>
2026-02-05 10:16:03 +01:00
Florent BEAUCHAMP
e8ff60c8bc docs(immutable-backups): fix app name in documentation
alos changelog that wasn't in previous PR
2026-02-05 10:16:03 +01:00
Mathieu
153efccb85 fix(rest-api): pools/:id/actions/create_vm install.repository was ignored (#9461) 2026-02-05 10:10:39 +01:00
Joris K
a99e1aa72d fix(xo6/lite): only count running vms for cpu provisioning in host dashboard (#9459) 2026-02-05 09:27:20 +01:00
Mathieu
dd5f0cdaa9 fix(rest-api): fix backup-archives href (#9460)
* fix(rest-api): fix backup-archives href

* changelog

---------
2026-02-04 17:10:37 +01:00
Mathieu
ea142b50a4 fix(rest-api): only count running vms for cpu provisioning in pool dashboard (#9456)
See Forum#101359
2026-02-04 17:05:16 +01:00
Pierre Briffaux
5b5a0a72cc fix(web-core): enable legacy clipboard support for http (#9426) 2026-02-04 16:41:16 +01:00
Joris K
84a16ef85f fix(xo6): fix issue with alarms display (#9458) 2026-02-04 11:18:38 +01:00
vates-bot
b983e6d4fa feat(web-stack/i18n): update Xen Orchestra 6 (#9440) 2026-02-04 10:40:27 +01:00
Joris K
a0e771f09c feat(xo6): update site dashboard (#8964) 2026-02-03 17:51:06 +01:00
Florent BEAUCHAMP
9bd91aea43 feat(fs): autodetect object lock/immutability on s3 (#9431)
* add a setting to declare remote immutable ?immutable=true in the URL 
* autodetect object lock/immutabiltiy on s3
2026-02-03 17:12:15 +01:00
Florent BEAUCHAMP
0a042d2f54 fix(xapi): correctly block operations
blocked operation on vm creation does not seem to work

also importIncrementalVm was not unlocking it at the end
2026-02-03 15:59:24 +01:00
Florent BEAUCHAMP
c610951450 fix(backups): set other_config on incremental replication vm creation
this will ensure that any partial transfer will ben cleaned on next run
2026-02-03 15:59:24 +01:00
Florent BEAUCHAMP
a831ac7b21 chore(backups): remove old todo 2026-02-03 15:59:24 +01:00
Florent BEAUCHAMP
d0f71d4ec7 fix(backups): don't leave dangling snapshots (#9434)
when the connection to the host break between the snapshot() and
the update of other config
this could leave snapshot that will never be cleaned by any backup job
The fix is that the snapshot will be named with a specific name, it
will cause an issue if a user reuse this name
2026-02-03 15:55:11 +01:00
Joris K
c1a9bc82fb feat(xo6/vm): add more actions button to delete VM and take snapshot (#9410) 2026-02-03 13:05:49 +01:00
Dan Pollak
601cc3e9fd fix(immutable-backups): Fix typo in sample config file (#9444)
* fix(immutable-backups): default config.toml missing quotes

Signed-off-by: Dan Pollak <danpollak2@gmail.com>

* fix(immutable-backups): Locate config file

Signed-off-by: Dan Pollak <danpollak2@gmail.com>

* Update CHANGELOG

Signed-off-by: Dan Pollak <danpollak2@gmail.com>

* Revert "fix(immutable-backups): Locate config file"

This reverts commit e9e367474d.

* Update CHANGELOG.unreleased.md

Co-authored-by: Florent BEAUCHAMP <florent.beauchamp@gmail.com>

---------

Signed-off-by: Dan Pollak <danpollak2@gmail.com>
Co-authored-by: Florent BEAUCHAMP <florent.beauchamp@gmail.com>
2026-02-03 13:03:09 +01:00
MathieuRA
79d1f42dd7 fix(rest-api): do not create auth task when using auth token 2026-02-03 09:20:25 +01:00
MathieuRA
64c366838a fix(rest-api): don't send message updates when subscribing to alarm 2026-02-03 09:20:25 +01:00
MathieuRA
85b3162be6 fix(rest-api): set memory limit per sse client 2026-02-03 09:20:25 +01:00
Mathieu
eb020e250b docs(openmetrics): add SR capacity metrics and complete VM metrics (#9438)
documentation
2026-01-30 16:50:55 +01:00
Olivier Lambert
56142085e5 feat(xo6/settings): add various themes (#9387) 2026-01-30 15:21:00 +01:00
Mathieu
2838bde875 feat(lite): 0.18.0 (#9437) 2026-01-29 17:56:53 +01:00
Mathieu
fa110ed9c9 feat: release 6.1.0 (#9436) 2026-01-29 17:31:28 +01:00
Mathieu
d3187c06b5 feat: technical release (#9432) 2026-01-29 10:57:33 +01:00
Florent BEAUCHAMP
2f41ccffe8 feat(xapi): try to disconnect vdi if a vm_destroy fail (#9415)
happenned during a backup for HK
only solve case where the disk can be manually disconnected from DOM0
2026-01-29 10:02:59 +01:00
Elise-F
a9e45fcb8e feat(xo6/Lite): add VTPM support (#9389) 2026-01-29 09:46:41 +01:00
Pierre Briffaux
1e69c25ba5 fix(xo6/new-vm): fixed disk naming from template (#9294) 2026-01-28 16:13:58 +01:00
Joris K
9f852365fc feat(xo6/vm): add VMs actions to manage lifecycle (#9403) 2026-01-28 16:01:57 +01:00
Enée DI IORIO
05824cb8a6 feat(web-core): normalize icons creation from design system (#8989) 2026-01-28 15:29:40 +01:00
vates-bot
638ee77aff feat(web-stack/i18n): update Xen Orchestra 6 (#9330) 2026-01-28 10:36:59 +01:00
Bastien Nollet
08a560a8da fix(xo-server): fix NFSv4 ISO SR creation (#9425) 2026-01-28 10:02:44 +01:00
Elise-F
e77a0e43f1 feat(xo6): remove text ellipsis on sides panel (#9238) 2026-01-27 18:29:35 +01:00
Florent BEAUCHAMP
8069adf26d feat(xo-server): expose an api method to export a disk from vmware 2026-01-27 16:04:05 +01:00
Florent BEAUCHAMP
1241977599 fix(vhd-cli): raw need to load BAT before working 2026-01-27 16:04:05 +01:00
Florent BEAUCHAMP
4ca314fbc7 fix(nbd-client): discrepency when using hasblock/getblockindexes 2026-01-27 16:04:05 +01:00
Mathieu
13ab1cce86 feat(rest-api): add POST /vdis/{id}/actions/migrate endpoint (#9408) 2026-01-27 10:58:28 +01:00
Mathieu
9f7797fdda feat(rest-api): add VBD connect/disconnect endpoints (#9399) 2026-01-27 10:25:04 +01:00
Mathieu
21767145bd feat: technical release (#9422) 2026-01-23 14:44:23 +01:00
OlivierFL
6805e16108 refactor(xo6): project architecture (#9371) 2026-01-23 12:02:43 +01:00
Mathieu
ecd49e69a7 fix(xo-server-openmetrics): add sr_name label to VM disk metrics (#9353)
Introduced by 0005a4f4cc1990e9a20eb48becb5943b5bf15c43
2026-01-23 10:24:29 +01:00
Florent BEAUCHAMP
a5f5a0273e fix(boackups): reverting a VM from a backup shouldn't leave dangling other_config (#9398) 2026-01-23 10:18:52 +01:00
Mathieu
ddc9bf3211 feat(rest-api): add DELETE /vbds/{id} endpoint (#9394) 2026-01-22 14:31:25 +01:00
Mathieu
75db97f9ea feat(@vates/types,xo-server-openmetrics): use centralized XoApp type (#9404)
XO-1810
2026-01-22 11:19:49 +01:00
Mathieu
07c1c02f03 feat(rest-api): add secureBoot param for vm creation (#9417) 2026-01-22 11:13:42 +01:00
Mathieu
dbe8e0ce26 fix(rest-api): vms/:id/start fix request body being ignored (#9416)
introduced by 0202b56d33
2026-01-21 17:42:20 +01:00
Florent BEAUCHAMP
82cd861479 feat(backups): expose LTR tags to VM backups (#9364) 2026-01-21 17:34:50 +01:00
Pierre Briffaux
32f8c1a25f feat(xo-lite): scroll to selected item in treeview (#9332) 2026-01-21 16:52:06 +01:00
Florent BEAUCHAMP
9e7813319a fix(vhd-lib/qcow2): better handling of unaligned blocks (#9407) 2026-01-21 15:52:33 +01:00
Mathieu
caba00a2b9 feat(rest-api): add createVtpm parameter to VM creation endpoint (#9412) 2026-01-21 15:25:03 +01:00
Pierre Briffaux
927561123a feat(xo6/treeview): scroll to selected item in treeview (#9268) 2026-01-21 11:51:25 +01:00
Mathieu
097c2bd1d9 feat(rest-api): add POST /vbds endpoint to create VBDs (#9391) 2026-01-20 14:36:24 +01:00
MlssFrncJrg
5288b6d848 feat(xo6/vm): add 'Change State' button on VM page (#9317) 2026-01-20 11:54:01 +01:00
Pierre Brunet
263059be22 fix: update node-tar to handle CVE-2026-23745 (#9406)
* fix: update node-tar to handle https://github.com/advisories/GHSA-8qq5-rm4j-mr97

* chore: update changelog
2026-01-20 11:42:57 +01:00
Florent BEAUCHAMP
c83df8a342 fix(backups): more filtering on disk snapshot before starting (#9405)
from ticket 33058
2026-01-19 11:20:09 +01:00
Bastien Nollet
4f959e2d22 fix(backup-reports): prevent succesful backups being sometimes repor… (#9400)
* fix(backup-reports): prevent succesfull backups being sometimes reported as interrupted

* increase delay after user feedback

* change comment according to delay change

---------

Co-authored-by: Florent BEAUCHAMP <florent.beauchamp@vates.tech>
2026-01-19 11:06:36 +01:00
Florent BEAUCHAMP
ee6df8c979 chore(backups): remove unused and broken code (#9367)
note the missing await for the adapter._handler.readFile
this method is correctly implemented in MixinRemoteWriter
2026-01-19 10:58:16 +01:00
Mathieu
0a0ae5dc7e feat(xo-server/rest-api): add management interface reconfigure API (#9369) 2026-01-14 16:29:43 +01:00
Mathieu
58b6215c41 fix(@xen-orchestra/rest-api): check length instead of undefined (#9401)
Introduced by #9395
2026-01-14 15:17:59 +01:00
Mathieu
0e56c5e2bd fix(@xen-orchestra/rest-api): add isEmpty prop for xoa dashboard (#9395) 2026-01-14 11:27:28 +01:00
Florent BEAUCHAMP
0b44b1b52b fix(backups): size estimation of full backups (#9396) 2026-01-14 10:38:52 +01:00
Bastien Nollet
4c7b8b194f feat(vhd-cli): prevent using invalid options (#9386) 2026-01-13 16:52:36 +01:00
Mathieu
ac2ed8880a feat(@vates/types): expose XoApp (#9322) 2026-01-12 15:27:53 +01:00
Raven
6fc30c899d docs(xo): Add instructions for fetching deps on RHEL 10 distros (#9383)
RHEL 10 and co. (AlmaLinux, Rocky, CentOS) stopped shipping redis and
moved some packages around. Update the docs to reflect that.
2026-01-12 11:56:48 +01:00
Florent BEAUCHAMP
05e1298eec fix(backups): rework snapshot listing (#9377) 2026-01-12 08:17:54 +01:00
Mathieu
d20561fadc fix(xo-server-openmetrics): use correct timestamp property name in computeVmCpuUsageFallback (#9384)
Introduced by 29fa4b2
2026-01-09 14:12:28 +01:00
Mathieu
53a3e2a70f feat(xo-server-openmetrics): add SR capacity metrics (#9360)
* feat(xo-server-openmetrics): add SR capacity metrics

* fix(xo-server-openmetrics): refactor SR types and add host labels for
local SRs

---------

Co-authored-by: Florent BEAUCHAMP <florent.beauchamp@vates.tech>
2026-01-09 10:25:10 +01:00
Mathieu
2c90eb5ba8 fix(rest-api): string and not 'string' (#9382) 2026-01-09 10:24:37 +01:00
Mathieu
c3e78ebdfd fix(rest-api): fix getVmVdis and enhance the type (#9381) 2026-01-09 10:24:20 +01:00
Mathieu
264b93d502 feat(open-metrics): compute vm_cpu_usage from per-core metrics (#9331)
* feat(open-metrics): compute vm_cpu_usage from per-core metrics

* refactor(xo-server-openmetrics): combine conditional checks in
computeVmCpuUsageFallback
2026-01-09 10:23:26 +01:00
Elise-F
d0abf8810c feat(web-core): update UI title component (#9292) 2026-01-09 10:09:25 +01:00
Mathieu
bdd9b26651 fix(rest-api): various vm dashboard fixes (#9380) 2026-01-08 17:30:12 +01:00
Elise-F
66d5014755 feat(xo6): removal borders of sidebar in mobile (#9366) 2026-01-08 16:49:22 +01:00
mathieuRA
8e2d9f1022 feat(xo6): use define-job for server creation 2026-01-07 16:04:21 +01:00
mathieuRA
566bdeda63 feat(xo6): use define-job for VM creation 2026-01-07 16:04:21 +01:00
mathieuRA
e86d71fc31 feat(xo6): implement async action monitoring 2026-01-07 16:04:21 +01:00
Mathieu
4827f33305 feat(@xen-orchestra/rest-api): update xoa dashboard endpoint (#9207)
XO-1462
2026-01-07 14:39:48 +01:00
Elise-F
9b6d1089f4 feat(web-core): update text logo with custom font (#9298) 2026-01-06 16:01:34 +01:00
Elise-F
d1f8f61791 feat: release 6.0.3 (#9374) 2026-01-06 15:20:32 +01:00
Elise-F
dbf00ba0cd feat: technical patch release (#9373) 2026-01-06 14:33:41 +01:00
Pierre Brunet
44a0d14e88 fix (XO Hub): read getResourceCatalog removed during refactor (#9362) 2026-01-06 14:08:48 +01:00
Elise-F
0b52a05bb3 feat: technical patch release (#9372) 2026-01-06 11:51:13 +01:00
Florent BEAUCHAMP
407591d74d fix(vhd-lib): more logs on backup edge cases (#9326)
* more logs for vdi attached to multiples VMs failing _removeUnusedSnapshots
* more logs for incomplete reading of a disk
2026-01-06 10:57:41 +01:00
Enée DI IORIO
0b29586626 fix(xo6/site-dashboard): replace raw text by translated text in Pools Status (#9329) 2026-01-05 16:38:07 +01:00
Florent BEAUCHAMP
42eb8664be fix(xo-server/v2v): more block alignment fixes (#9293)
from #45336
2026-01-05 16:01:59 +01:00
Florent BEAUCHAMP
1d8c429532 fix(backups): cleanup data on restore (#9361) 2026-01-05 12:10:44 +01:00
Joris K
c51df2239f fix(xo6/host): correction of a translation key (#9359) 2026-01-05 10:34:06 +01:00
Mathieu
b89c26459c feat: release 6.0.2 (#9356) 2025-12-23 15:41:32 +01:00
Mathieu
a1333c07d7 feat: technical release (#9355) 2025-12-23 14:45:33 +01:00
Mathieu
5e8e5beba1 fix(xo-server): fix netdata url (#9354) 2025-12-23 14:04:08 +01:00
Mathieu
9169e11f35 fix(xo-server): fix don't call the updater with secure protocol (#9349) 2025-12-23 11:46:28 +01:00
Mathieu
6908001bd8 fix(xo-server): bypass session auth for /openmetrics routes 2025-12-22 18:02:29 +01:00
Mathieu
53ec9a62a8 fix(xo-server-openmetrics): comply with OpenMetrics 1.0 specification 2025-12-22 18:02:29 +01:00
Joris K
4a0590b7e9 fix(web core): fix task item tree (#9352)
Introduced by 3eb9efe

Fix an issue on taskitem tree only on firefox
2025-12-22 11:22:10 +01:00
Thierry Goettelmann
d358aed897 fix(web-core/lite): UiInput v-model modifiers and reactivity (#9282)
Fixes randomly blank input
2025-12-22 11:03:15 +01:00
Florent BEAUCHAMP
5fcb6db32e docs(xo5): use absolute path (#9347) 2025-12-19 17:29:54 +01:00
Mathieu
1de60c52b4 docs(openmetrics): add user documentation for Prometheus integration (#9333) 2025-12-19 14:17:38 +01:00
Elise-F
55243b65a2 feat: release XO 6.0.1 (#9345) 2025-12-19 14:03:18 +01:00
Elise-F
0247b3b9b3 feat: technical release (#9343) 2025-12-19 11:48:25 +01:00
Mathieu
6dae628e0d Fix/openmetrics hardcode server config (#9342)
* docs(changelog): add entry for xo-server-openmetrics security fix

* Apply suggestion from @fbeauchamp

---------

Co-authored-by: Florent BEAUCHAMP <florent.beauchamp@vates.tech>
2025-12-19 11:28:51 +01:00
Mathieu
7827b27d63 fix(xo-server): fix http.proxies when redirectToHttps=true (#9339)
introduced by 7c1764a39e
fix [forum#11681](https://xcp-ng.org/forum/post/100852)
2025-12-19 11:11:35 +01:00
Mathieu
86ddff46a9 fix(xo-server-openmetrics): hardcode port and bind address for security (#9337) 2025-12-19 10:35:50 +01:00
Pierre Donias
476f4e5f1f fix(xo-server/signin-otp): pass xo5Mount param to Pug template (#9340) 2025-12-19 10:12:24 +01:00
Elise-F
8448b4d5a6 feat: release 6.0.0 (#9336) 2025-12-18 16:36:07 +01:00
Elise-F
28952a0a4a feat: technical release (#9334) 2025-12-18 12:21:33 +01:00
Pierre Brunet
19f973fcd3 fix: replace deprecated endpoint call (#9316)
Call to deprecated route restore/logs replaced by restore-logs/
2025-12-18 09:20:48 +01:00
OlivierFL
d9fe9b603f fix(xo-6/account-menu): license url was not redirecting properly to XO 5 (#9321) 2025-12-17 17:49:46 +01:00
OlivierFL
13a462429e fix(xo-6/xo-lite/new-vm-form): change "memory" section to "resource management" for better clarity (#9309) 2025-12-17 17:45:08 +01:00
Mathieu
bfe788e096 fix(@xen-orchestra/web-core): fix race condition on reactive store (#9307)
Introduced by 5d28710ab3
2025-12-17 17:37:15 +01:00
Mathieu
980e4b5887 Feature openmetrics (#9323) 2025-12-17 17:17:53 +01:00
Florent BEAUCHAMP
0d8cb990c6 fix(xen-api): don't eat relevant error during import (#9327)
don't eat relevant error during import

SR contains the full list of the VDI on the SR
host contains the full list of the VM on the HOST
2025-12-17 16:40:30 +01:00
vates-bot
7794adfb89 feat(web-stack/i18n): update Xen Orchestra 6 (#9305) 2025-12-17 16:14:27 +01:00
Mathieu
fb67e8eea7 fix(xo-server): report 0 RAM usage for halted hosts (#9272) 2025-12-17 16:01:17 +01:00
Pierre Brunet
1316a811f5 feat(plugins/backup-report): add custom subject in plugin settings (#8973) 2025-12-17 15:41:11 +01:00
Joris K
c6f47f9ef3 feat(xo6/vm): implement tasks view and side panel information (#9313) 2025-12-17 15:31:45 +01:00
Joris K
c2a95467f8 feat(xo6/host): implement tasks view and side panel information (#9311) 2025-12-17 15:25:45 +01:00
Joris K
4d58ff885a feat(xo6/pool) implement tasks view and side panel information (#9312) 2025-12-17 15:15:08 +01:00
Florent BEAUCHAMP
3892eee7a0 fix(xo-server): changelog after xosan removing (#9302) 2025-12-17 15:01:33 +01:00
Joris K
15b9e13ed2 feat(xo6/site): implement tasks view and side panel information (#9063) 2025-12-17 14:50:34 +01:00
Mathieu
e504b8af0f fix(@xen-orchestra/rest-api): fix duplicated entries with ndjson (#9320) 2025-12-17 12:02:22 +01:00
Mathieu
efc751c54e fix(xo-server): check certificate instead port to define secure protocol (#9324) 2025-12-17 11:35:50 +01:00
Mathieu
8b4c953ab0 docs(configuration): update doc for XO5 by default (#9296) 2025-12-17 09:44:50 +01:00
OlivierFL
32b3c0b5fc refactor(web-stack/translations): remove duplicates, improve pluralization, improve actions, clean translations (#9295) 2025-12-16 15:51:57 +01:00
Mathieu
7c1764a39e fix(xo-server): fix proxied urls when using ssl (#9314)
introduced by 03cea8b24d

Fixed [forum#11681](https://xcp-ng.org/forum/topic/11681/xo5-breaks-after-defaulting-to-xo6-from-source/16?_=1765875445829)
2025-12-16 11:23:54 +01:00
Pierre Brunet
b248cddece fix: perf-alert unload (#9306) 2025-12-16 10:19:50 +01:00
Florent BEAUCHAMP
df2dc3a710 fix(xapi): don't fail detecting image format on suspend disk (#9308)
from #48758

suspend_vdi  disk created for snapshot with memory are snapshot
but don't have a parent, thus failing the check 

introduced by c870bb653a
2025-12-15 17:08:26 +01:00
Elise-F
227063341e feat: technical release (#9310) 2025-12-15 16:00:02 +01:00
Mathieu
a4ab2e8b06 feat(@xen-orchestra/rest-api): add reactivity on task store (#9271) 2025-12-15 10:51:58 +01:00
Mathieu
9f3872a5f1 feat(@xen-orchestra/rest-api): ability to subscribe to task changes (#9269) 2025-12-12 18:07:39 +01:00
mathieuRA
e2d727abe5 fix(@xen-orchestra/rest-api): fix cannot read property of undefined on VM dashboard 2025-12-12 17:27:35 +01:00
mathieuRA
11720d96f1 fix(@xen-orchestra/rest-api): fix cannot convert undefined or null to object 2025-12-12 17:27:35 +01:00
vates-bot
859ebb892d feat(web-stack/i18n): update Xen Orchestra 6 (#9243) 2025-12-12 13:06:18 +01:00
Pierre Brunet
035ee8fb8e refactor: remove all xosan components (#9248)
XOSAN is not used anymore by clients. We can safely remove it from code base to clean it up.
2025-12-11 17:14:04 +01:00
Mathieu
bc69046bdd feat: technical release (#9301) 2025-12-11 15:22:37 +01:00
spacotte-vates
debde3f16e fix(xo-server): fix guiRoute generation (#9299) 2025-12-11 15:09:08 +01:00
Joris K
3eb9efe1f2 feat(web-core): add UiTaskItem and UiTaskList components (#9009) 2025-12-10 17:18:57 +01:00
Mathieu
7cf9726876 feat: technical release (#9297) 2025-12-10 15:08:46 +01:00
Pierre Briffaux
64d9f8c39e feat(xo6): update links to XO-5 (#9214) 2025-12-10 14:38:02 +01:00
Mathieu
03cea8b24d feat(xo-server): set XO6 the default page (#9212) 2025-12-10 14:29:49 +01:00
Bastien Nollet
4b4c9b91f3 fix(xo-web): allow offline delta backups (#9228) 2025-12-10 13:19:09 +01:00
Mathieu
907ee7d88c feat(@xen-orchestra/web): display modal of the first connection (#9230) 2025-12-10 12:52:01 +01:00
Enée DI IORIO
dbdc4cac4a fix(web-core): fix pagination placement (#9264) 2025-12-10 10:16:33 +01:00
Bastien Nollet
19c0b958fc fix(backups): fix incorrect info on mirror backups (#9286)
From forum#11623
2025-12-10 09:39:03 +01:00
Florent BEAUCHAMP
e5d2e83de6 fix(backups): cleanup .vhd.checksum files (#9291) 2025-12-10 09:19:58 +01:00
spacotte-vates
85596da792 fix(xo-server): improve handling of xapi snapshots (#9231)
In some cases, when converting an xapi object into an xo object, the xapi.is_a_snapshot param may be set to false even tho the xapi.snapshotOf refers to another xapi object. Handle this case better.
2025-12-10 09:16:18 +01:00
Pierre Brunet
230749a3f3 feat(fs/s3): DeleteObjectsCommand (#9281) 2025-12-10 09:08:35 +01:00
Bastien Nollet
b667bc8a23 fix(@xen-orchestra/fs): avoid retrying on some statuses (#9188) 2025-12-09 17:50:32 +01:00
Mathieu
76abf1ed73 docs(restapi.md): update REST API docs (#9284) 2025-12-09 14:18:51 +01:00
Mathieu
54930ee07f fix(@xen-orchestra/rest-api): vmProtected -> vmProtection (#9288) 2025-12-09 11:53:18 +01:00
Mathieu
90295ca924 feat(@xen-orchestra/web): redirect non admin to xo5 (#9219) 2025-12-09 11:48:04 +01:00
Mathieu
e281c536d3 feat: release 5.113.2 (#9290) 2025-12-09 11:32:27 +01:00
Mathieu
efa5b1a71e feat(@xen-orchestra/rest-api): display URL of the openApi spec (#9285) 2025-12-09 11:10:10 +01:00
Mathieu
62aaa21ced feat: technical release (#9289) 2025-12-09 10:19:09 +01:00
Florent BEAUCHAMP
dfbf654159 fix(xo-server-perf-alert): improve email alert subject (#9283) 2025-12-08 18:03:26 +01:00
spacotte-vates
4bc614ffd1 fix(xo-server-auth-oidc): fix groups import on string (#9280)
Introduced in 6cd0710

For some OIDC auth provider, when the user only has 1 group, the idToken groups param is a string and not an array.
2025-12-08 15:17:09 +01:00
Thierry Goettelmann
1640a6ae00 feat(web-stack): enhance tree lib and add persistence to XO6 navigation tree (#9277) 2025-12-05 15:56:05 +01:00
Thierry Goettelmann
66b677af28 feat: migrate XO Lite tables. introduces new tables. clean code. (#9265) 2025-12-03 17:31:24 +01:00
Thierry Goettelmann
655bda4789 feat(web-stack): table system iteration (composition over config) (#9247) 2025-12-02 17:57:54 +01:00
Thierry Goettelmann
07e605162a refactor(web-core): merge busy prop into type in VtsStateHero (#9273) 2025-12-02 17:36:29 +01:00
Pierre Donias
ce98c3deba fix(web/vdis): xo 5 fallback URL query should start with a "?" (#9267)
Introduced by #9232
See https://xcp-ng.org/forum/post/100170
2025-12-02 10:24:44 +01:00
MlssFrncJrg
71fa8924d7 feat: release 5.113.1 (#9263) 2025-11-28 13:01:09 +01:00
MlssFrncJrg
9c78018662 feat: technical release (#9262)
* feat(xo-server-perf-alert): 1.0.3

* chore(CHANGELOG): update next
2025-11-28 12:16:37 +01:00
Florent BEAUCHAMP
72f31d412d fix(xo-server-perf-alert): compute core average if cpu_usage is missing (#9258) 2025-11-28 11:51:55 +01:00
MlssFrncJrg
ef60450dc8 feat(lite): 0.17.0 (#9261) 2025-11-28 10:11:57 +01:00
MlssFrncJrg
f4988c00af feat(lite): 0.17.0 (#9260) 2025-11-27 18:06:40 +01:00
MlssFrncJrg
43c9f574fd feat: release 5.113.0 (#9259) 2025-11-27 17:36:38 +01:00
MlssFrncJrg
a15eeeed5b feat: technical release (#9257) 2025-11-27 16:29:04 +01:00
Florent BEAUCHAMP
14a72a2612 fix(xo-server-perf-alert): better handling of VM not loaded in xapi and undefined (#9256) 2025-11-27 16:16:35 +01:00
Mathieu
68554b3e0a fix(@xen-orchestra/core): predicate early return if undefined (#9255)
introduced by 5d28710ab3
2025-11-27 16:05:35 +01:00
MlssFrncJrg
91d5107e1d feat: technical release (#9254)
* feat(@xen-orchestra/web): 0.34.1

* feat(xo-server-perf-alert): 1.0.1

* chore(CHANGELOG): update next
2025-11-27 15:03:51 +01:00
Florent BEAUCHAMP
8e46b83d3e fix(xo-server-perf-alert): copy template to dist and fix imports (#9253) 2025-11-27 14:47:08 +01:00
Mathieu
6105681df2 fix(@xen-orchestra/web): add missing bios_strings field (#9252)
introduced by 0c92bf559a
2025-11-27 14:41:32 +01:00
Thomas Moraine
05713d16c0 docs(proxy.md): explain error message for incompatible proxies (#9245)
Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-11-27 13:24:06 +01:00
MlssFrncJrg
1c6bc86794 Release (#9251)
* feat(vhd-lib): 4.14.5

* feat(@vates/nbd-client): 3.2.2

* feat(@xen-orchestra/web-core): 0.35.0

* feat(@xen-orchestra/rest-api): 0.21.1

* feat(@xen-orchestra/vmware-explorer): 0.10.6

* feat(@xen-orchestra/web): 0.34.0

* feat(xo-server): 5.193.1

* feat(xo-server-auth-oidc): 0.4.0

* feat(xo-server-perf-alert): 1.0.0

* feat(xo-web): 5.191.0

* chore(CHANGELOG): update next

* feat(vhd-cli): 1.0.0

* add missing lib
2025-11-27 13:23:09 +01:00
Florent BEAUCHAMP
21b4d1ee34 docs(xo-server): guidelines (#8583)
Co-authored-by: Mathieu <70369997+MathieuRA@users.noreply.github.com>

Co-authored-by: Bastien Nollet <150058367+b-Nollet@users.noreply.github.com>

Co-authored-by: Mathieu <goore.csmoviz@gmail.com>

---------

Co-authored-by: Mathieu <70369997+MathieuRA@users.noreply.github.com>
Co-authored-by: Bastien Nollet <150058367+b-Nollet@users.noreply.github.com>
Co-authored-by: Mathieu <goore.csmoviz@gmail.com>
2025-11-27 11:45:22 +01:00
MlssFrncJrg
0c92bf559a feat(xo6/web): add boot firmware at vm creation (#9158) 2025-11-27 10:51:36 +01:00
Mathieu
5d28710ab3 feat(@xen-orchestra/web): implement reactivity for sub-stores (#9250) 2025-11-27 09:42:29 +01:00
Thierry Goettelmann
3126688d5e fix(web): charts reload every 30 seconds (#8939) 2025-11-27 09:24:51 +01:00
Elise-F
e70fe39934 feat(xo6): implement vdis tab page (#9232) 2025-11-26 18:33:41 +01:00
Enée DI IORIO
0af02941ed feat(xo6/pool/hosts): refactoring pool hosts page (#9218) 2025-11-26 17:54:10 +01:00
Florent BEAUCHAMP
779876ede9 feat(xo-server-perf-alert): improve performances (#9070) 2025-11-26 17:25:55 +01:00
Enée DI IORIO
dd8bb763e5 fix(xo-stack/resourceManagement): fix resourceManagement card if controllerMemory is undefined (#9197) 2025-11-26 17:04:42 +01:00
Enée DI IORIO
5e6c19b39f fix(web-core): add tooltip on UiTag (#9184) 2025-11-26 16:05:40 +01:00
Mathieu
dbb76cce6e fix(@xen-orchestra/rest-api): status code 400 instead of 500 for CM parse error (#9244)
See https://team.vates.fr/vates/pl/uu1c3r4bzbnx7gjon8xf6wmzsc
XO-1569
2025-11-26 15:15:53 +01:00
Mathieu
5cf1de5356 feat(xo6): implement reactivity for XAPI objects (#9183) 2025-11-26 14:20:50 +01:00
OlivierFL
bed27e5ffa fix(xo-6/dashboard): prevent double scrollbar in alarms lists (#9246) 2025-11-26 12:00:42 +01:00
Mathieu
bff4e4d4e2 fix(@xen-orchestra/rest-api/backup-archive): fix cannot convert undefined or null to object (#9240)
introduced by 544590a
fix zammad#48178
2025-11-26 09:47:45 +01:00
Enée DI IORIO
97d202dae0 feat(web-core): update UiLabel from V1 to V3 (#9201) 2025-11-26 09:40:20 +01:00
spacotte-vates
460bbc4569 fix(nbd-client): fix esxi 6 warm migration (#9223) 2025-11-26 09:21:19 +01:00
Bastien Nollet
708089622d feat(vhd-cli): accept all types of remotes (#9235) 2025-11-26 09:02:08 +01:00
OlivierFL
1818a031af feat(xo6/header): add DC Scope and DC NetScope buttons (#9242) 2025-11-26 08:23:56 +01:00
Mathieu
5cc6154bd2 fix(@xen-orchestra/rest-api): remove unused import (#9241) 2025-11-25 16:14:15 +01:00
spacotte-vates
6cd0710f89 feat(xo-server-auth-oidc): import user groups from OIDC (#9206) 2025-11-25 16:11:47 +01:00
Cyrille G.
65858c9ce7 feat(hub/recipes): add support for XO CCM and custom CIDR configurations in Pyrgos form (#9236) 2025-11-25 12:10:27 +01:00
Florent BEAUCHAMP
6277a12c4a fix(nbd-client): nbddisk must emit full size block (#9233) 2025-11-25 11:57:41 +01:00
Thomas Moraine
16de2e9fca docs(configuration.md): document changing the default XO interface (#9225) 2025-11-25 10:56:59 +01:00
Pierre Donias
39fa0f041f feat(xo-web/disk): (dis)connectVbd → (dis)connectVbds (#9211)
See Zammad#47676

Always use bulk methods for connecting or disconnecting a VBD so that
confirmation modals behaviours are mutualized.
2025-11-25 10:51:52 +01:00
vates-bot
ca3a7540f4 feat(web-stack/i18n): update Xen Orchestra 6 (#9165) 2025-11-25 10:40:59 +01:00
MlssFrncJrg
0bac1d3e0e feat: technical release (#9237) 2025-11-24 17:30:39 +01:00
MlssFrncJrg
99f221ccbf feat(xo-6): inform user about VM creation limitations (#9203) 2025-11-24 14:51:52 +01:00
Pierre Brunet
f24952f967 chore(xo-web): update marked to more recent version (#9227)
Fix https://github.com/vatesfr/xen-orchestra/security/dependabot/27
2025-11-24 14:36:08 +01:00
Pierre Brunet
566b210d1e chore(xo-web): update ansi_up (#9226) 2025-11-24 13:55:45 +01:00
Florent BEAUCHAMP
5fc2e4e8e5 fix(nbd-client): wrong comment leads to bad code (#9222) 2025-11-24 10:44:58 +01:00
Mathieu
65de89c7ee fix(@xen-orchestra/rest-api): don't return job for /backup-jobs endpoint (#9210)
* fix(@xen-orchestra/rest-api): don't return job for /backup-jobs endpoint
2025-11-24 10:37:06 +01:00
Bastien Nollet
1c55ca61e2 feat(xo-server-load-balancer): affinity tags (#9116)
Add Affinity rule option to the load balancer plugin.
This options ensures some VMs are positioned on the same host, when it's possible.

It's important to be careful while configuring the Affinity tags and Anti-affinity tags fields, otherwise it may lead to conflicts between the two behaviours. In such case, affinity takes precedence over anti-affinity.
2025-11-24 10:29:29 +01:00
Mathieu
ed5bd4d42e Feat/use vif move for network change (#9221)
* feat(vif): use VIF.move for network changes instead of delete+create
2025-11-24 09:56:00 +01:00
Julien Porschen
488eec9d1c fix(backups): handle LVM on GPT partitions #7029 (#9182)
* fix(backups): handle LVM on GPT partitions on file level restore #7029
* fix(backups): ignore swap partition of file level restore
2025-11-24 09:51:28 +01:00
Elise-F
89d45caac9 feat(xo6): fetch xo gui routes (#9138) 2025-11-24 08:51:44 +01:00
Mathieu
2592f2fc2c feat(xo-server-usage-report): add RAM/CPU allocation to reports (#9224) 2025-11-20 17:28:35 +01:00
spacotte-vates
87547a2130 fix(@xen-orchestra/rest-api): async actions return json (#9209) 2025-11-20 16:12:21 +01:00
Enée DI IORIO
5349f2ad09 fix(web-core): remove secondary cancel button on search input (#9189)
fix(web-core/uiInput): remove secondary cancel button on search input
2025-11-19 17:02:19 +01:00
Joris K
d34025fd25 feat(xo6/host): update vms view and implement new page vms and sidepanel (#9193) 2025-11-19 08:59:56 +01:00
Joris K
c53758ddc5 feat(xo6/pool) update vms view and implement new page vms and sidepanel (#9196) 2025-11-19 08:39:22 +01:00
Elise-F
90d1207a3c feat(xo6): creating setting page (#9175) 2025-11-18 17:16:15 +01:00
Joris K
9f478f97a2 feat(xo6/site): implement vms page (#9145) 2025-11-18 17:05:59 +01:00
Pierre Briffaux
e86bd71819 fix(web-core/MenuList): add overflow scroll to prevent content clipping (#9215) 2025-11-18 17:04:08 +01:00
Pierre Brunet
53c1a33106 security: update nodemailer (#9217)
Fix Nodemailer: Email to an unintended domain can occur due to Interpretation Conflict: https://github.com/vatesfr/xen-orchestra/security/dependabot/246
2025-11-18 09:23:27 +01:00
Pierre Brunet
7c06abc99f chore(saml): update GW tutorial (#9119)
Changes thanks to the forum posts here:
https://xcp-ng.org/forum/topic/6174/saml-auth-with-azure-ad/29?_=1760599896992
2025-11-18 09:06:23 +01:00
Pierre Brunet
2a5b0ffd1a security: update package xml2js in xo-web and xo-vmdk-to-vhd (#9216)
Update xml2js in xo-web and xo-vmdk-to-vhd for security purpose
Fix https://github.com/vatesfr/xen-orchestra/security/dependabot/84
2025-11-18 09:04:54 +01:00
Pierre Brunet
e494007b2a security: update cookie package (#9220)
Update cookie package in xo-server for security
Fix https://github.com/vatesfr/xen-orchestra/security/dependabot/167

Proxy check tested
2025-11-18 09:03:48 +01:00
OlivierFL
c2fb0470fc feat(xo-6/host): add storage repositories page and table (#9137) 2025-11-17 15:46:42 +01:00
OlivierFL
5fb5e639cd feat(xo-6/pool): add storage repositories page (#9134)
* fix reactivity issue in progress.util

* update VtsProgressBar component to display progress bar with no ruler

* create and use ProgressCell in Table
2025-11-17 15:01:42 +01:00
OlivierFL
da3733a3a9 feat(xo-6/backups): update wordings for backups modes (#9199) 2025-11-17 11:10:57 +01:00
Florent BEAUCHAMP
bd7ba64b68 fix(vmware-explorer): force vddk library path (#9208)
fix ticket 47466
2025-11-14 16:29:34 +01:00
Enée DI IORIO
436e2ea168 feat(xo6/site) implement hosts page (#9128) 2025-11-14 16:09:32 +01:00
Mathieu
dcbd550961 fix(@xen-orchestra/rest-api): fix eventListener not reattached (#9191) 2025-11-14 11:56:50 +01:00
Thierry Goettelmann
8811bb4bac feat(xo6): migrate typing to @vates/types (#9186) 2025-11-14 09:09:33 +01:00
Joris K
2d06677887 fix(xo6/host/vm): fix issues with condition on dashboards, and chart translation (#9204) 2025-11-13 09:23:37 +01:00
Mathieu
6cfefc91e4 feat(@xen-orchestra/rest-api): expose vms/:id/dashboard (#9143) 2025-11-12 18:01:41 +01:00
Florent BEAUCHAMP
8dc7254128 fix(backups): getOldEntries must accept entries without id or timestamp (#9202)
introduced by #9180 https://github.com/vatesfr/xen-orchestra/pull/9180
2025-11-12 17:42:18 +01:00
Pierre Donias
18a41cd055 feat(xo-web/menu): add link to XO 6 (#9187) 2025-11-12 15:31:06 +01:00
spacotte-vates
a7ad70bbed feat(rest-api): add vm.tags to backups-archives (#9190) 2025-11-12 11:10:17 +01:00
Mathieu
fa0202f5b3 docs(xo): add Gmail App Password and Microsoft 365 auth guidance (#9194)
* docs(xo): add Gmail App Password and Microsoft 365 auth guidance

* fix(docs): update email authentication guidance and improve clarity

* fix(docs): clarify backup-reports plugin configuration step

Co-authored-by: Thomas Moraine <thomas.moraine@vates.tech>

---------

Co-authored-by: Mathieu Piton <mathieu.piton@vates.tech>
Co-authored-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-11-10 09:32:40 +01:00
Elise-F
88b88187e9 feat(xo6): updated ui of input search (#9156)
* feat(xO6): udpate ui of input search

* updated changelog file

* feat(web-core): updated story of ui input component

* feedbacks on PR
2025-11-07 17:21:02 +01:00
Mathieu
ade825df55 fix(@xen-orchestra/xapi): await VBD.plug (#9192)
introduced by d353dc622c
2025-11-07 15:07:21 +01:00
Thierry Goettelmann
042c9c645b chore(types): complete exiting xo type definitions (#9174) 2025-11-06 10:05:51 +01:00
Dan Pollak
6bf5f4b7d4 feat(xo-server/recover-account): supply password via CLI (#9173)
Allow password to be passed as a parameter
2025-11-05 16:40:41 +01:00
Bastien Nollet
063f499ee0 fix(docs): fix long-term retention doc (#9178) 2025-11-05 15:39:03 +01:00
Mathieu
e4d484e84f feat(xo-server-usage-report): add OS information to usage reports (#9179)
---------

Co-authored-by: Mathieu Piton <mathieu.piton@vates.tech>
2025-11-05 14:24:29 +01:00
Florent BEAUCHAMP
05c6f87a12 fix(backups): long term retention taking the most recent values (#9180) 2025-11-05 11:01:43 +01:00
Pierre Donias
8a390057b6 fix(backups): typos and spelling (#9154)
See #8593

Co-authored-by: Florent BEAUCHAMP <florent.beauchamp@vates.tech>
2025-11-05 10:20:58 +01:00
Alexander Sennhauser
82d65e3c68 describe correct tag for backup health check (#9010) 2025-11-05 10:17:17 +01:00
Pierre Donias
58f029dcbe feat(xo-web/VM/backup): warn that backup job affects all VMs (#9155)
See Zammad#45581
2025-11-04 15:58:32 +01:00
Mathieu
7112c33142 feat(@xen-orchestra/rest-api): expose events (#9130) 2025-11-04 15:05:06 +01:00
Thomas Moraine
08c2923386 docs(xo): document immutability (#9135)
Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-11-04 11:50:41 +01:00
Thomas Moraine
ed5be40099 docs(manage_infrastructure.md): update container/docker information (#9140)
This commit renames and updates the **Docker management** section in the Xen Orchestra documentation. We explain a but better how containers are supported in Xen Orchestra, and remove links and references to the now-removed Docker support section, which was triggering a Docusaurus warning at build time.

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-11-04 09:40:28 +01:00
Bastien Nollet
8c038bac34 feat: release 5.112.1 (#9177) 2025-11-03 14:37:36 +01:00
Bastien Nollet
961b505cfb feat: technical release (#9176) 2025-11-03 12:14:53 +01:00
Florent BEAUCHAMP
32556029cd feat(backups): export qcow2 disk as qcow2 (#9170)
fix full backups for delta
2025-11-03 10:54:11 +01:00
Mathieu
65013190e3 fix(xo-server/rpu): update linstor-satellite and linstor-controller (#9171) 2025-11-03 10:29:33 +01:00
OlivierFL
2dd451a7d9 fix(xo-6/backup-settings): reactivity issue when using useXoBackupJobSettingsUtils (#9169)
Introduced by e547447
2025-10-31 14:27:16 +01:00
Pierre Brunet
73a8ba59ba fix(xo-web): update easyvirt forms for DC Net Scope (#9107) 2025-10-31 11:07:33 +01:00
Bastien Nollet
285d1da361 feat(lite): 0.16.0 (#9167) 2025-10-30 18:24:47 +01:00
Bastien Nollet
4d77b79ce9 feat: release 5.112.0 (#9166) 2025-10-30 17:55:30 +01:00
Bastien Nollet
268033439b feat: technical release (#9164) 2025-10-30 15:25:41 +01:00
Florent BEAUCHAMP
df3a365eb7 fix(xapi): use qcow2 exports only for bigger disks (#9163) 2025-10-30 15:01:05 +01:00
MlssFrncJrg
61ee81ea3a fix(@vates/types): add packages to release in changelog (#9161)
introduced by cfb64f8
2025-10-30 12:50:37 +01:00
vates-bot
2789b339cb feat(web-stack/i18n): update Xen Orchestra 6 (#9095) 2025-10-30 11:59:16 +01:00
Olivier Floch
c895f05486 feat(xo6): introduce constants.ts file to avoid duplications 2025-10-30 11:17:43 +01:00
Olivier Floch
ed3f50cb1a feat(xo6/backups): add breadcrumb in backups pages header 2025-10-30 11:17:43 +01:00
Olivier Floch
6bb90082b9 feat(xo-core): add UiBreadCrumb component 2025-10-30 11:17:43 +01:00
Florent BEAUCHAMP
c870bb653a fix(backups): use qcow2 for export of qcow2 disks (#9160) 2025-10-30 09:20:35 +01:00
Florent BEAUCHAMP
b11484ce6d fix(xo-web): image format in disk tab of vm (#9157) 2025-10-29 16:04:02 +01:00
MlssFrncJrg
cfb64f8e0d feat(@xen-orchestra/rest-api): add boot firmware for VM creation (#9147) 2025-10-29 15:51:11 +01:00
Enée DI IORIO
d6e0f70510 feat(xo-6/backups) add backup targets page (#9048) 2025-10-29 15:33:56 +01:00
Pierre Donias
b47a7055a2 feat(netbox): support Netbox v4.4.x (#9153)
Fixes #8958
2025-10-29 15:26:19 +01:00
MlssFrncJrg
a101e9e02d feat(@xen-orchestra/rest-api): expose gui routes (#9133) 2025-10-29 15:04:11 +01:00
Enée DI IORIO
e547447bb4 feat(xo-6/backups): add backup configuration page (#9008) 2025-10-29 14:49:44 +01:00
Florent BEAUCHAMP
5d92f813f6 feat(xo-server): support import of disk > 2TB toward qcow2 SR (#9148) 2025-10-29 10:13:44 +01:00
Florent BEAUCHAMP
ab4e20b0a5 fix(vhd-lib): error while handling open error (#9151)
fix an error Cannot read properties of undefined while handling an error raised during a vhd file error.
2025-10-29 10:04:25 +01:00
Mathieu
ff4b087be8 feat(xo-cli): add system status download functionality for hosts and pools (#9141)
Add two new API methods to download XCP-ng/XenServer system status (bug reports) via xo-cli:

    host.getSystemStatus - Download system status from a single host
    pool.getSystemStatuses - Download system status from all hosts in a pool in parallel


---------

Co-authored-by: Mathieu Piton <mathieu.piton@vates.tech>
2025-10-29 09:29:20 +01:00
Elise-F
09208ba0fb feat(xo6): added loader in treeview when search is triggered (#9142)
* feat(xo6): added loader in treeview when search is triggered

* update changelog file

* fix(xo6): code cleanup following PR feedback

* fix order packages in changelog file
2025-10-29 09:23:54 +01:00
Elise-F
896e9386a9 feat(xo6): added new links in the user menu and customized it (#9126)
* feat(xo6): added new links in the user menu and customized it

* udpate Changelog file

* fix(xo6): code cleanup following PR feedback

* fix order packages in changelog file
2025-10-29 09:15:10 +01:00
Olivier Lambert
87471d90c4 feat(@xen-orchestra/xapi): expose IPMI sensors for Lenovo hardware (#9149)
---------

Signed-off-by: Olivier Lambert <olivier.lambert@vates.fr>
Co-authored-by: Mathieu <70369997+MathieuRA@users.noreply.github.com>
Co-authored-by: Florent BEAUCHAMP <florent.beauchamp@vates.tech>
2025-10-28 19:15:37 +01:00
Enée DI IORIO
740fc03a04 feat(xo-6/backups): add backed up vms page (#9018)
Co-authored-by: Olivier Floch <olivier.floch@vates.fr>
2025-10-28 17:08:08 +01:00
Florent BEAUCHAMP
45ef65b251 fix(qcow2): number/bigint comparison (#9150) 2025-10-28 15:47:27 +01:00
Florent BEAUCHAMP
bf705e0a98 feat(xo-web): add merge synchronously option to mirror backups (#9118) 2025-10-28 14:15:30 +01:00
Thomas Moraine
989864314f docs: upgrade docusaurus from version 3.8 to 3.9.2 (#9073)
docs: upgrade docusaurus from version 3.8 to 3.9

The onBrokenMarkdownLinks option is deprecated and has been replaced by siteConfig.hooks.onBrokenMarkdownLinks. However, since the option was configured to 'warn' and is the default behavior for this option, deleting the onBrokenMarkdownLinks seems like easier

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-10-28 12:20:53 +01:00
MlssFrncJrg
0a377f9568 feat(@xen-orchestra/rest-api): expose ping (#9129) 2025-10-28 10:10:27 +01:00
Anthoine Bourgeois
cb96de6d11 feat: Qcow2Disk: support sub-cluster feature
Signed-off-by: Anthoine Bourgeois <anthoine.bourgeois@vates.tech>
2025-10-28 09:43:37 +01:00
Anthoine Bourgeois
7e032e9f84 fix: Qcow2Disk: fix host cluster offset mask
Signed-off-by: Anthoine Bourgeois <anthoine.bourgeois@vates.tech>
2025-10-28 09:43:37 +01:00
Bastien Nollet
51855c22d4 feat: technical release (#9146) 2025-10-27 12:13:55 +01:00
MathieuRA
676b059485 fix(xo-lite): set default cores-per-socket value 2025-10-27 11:41:38 +01:00
MathieuRA
81d0d28819 fix(xo-server): set default cores-per-socket value 2025-10-27 11:41:38 +01:00
Pierre Brunet
9123921676 Chore: update rimraf packages to fix glob ending support (#9046)
feat: update rimraf
2025-10-27 09:48:17 +01:00
Mathieu
544590a860 feat(@xen-orchestra/rest-api): expose backup-archives (#8982)
XO-1468
2025-10-24 17:29:10 +02:00
OlivierFL
63e7eb881c feat(xo-6/backups): add backup runs page (#9007) 2025-10-24 11:09:35 +02:00
Bastien Nollet
030d697392 fix(xo-server-load-balancer): correctly avoid migrating tagged VMs (#9139)
Introduced by 9ef05b8afe
2025-10-23 15:45:32 +02:00
Florent BEAUCHAMP
af56933587 fix(backups): wrong error on close before init (#9125)
this happens if the disk init fails, for example when trying
to read qcow2 disk from a non qcow2 SR
2025-10-22 15:56:21 +02:00
bleader
ec0bdb3286 docs(sdn-controller): document OpenFlow XAPI plugin usage (#9114)
- State to use a single XOA instance with SDN Controller plugin enabled
- Cleanup existing OpenFlow documentation
- Document XAPI plugin usage, including xo-cli commands
- Add configuration to toggle between direct channel and XAPI plugin
2025-10-21 16:46:14 +02:00
OlivierFL
70055960d0 feat(xo-core): update logical properties wording in CSS guidelines (#9132) 2025-10-21 11:12:52 +02:00
Pierre Donias
a9ab882b75 fix(fatfs): typos and spelling (#9131)
See #8593
2025-10-20 16:49:04 +02:00
Elise-F
bce7408f1f feat(xo6): add loader on input search treeview when is triggered (#9122)
* feat(xo6): add loader on input search treeview when is triggered

* udpate Changelog file

* fix(xo6): removed condition on props icon in UiInput

* fix(xo6): removed debounced on clear
2025-10-20 15:20:12 +02:00
Mathieu
c8abbb259e fix(@xen-orchestra/rest-api): add bad request response documentation (#9108) 2025-10-20 14:07:38 +02:00
Thomas Moraine
35cc755bf0 docs(xo): specify configuration file path (#9127)
Several sections of the Xen Orchestra Appliance documentation mention modifying the config file, without specifying the actual file path. This commit updates those references to explicitly include /etc/xo-server/config.toml, which helps users locate and edit the correct configuration file more easily.

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-10-20 12:10:09 +02:00
Bastien Nollet
5750b58362 fix(xo-web/Size): fix saving Size component (#9121)
Changing the value of a `Size` component by editing the field and pressing
'Enter' was executing twice the `_save()` function in parallel (which calls the
`onChange` function).

In some cases like editing a running VM memory limit, this caused errors (trying
to open two modals at the same time, and trying to restart the VM twice)
2025-10-20 10:28:28 +02:00
Joris K
8a95941297 fix(xo6): fix formatted date in backup jobs (#9124) 2025-10-20 08:45:17 +02:00
Florent BEAUCHAMP
8289150460 feat(vmware-explore): add more debug when failing to get thumbprint (#9012)
from ticket 45117
2025-10-17 14:25:44 +02:00
Florent BEAUCHAMP
87df162944 chores(all): remove jest (#8956)
jest test are unmaintained and flacky, they increase the dependencies surface
2025-10-17 14:24:05 +02:00
Thierry Goettelmann
e9eda42d7d feat(web-stack): new VtsStatus component (#9052) 2025-10-17 10:14:59 +02:00
Thierry Goettelmann
d942d144ca feat(web-core): add objectIcon helper (#9053) 2025-10-17 09:40:50 +02:00
Elise-F
d829816f62 fix(xo6): display user menu above tree structure (#9115)
* fix(xo6): display user menu above tree structure

* add CHANGELOG
2025-10-16 16:47:01 +02:00
Florent BEAUCHAMP
8b3b23e995 fix(backups): throw an error on non unique target for replication (#9117)
from ticket 40151
2025-10-16 15:49:00 +02:00
Cécile Morange
52807ed15f docs(xo): change link to the xcp-ng docs, add some infos in HA section (#9112)
* docs(xo): change link to the xcp-ng docs, add some infos in HA section

* Update docs/docs/manage_infrastructure.md

Co-authored-by: Thomas Moraine <thomas.moraine@vates.tech>

* Update docs/docs/manage_infrastructure.md

Co-authored-by: Thomas Moraine <thomas.moraine@vates.tech>

* Update docs/docs/manage_infrastructure.md

Co-authored-by: Thomas Moraine <thomas.moraine@vates.tech>

---------

Co-authored-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-10-16 14:20:58 +02:00
Florent BEAUCHAMP
596f9ac536 fix(vhd-lib): better error handling
ensure disk is really closed, and that error are caught
2025-10-16 11:30:25 +02:00
Florent BEAUCHAMP
d58efc7b2d fix(xapi): implement Throttling on Xapi/Remote read 2025-10-16 11:30:25 +02:00
Florent BEAUCHAMP
73aa66a219 fix(xapi): implement Timeout on Xapi read 2025-10-16 11:30:25 +02:00
Florent BEAUCHAMP
93c8903953 fix(backups): put back rate speed to full backup, replication and mirror 2025-10-16 11:30:25 +02:00
Florent BEAUCHAMP
dc8c455a0b feat(generator-toolbox): handle unlimited throttle (speed at 0) 2025-10-16 11:30:25 +02:00
Thierry Goettelmann
d601558bf4 feat(web-core): new table system (#9054) 2025-10-16 10:39:22 +02:00
Mathieu
d5cee13e25 fix(@xen-orchestra/rest-api): use middleware instead of route for users/me redirection (#9103)
Introduced by #8985
2025-10-16 09:41:36 +02:00
Florent BEAUCHAMP
151d7ed22a fix(immutable-backups): double delete that can block immut lifting (#9104) 2025-10-15 17:39:11 +02:00
OlivierFL
3d29348337 feat(xo-6/collections): implement virtual lists for Treeview, QuickTasks and Alarms collections in dashboards (#9077) 2025-10-15 17:17:32 +02:00
Thomas Moraine
62ab5a2f5b docs(xo): remove mentions of xscontainer from the xo doc (#9113)
docs(manage_infrastructure.md): remove content related to xscontainer, which is deprecated

Since XSContainer is no longer supported on XCP-ng 8.3 or XenServer and
we currently have no alternative, instructions related to XScontainer in
the XO doc are removed

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-10-15 14:33:31 +02:00
Pierre Brunet
c2d1c66a59 fix(plugin/auth-saml): add default config in SAML (#9093) 2025-10-14 16:30:58 +02:00
Bastien Nollet
730d0ff41d fix(xo-web/Toggle): swallow undefined errors thrown by confirm (#8953)
Updating the `Toggle` component to avoid throwing an error coming from a
`confirm` modal, which ends up appearing in the console.

This also changes a bit the behaviour of the `Toggle` component, which now
awaits its `onChange` function.
2025-10-14 15:11:18 +02:00
Mathieu
64d164300b feat(@xen-orchestra/rest-api): expose pbds (#9106) 2025-10-14 14:44:26 +02:00
Mathieu
04eeb78df7 fix(@vates/types): fix XoSr allocationStrategy (#9105) 2025-10-14 10:44:33 +02:00
Mathieu
6bdfbfb953 feat(@xen-orchestra/rest-api): expose users/authentication_tokens (#9102) 2025-10-14 09:48:31 +02:00
Mathieu
e6573e26a9 feat(xo-server/rest-api): remove legacy code (#9101) 2025-10-14 09:41:28 +02:00
Mathieu
5f5cb9b45d feat(@xen-orchestra/rest-api): expose vdis/:id.(vhd|raw) (#9038)
* feat(@xen-orchestra/rest-api): expose vdi(s|-snapshots)/:id.(vhd|raw)
2025-10-10 14:39:31 +02:00
MlssFrncJrg
940e879a1c feat(@xen-orchestra/rest-api): expose vm-controllers/:id/tags/:tag (#9097) 2025-10-10 11:36:11 +02:00
MlssFrncJrg
861567d0db feat(@xen-orchestra/rest-api): expose vm-templates/:id/tags/:tag (#9099) 2025-10-10 11:23:57 +02:00
MlssFrncJrg
8e536a4c32 feat(@xen-orchestra/rest-api): expose vm-snapshots/:id/tags/:tag (#9098) 2025-10-10 11:10:08 +02:00
MlssFrncJrg
e100736349 feat(@xen-orchestra/rest-api): expose srs/:id/tags/:tag (#9089) 2025-10-10 11:03:17 +02:00
MlssFrncJrg
98e4bcccfa feat(@xen-orchestra/rest-api): expose vdis/:id/tags/:tag (#9094) 2025-10-10 10:43:35 +02:00
MlssFrncJrg
938b34343d feat(@xen-orchestra/rest-api): expose vdi-snapshots/:id/tags/:tag (#9091) 2025-10-10 10:31:03 +02:00
MlssFrncJrg
e1ecc2d6d4 feat(@xen-orchestra/rest-api): remove vifs/:id/tags/:tag (#9096) 2025-10-10 10:22:12 +02:00
Pierre Donias
afabf35c66 fix(xo-web/Copiable): remove gap in hover box (#9059)
See Zammad#45442

Wrap "Copy to clipboard" button with a span to make the hoverable zone
continuous between the copiable element and the button. Without this, the 1ex
gap between the 2 was sometimes enough to make the button disappear before the
user had a chance to click it.
2025-10-10 10:19:50 +02:00
MlssFrncJrg
8e0f48bddd feat(@xen-orchestra/rest-api): remove vbds/:id/tags/:tag (#9090) 2025-10-10 10:13:34 +02:00
MlssFrncJrg
70dc82e621 feat(@xen-orchestra/rest-api): expose srs/:id/tasks (#9086) 2025-10-10 10:03:18 +02:00
Mathieu
2928813613 feat(@xen-orchestra/rest-api): expose vms/:id/tags/:tag (#9092) 2025-10-10 09:54:57 +02:00
MlssFrncJrg
a86d07adea feat(@xen-orchestra/rest-api): expose vbds/:id/tasks (#9085) 2025-10-10 09:48:00 +02:00
Mathieu
a282e10069 feat(@xen-orchestra/rest-api): expose pools/:id/tasks (#9080) 2025-10-09 16:39:13 +02:00
MlssFrncJrg
8a70196fa9 feat(@xen-orchestra/rest-api): expose pools/:id/tags/:tag (#9088) 2025-10-09 14:40:04 +02:00
MlssFrncJrg
1d8ae5eea8 feat(@xen-orchestra/rest-api): expose networks/:id/tags/:tag (#9087) 2025-10-09 12:54:03 +02:00
Mathieu
055bce7d91 feat(@xen-orchestra/rest-api): expose hosts/:id/tags/:tag (#9037) 2025-10-09 10:47:54 +02:00
Thomas Moraine
1ee07eb06f docs(xo): document object storage support list (#9068)
Adds a page to the Xen Orchestra documentation to list the compatible S3-based
storage support providers for Xen orchestra, with the different support tiers
and appropriate caveats.
2025-10-09 09:53:50 +02:00
Joris K
6a5eb12051 fix(xo6/site): issue in backups tab (#9064)
* fix(xo6/site): issue in backups tab

* add changelog
2025-10-08 17:50:05 +02:00
Pierre Brunet
fbf3f1bc7f chore: update doc for SAML due to breaking changes in config (#9084) 2025-10-08 17:13:31 +02:00
MlssFrncJrg
dedfa91669 feat(@xen-orchestra/rest-api): expose vdis-snapshots/:id/tasks (#9082) 2025-10-08 15:47:16 +02:00
MlssFrncJrg
f3480f6939 feat(@xen-orchestra/rest-api): expose vdis/:id/tasks (#9079) 2025-10-08 15:38:35 +02:00
Mathieu
e48166846c feat(@xen-orchestra/rest-api): expose vbds/:id/messages (#9029) 2025-10-08 15:23:05 +02:00
Mathieu
f7a79a0be3 feat(@xen-orchestra/rest-api): expose hosts/:id/tasks (#9074) 2025-10-08 15:02:42 +02:00
Mathieu
f0f1fd1715 feat(@xen-orchestra/rest-api): expose networks/:id/tasks (#9076) 2025-10-08 14:56:47 +02:00
MlssFrncJrg
2e4c45b207 fix(xo-server/rest-api): fix indentation (#9081) 2025-10-08 14:49:44 +02:00
Mathieu
72a3f0a9da feat(@xen-orchestra/rest-api): expose pifs/:id/tasks (#9078) 2025-10-08 14:45:05 +02:00
MlssFrncJrg
2d6f784f0a feat(@xen-orchestra/rest-api): expose vifs/:id/tasks (#9075) 2025-10-08 14:19:48 +02:00
MlssFrncJrg
614449d540 feat(@xen-orchestra/rest-api): migrate vm-controllers tasks (#9069) 2025-10-08 14:12:57 +02:00
Thierry Goettelmann
53ff333778 feat(web-core): introducing toComputed helper (+ migrate codebase) (#8960) 2025-10-08 11:49:12 +02:00
Thierry Goettelmann
4207954982 feat(web-stack): migrate modal system to web-core + enhancements + new UiModal (#8887) 2025-10-08 11:48:46 +02:00
Mathieu
6af64c7095 feat(@xen-orchestra/rest-api): expose groups/:id/tasks (#9072)
XO-1187
2025-10-08 11:05:28 +02:00
Mathieu
7d03560a3e feat(@xen-orchestra/rest-api): expose users/:id/tasks (#9066)
XO-1188
2025-10-08 10:26:06 +02:00
Julien Fontanet
9f9519ef15 docs(xoa): use HTTP for alternative install (#9071)
Introduced by 51b06b1177

Fixes #9067
2025-10-07 20:29:29 +02:00
MlssFrncJrg
0838b112de feat(@xen-orchestra/rest-api): migrate vm-templates tasks (#9004) 2025-10-07 17:29:48 +02:00
Pierre Donias
d6e4456538 fix(xo-web/VM/ActionBar): do not hide actions if user is admin (#9061)
See Zammad#44366

Admin users should always be able to perform actions on VMs even if the VM was
created with Self Service.
2025-10-07 15:57:06 +02:00
Mathieu
022dc0bf2e feat(@xen-orchestra/rest-api): expose servers/:id/tasks (#9065) 2025-10-07 14:55:51 +02:00
MlssFrncJrg
49909df1d2 feat(@xen-orchestra/rest-api): migrate vm-snapshots tasks (#9005) 2025-10-07 14:35:05 +02:00
Mathieu
7c7d7a938e feat(@xen-orchestra/rest-api): expose vm-controllers/:id/messages (#9050) 2025-10-07 14:16:14 +02:00
Mathieu
a67ad48012 feat(@xen-orchestra/rest-api): expose vifs/:id/messages (#9049) 2025-10-06 16:29:27 +02:00
Mathieu
6c6d7a377f feat(@xen-orchestra/rest-api): expose vdis/:id/messages (#9044) 2025-10-06 16:24:11 +02:00
Mathieu
d3006026ca feat(@xen-orchestra/rest-api): expose vdi-snapshots/:id/messages (#9043) 2025-10-06 16:04:41 +02:00
Mathieu
62cdd56691 feat(@xen-orchestra/rest-api): expose networks/:id/messages (#9023) 2025-10-06 15:58:25 +02:00
Mathieu
775e8a8b12 feat(@xen-orchestra/rest-api): expose pifs/:id/messages (#9021) 2025-10-06 15:49:44 +02:00
Mathieu
f5676705cc fix(@xen-orchestra/rest-api): move getTasksObject out of a service (#9058)
Introduced #8955
2025-10-06 15:40:29 +02:00
Pierre Donias
0bad96418b feat: release 5.111.1 (#9062) 2025-10-06 15:26:01 +02:00
Pierre Donias
3222025088 feat: technical release (#9060) 2025-10-06 14:15:47 +02:00
Pierre Brunet
86f3096c1b chore: update packages (#9042)
- passport-saml -> @node-saml/passport-saml
- connect-flash -> typed-flash
2025-10-06 10:42:44 +02:00
Florent BEAUCHAMP
d7fe4f1729 fix(vmware-explorer): thumbprint is case insensitive (#9045)
* fix(vmware-explorer): thumbprint is case insensitive

depending on version ? it can answer a text starting woth sha1 or SHA1
2025-10-03 13:47:27 +02:00
Florent BEAUCHAMP
64a2666645 fix(asyncEach): handle iterator error
this was the cause of  xo:backups:worker WARN possibly unhandled rejection
and the backup error code not triggerring on timeout and various
edge cases
2025-10-03 11:19:55 +02:00
Florent BEAUCHAMP
3b7f623f9e fix(fs): retry writing a file should not throw EEXIST on previous failed write
also removing the retry on outputfile, since outputfile call _writeFile which
is already retried
2025-10-03 11:19:55 +02:00
Florent BEAUCHAMP
16cdbc16fa fix(v2v): do not lock stopped VM (#9047)
imported VM are locked to prepare for a future resume
stopped VM are completly transferred and won't need a future resume
2025-10-03 10:23:26 +02:00
Mathieu
52510ed03c fix(xo-server/users): name property was not present in getAllUsers (#9019)
* fix(xo-server/users): name property was not present in getAllUsers

* Update packages/xo-server/src/xo-mixins/subjects.mjs

Co-authored-by: Florent BEAUCHAMP <florent.beauchamp@vates.tech>

---------

Co-authored-by: Florent BEAUCHAMP <florent.beauchamp@vates.tech>
2025-10-03 10:05:27 +02:00
Mathieu
bbec7d4532 feat(@xen-orchestra/rest-api): expose pools/:id/messages (#9022)
* feat(@xen-orchestra/rest-api): expose pools/:id/messages
2025-10-02 15:13:45 +02:00
Mathieu
cf0449c034 fix(@xen-orchestra/rest-api): fix messages tag (#9024) 2025-09-30 17:00:38 +02:00
Mathieu
9e93ba14ae feat(@xen-orchestra/rest-api): expose hosts/:id/messages (#9027) 2025-09-30 17:00:28 +02:00
Mathieu
bf330311a1 feat(@xen-orchestra/rest-api): expose srs/:id/messages (#9028) 2025-09-30 16:53:56 +02:00
Pierre Donias
481ef5e585 feat(lite): 0.15.0 (#9036) 2025-09-30 16:21:33 +02:00
Pierre Donias
a5debf3241 feat: release 5.111.0 (#9035) 2025-09-30 16:07:25 +02:00
Pierre Donias
d8c106fc5d feat: technical release (#9034) 2025-09-30 15:46:07 +02:00
Enée DI IORIO
8d2af27896 fix(xo-lite/settings): fix key-value alignment (#8981)
* feat(xo-lite/settings): fix key-value alignment

Refactor page for use of more regular components and match better to Figma

* review

* review
2025-09-30 15:40:21 +02:00
Joris K
893cdcbc86 feat(xo6): add alarms in host and vm dashboard, add patches in host dashboard (#8937)
* feat(xo6): add alarms in host and vm dashboard, add patches in host dashboard

* feedback
2025-09-30 15:00:33 +02:00
Pierre Donias
241c37b35c feat: technical release (#9033) 2025-09-30 13:54:47 +02:00
Thierry Goettelmann
57e1b94115 fix(web): failing build (#9030)
Introduced by #8966
2025-09-30 13:25:52 +02:00
Thierry Goettelmann
7c670b479e fix(web): unable to change tab in tasks quick panel (#8930)
* fix(web): unable to change tab in quick task panel

* update CHANGELOG.unreleased.md
2025-09-30 12:33:02 +02:00
Pierre Donias
a1103f6da9 feat: technical release (#9026)
* feat(@xen-orchestra/web-core): 0.31.0

* feat(@xen-orchestra/rest-api): 0.17.0

* feat(@xen-orchestra/web): 0.29.0

* feat(xo-server): 5.190.0

* feat(xo-server-sdn-controller): 1.2.0

* feat(xo-web): 5.187.0

* chore(CHANGELOG): update next
2025-09-30 09:52:59 +02:00
Pierre Brunet
4c5b5f603b feature(hub/recipes): add RGPD compliance in EasyVirt form and bootAfterCreate option (#9016)
Add RGPD compliance in easyvirt creation form and bootAfterCreate option
2025-09-30 09:08:46 +02:00
Pierre Brunet
d77d6d0d9f fix(new-vm): prevent error in case of empty usersshkeys (#9015)
Introduced by #8968 
Reported in #9014
2025-09-29 11:11:05 +02:00
Mathieu
93be967459 feat(@xen-orchestra/xapi): expose vm-templates messages (#8995) 2025-09-29 10:22:59 +02:00
Florent BEAUCHAMP
a62ac1ab82 feat(sdn-controller): use host plugin (#8488)
* feat(sdn-controller): use XCP plugin to manage open switch

try to instantiate the plugin and fall back to direct query
if it fails
The plugin allow to define and target multiple bridges in parallel

* feat(sdn-controller): implement network wide rules

this introduce 2 new API method sdnController.addNetworkRule
and sdnController.deleteNetworkRule
Theses methods will only work with the plugin, and can't work with
the legacy ( direct channel) approach
2025-09-26 17:46:45 +02:00
OlivierFL
55f51184c2 feat(xo-6/vm): add side panel in VM backup jobs page (#8978) 2025-09-26 17:30:37 +02:00
OlivierFL
f7ae461337 feat(xo-6/backups): add backup jobs side panel (#8966) 2025-09-26 17:21:42 +02:00
vates-bot
3f57f2b8ec feat(web-stack/i18n): update Xen Orchestra 6 (#8901) 2025-09-26 13:50:23 +02:00
Pierre Donias
2786c9c392 feat(xo-web/pool): dc scope/netscope button (access or deploy) (#8951)
Try to detect a DC Scope and/or DC NetScope VM and add buttons to access the DC
Scope/NetScope instances.
2025-09-26 10:20:04 +02:00
Joris K
332b4d6197 fix(xo6/vm): fix issue due to incorrect value naming (#8998) 2025-09-26 09:39:58 +02:00
Lux_
8fa7a77fab feat(xo-core/i18n): update french translations (#8983) 2025-09-26 09:34:45 +02:00
Pierre Donias
a0046fa19f feat: technical release (#9013) 2025-09-25 16:15:05 +02:00
Pierre Brunet
692f60c323 feat(xo-web/recipes): add recipe to create EasyVirt VMs (DC Scope and DC NetScope) (#8797)
See xoa#244
2025-09-25 14:45:04 +02:00
Florent BEAUCHAMP
9e4fe7a2a3 fix(xo-web/xostor): resource without volumes should be shown (diskless/tiebreaker) (#8944)
Some tie breaker and diskless volume can be useful for support and advanced usages
2025-09-25 14:09:43 +02:00
Pierre Donias
bcee503a77 chore(CHANGELOG): update LDAP security fix entry (#9011)
See #8639
2025-09-25 11:01:56 +02:00
Mathieu
29af04b8f2 fix(sdn-controller/addHost): fix no PIF found in center (#9000) 2025-09-24 15:19:43 +02:00
Mathieu
c00659ba61 fix(@vates/types): fix typo in warning (#9006) 2025-09-24 12:15:34 +02:00
OlivierFL
d7afda4c52 feat(xo-6/treeview): add debounce to search input (#8992) 2025-09-23 17:05:27 +02:00
Mathieu
d07732119b feat(@xen-orchestra/rest-api): expose vm-snapshots/:id/messages (#8997) 2025-09-23 16:25:35 +02:00
MlssFrncJrg
396ba3868f feat(@xen-orchestra/rest-api): migrate vms tasks (#8955) 2025-09-23 16:15:05 +02:00
MlssFrncJrg
4453bbc16c feat(@xen-orchestra/rest-api): expose users authentication_tokens (#8865) 2025-09-23 15:51:09 +02:00
Mathieu
b01adbe2e1 feat(@xen-orchestra/rest-api): expose (backup|restore)-logs (#8987) 2025-09-23 14:30:42 +02:00
Thomas Moraine
46f5e7bc0d docs(xo): add backup strategy guide (#8881)
Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
Co-authored-by: Florent BEAUCHAMP <florent.beauchamp@vates.tech>
2025-09-23 14:08:19 +02:00
Thomas Moraine
d76e7744e2 docs(xo): document the new migration process (#8934)
Since the 5.110 release of Xen Orchestra, the Vmware to Vates (V2V) process has been updated, with a whole new backend. This commit documents this new process, in the XO documentation

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-09-22 16:52:49 +02:00
Mathieu
b6100980fc feat(@xen-orchestra/rest-api): expose vms/:id/messages (#8988) 2025-09-22 16:23:24 +02:00
Pierre Donias
b8a839068e fix(xo-web/getLicenseNearExpiration): properly check if trial is running (#8991)
Pass the license object to isTrialRunning instead of passing the parent object.

See Zammad#44878 Zammad#44755 Zammad#44431 Zammad#43526 Zammad#44556 ...
Introduced by #8557
See #8523 → #8551 → #8557
2025-09-22 16:22:01 +02:00
Pierre Donias
d2fd68df74 feat(xo-web/PIFs): natural sort by device (#8967) 2025-09-22 09:55:33 +02:00
Mathieu
5d03dc3c10 fix(@xen-orchestra/backups): fix exportIncrementalVm VTPMs (#8990) 2025-09-22 09:55:13 +02:00
Bastien Nollet
1c01f1c7fe fix(xo-server-load-balancer): prevent mass migration when receiving incorrect CPU data (#8965) 2025-09-19 19:20:30 +02:00
Enée DI IORIO
8135148217 feat(xo-lite/settings): add icon for external link (#8980) 2025-09-19 11:02:08 +02:00
Mathieu
067ee26715 feat(@xen-orchestra/rest-api): expose POST srs/:id/vdis (#8984) 2025-09-19 10:13:19 +02:00
Mathieu
c8827ab076 feat(@xen-orchestra/rest-api): expose /users/me* (#8985) 2025-09-19 09:40:30 +02:00
Mathieu
ba4b9b6cb3 feat(@xen-orchestra/rest-api): expose backup-jobs (#8970)
XO-643
2025-09-17 15:19:25 +02:00
Pierre Donias
44d93b90b3 fix(xo-server/resource-sets): only edit limits if limits is passed (#8979)
See https://xcp-ng.org/forum/topic/11241/why-changing-objects-in-resource-set-wipe-limits
Introduced by #7353
2025-09-17 14:02:58 +02:00
Pierre Brunet
7bb6592be4 feat(xo-web/new-vm): add sshkeys in cloudconfig (#8968) 2025-09-17 10:10:20 +02:00
Julien Fontanet
8f2b8791cc feat(complex-matcher): 1.0.0 2025-09-16 14:57:12 +02:00
Julien Fontanet
b56ffbdb8d feat(complex-matcher/Comparison): can match with non numbers
It will use implicit conversion.
2025-09-16 14:53:20 +02:00
Julien Fontanet
b4e05b3183 chore(complex-matcher): add tests for Comparison 2025-09-16 14:52:54 +02:00
Julien Fontanet
c2c8d1b1ea chore(complex-matcher): move number check to Comparison constructor 2025-09-16 14:52:54 +02:00
Joris K
857d038316 feat(xo6/vm): add backup jobs view (#8976) 2025-09-15 17:15:42 +02:00
Joris K
b16d568b7a feat(xo6/lite): update vtsStateHero component (#8910) 2025-09-15 14:33:37 +02:00
Florent BEAUCHAMP
1471ab0c7c fix(backups): replication doing always a full (#8971)
introduced by 8935
sr.$VDIs are xen api objects not xo objects
2025-09-15 14:29:37 +02:00
Mathieu
ee74a640b4 feat(@xen-orchestra/rest-api): expose delete vdi*/:id (#8961) 2025-09-15 14:16:40 +02:00
Mathieu
44bfc28a44 fix(@vates/types,@xen-orchestra/rest-api): fix eslint config (#8974) 2025-09-15 12:25:31 +02:00
Joris K
de0c535976 feat(xo6/lite): update quick info in dashboard VM to match figma (#8952) 2025-09-15 11:05:57 +02:00
Joris K
3fdc97b690 fix(CHANGELOG): add missing packages (#8975)
introduced by ec042d1
2025-09-15 10:05:12 +02:00
Joris K
ec042d1089 feat(web-core): update ui collapsible list component (#8954) 2025-09-12 16:41:54 +02:00
Florent BEAUCHAMP
a459015ca9 Fix(replication): VDI_NOT_MANAGED error (#8935)
from ticket #40151
2025-09-11 15:42:34 +02:00
Florent BEAUCHAMP
4944ea902f fix(schedule): mark sequence progress as completly done on success (#8527) 2025-09-10 17:49:56 +02:00
Mathieu
4c93609bfe feat(xo-server/rpu): add more XO task (#8950) 2025-09-10 17:24:30 +02:00
Bastien Nollet
c2144947c9 feat(xo-server): add a backup guard to reclaiming space on SR (#8947) 2025-09-10 11:06:36 +02:00
Pierre Donias
0d481ffb18 chore: update dependencies (#8888) 2025-09-09 16:48:09 +02:00
Mathieu
b4c22f623d feat(@xen-orchestra/rest-api): expose vms/:id/backup-jobs (#8948)
* feat(@xen-orchestra/rest-api): expose vms/:id/backup-jobs
2025-09-09 15:10:20 +02:00
Pierre Donias
e84e34efa5 fix(xo-web/pool-item): handle undefined license info in render() (#8946)
See Zammad#44148
Introduced by #6655
2025-09-09 15:06:21 +02:00
Mathieu
878e8ceea7 feat(@xen-orchestra/rest-api): expose users/:id/groups (#8936) 2025-09-09 14:58:07 +02:00
Mathieu
876c28d392 feat(@xen-orchestra/rest-api): expose groups/:id/users (#8932) 2025-09-09 14:19:13 +02:00
Bastien Nollet
6a08b82d86 chore(packages): remove unused xo-server-test (#8945)
remove unused xo-server-test
2025-09-09 10:18:06 +02:00
Mathieu
9dda9be6f0 feat(@xen-orchestra/rest-api): expose delete /vms*/:id (#8938) 2025-09-08 17:22:53 +02:00
Pierre Brunet
98ddd115fd feat(xo-web): change vif device cast to number (#8877) 2025-09-08 17:14:54 +02:00
Mathieu
39cb465941 feat(@xen-orchestra/rest-api): expose (vms/vm-snapshots/vm-templates)/:id.(xva|ova) (#8929) 2025-09-08 16:51:48 +02:00
Mathieu
f28181b07c feat(@xen-orchestra/rest-api): expose tasks/:id/actions/abort (#8908) 2025-09-08 16:42:37 +02:00
Mathieu
31bbf0bdff feat(@xen-orchestra/rest-api): expose (vdis|vdi-snapshots)/:id.(raw|vhd) (#8923) 2025-09-08 12:28:13 +02:00
Mathieu
a509a7c6b7 feat(@xen-orchestra/rest-api): expose delete tasks and tasks/:id (#8905) 2025-09-08 12:19:52 +02:00
Bastien Nollet
02b732b9da fix(xo-web/pool/advanced): only suggest SRs from pool when enabling HA (#8924)
The modal to activate HA used to suggest SRs from all pools, but selecting a SR from another pool would result to an error. This change makes that modal only suggest SRs from the correct pool.
2025-09-08 11:16:39 +02:00
Florent BEAUCHAMP
89e4f051fc feat(xo-web/home): add copiable id on templates (#8949) 2025-09-08 11:01:49 +02:00
Bastien Nollet
d36d64380d feat(lite): 0.14.1 (#8943) 2025-09-04 16:02:07 +02:00
Bastien Nollet
1dc2d2b6fa feat: release 5.110.1 (#8941) 2025-09-04 14:55:50 +02:00
Bastien Nollet
348dfab021 feat: technical release (#8940)
* feat(@xen-orchestra/xapi): 8.4.1

* feat(@xen-orchestra/backups): 0.64.2

* feat(@xen-orchestra/proxy): 0.29.30

* feat(@xen-orchestra/vmware-explorer): 0.10.2

* feat(@xen-orchestra/web): 0.27.1

* feat(xo-server): 5.188.0

* feat(xo-web): 5.185.0

* chore(CHANGELOG): update next
2025-09-04 09:59:47 +02:00
Bastien Nollet
fbc5e3e071 fix(@xen-orchestra/xapi): better fallback messages for backups (#8926)
better fallback messages for backups. 
This will give the user more information on mixed delta/base backups disk per disk
2025-09-04 09:28:11 +02:00
Florent BEAUCHAMP
f7feaaa4f9 feat(xo-server): Make timeout for import xva from url configurable (#8931)
Make timeout for import xva from url configurable

the entry in the config file is

[jsonrpc-api]
xvaImportFromUrlTimeout = '6s'
2025-09-04 09:11:35 +02:00
Florent BEAUCHAMP
a96865198d feat(xo-server/v2v): UI fixes (#8927) 2025-09-03 17:31:59 +02:00
Florent BEAUCHAMP
114df4e18e fix(xo-server/v2v): transfer resume retransfer the full VM (#8928)
current code was looking for a snapshot, but the import should write
on the VM, and its disk
2025-09-03 16:02:45 +02:00
Mathieu
3676ce9764 fix(CHANGELOG): fix changelog URL (#8933) 2025-09-03 10:33:53 +02:00
Thomas Moraine
3512a2f768 docs(xo): document recipes (#8919)
Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-09-03 09:55:56 +02:00
Dan Pollak
d68c8c7ee0 fix(v2v): messages typos (#8914) 2025-09-02 14:02:06 +02:00
Mathieu
0c2c948712 fix(xo-lite/vm/system): correctly display secure boot (#8925) 2025-09-02 13:53:15 +02:00
Joris K
c9d053e70d fix(xo6): display only ISO VDIs for the ISO input list in the VM creation form (#8922) 2025-09-02 13:45:49 +02:00
Mathieu
c3905bc10d feat(@xen-orchestra/rest-api): expose proxies (#8920) 2025-09-01 14:51:38 +02:00
Thierry Goettelmann
ba30ca08d9 fix(web): typo host dashboard ram provisioning legend (#8915) 2025-09-01 10:00:45 +02:00
Bastien Nollet
4dfd4829ad feat(lite): 0.14.0 (#8918) 2025-08-28 16:33:57 +02:00
Bastien Nollet
e0fccacc2f feat(lite): 0.14.0 (#8917) 2025-08-28 16:10:41 +02:00
Bastien Nollet
3937eadbce feat: release 5.110.0 (#8916) 2025-08-28 15:34:56 +02:00
Bastien Nollet
043387a913 feat: technical release (#8913) 2025-08-28 11:41:28 +02:00
Pierre Brunet
88f2e3b7eb fix(backup): set transfer tag only on AbstractRemote (#8907)
* fix(backup): add transfer tag in FullRemote
* fix: move tag where it is really useful
2025-08-28 11:03:34 +02:00
Florent BEAUCHAMP
ea6410e711 fix(backup) error footer1 !== footer2 (#8882)
* fix(vhd-lib): remove unused parent locator
* fix(vhd-lig): improve error messages one wrong end footer
2025-08-28 10:58:27 +02:00
Florent BEAUCHAMP
e1ce9eca7b fix(v2v): improve vddk import (#8911)
* fix(nbd-client): better handling of error during getMap
* fix(xo-server): esxi check errors are objects instead of text
* fix(xo-web): V2v/check improve alignment
* feat(xo-web): add button to install nbdinfo/nbdkit if needed
2025-08-28 10:46:54 +02:00
Thierry Goettelmann
b0cfd9e7f9 feat(web-stack): VtsProgressBar + VtsProgressBarGroup + migration (#8899) 2025-08-28 10:16:39 +02:00
OlivierFL
4f44af6763 fix(xo-6/backup-jobs): correctly display "pending" jobs (#8909) 2025-08-28 09:41:53 +02:00
Bastien Nollet
384bb37dd4 feat: technical release (#8906) 2025-08-27 11:54:12 +02:00
Mathieu
a4410a3c82 fix(@xen-orchestra/rest-api): fix watch tasks (#8900) 2025-08-27 10:18:22 +02:00
Florent BEAUCHAMP
e900f61ed6 fix(vmware-explorer): ignore incomplete vm 2025-08-26 18:36:13 +02:00
Florent BEAUCHAMP
a65f6cd42d feat(xo-server): implement vddk + v2V 2025-08-26 18:36:13 +02:00
Florent BEAUCHAMP
aee55234ea feat(xo-server): expose api to check vddk install 2025-08-26 18:36:13 +02:00
Florent BEAUCHAMP
5ddb78fdf6 task(read-chunk): improve error message and type 2025-08-26 18:36:13 +02:00
Florent BEAUCHAMP
f8cb07596b feat(nbd-client): implement a Disk adapter based on NBD connection 2025-08-26 18:36:13 +02:00
Florent BEAUCHAMP
6c32155327 feat(nbd-client): implement getMap based on nbdinfos 2025-08-26 18:36:13 +02:00
Thierry Goettelmann
c6d8ccf85a feat(web-stack): migration all icons to new icon library (#8736) 2025-08-26 17:51:05 +02:00
Pierre Brunet
659e636657 fix(fs): update timeout for b2 listing (#8903) 2025-08-26 17:28:08 +02:00
Pierre Brunet
d15776e44a fix(backups): prevent Health check error about tags if no transfer during backups (#8879)
add flag to prevent checking for tags if no transfer was executed in incremental backups
2025-08-26 17:06:48 +02:00
Bastien Nollet
e9ba0bd494 feat(xo-server): implement unregisterRestApi (#8898) 2025-08-26 16:41:55 +02:00
OlivierFL
f1e3e6968a feat(xo-6/account-menu): add link to REST API documentation (#8904) 2025-08-26 16:38:27 +02:00
Florent BEAUCHAMP
354284f6ca feat(xo-web): add link to rest api doc (#8902) 2025-08-26 15:16:50 +02:00
Pierre Brunet
f53b78bef1 feat(@xen-orchestra/rest-api): add docs/swagger.json route (#8892) 2025-08-26 14:57:42 +02:00
OlivierFL
769dc19baa feat(xo-6/site): add backup jobs view (#8889) 2025-08-26 14:41:46 +02:00
vates-bot
9d3cffd211 feat(web-stack/i18n): update Xen Orchestra 6 (#8837) 2025-08-26 10:01:50 +02:00
Mathieu
c1c3b56441 feat(@xen-orchestra/rest-api): expose host missing_patches (#8862) 2025-08-25 17:44:23 +02:00
Thierry Goettelmann
e0748796eb feat(web-core): new useProgress and useProgressGroup composables (#8897) 2025-08-25 17:15:13 +02:00
Thierry Goettelmann
4ac481e311 feat(web-core): new useThreshold composable (#8896) 2025-08-25 16:47:33 +02:00
Thierry Goettelmann
05847ca1fc feat(lite): add i18n engage link on settings page (#8884) 2025-08-25 16:31:21 +02:00
OlivierFL
dd7538b82b feat(xo-core): update UiTablePagination component (#8891) 2025-08-25 15:37:45 +02:00
Bastien Nollet
b665bb3e6e fix(xo-server): don't end sequence on skipped backup (#8859) 2025-08-25 15:01:53 +02:00
Mathieu
a324da30bc feat(@xen-orchestra/rest-api): expose pools/:id/missing_patches (#8871) 2025-08-25 14:45:25 +02:00
Mathieu
5911d266f9 feat(@xen-orchestra/xapi): expose IPMI sensors for Dell hardware (#8861) 2025-08-25 14:42:52 +02:00
Thomas Moraine
2090898ce2 docs(xo): explain causes of large incremental backups (#8860)
Added a new section to the Incremental backups documentation to explain why some deltas can be unexpectedly large. Covers common causes and includes tips for investigation and mitigation.

This helps clarify expected behavior and avoids confusion when backup sizes seem too large.

add tips for 2tb+ disks and qcow disks

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>

---------

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-08-25 11:47:07 +02:00
Mathieu
5d66e6de5f feat(@xen-orchestra/rest-api): expose xo tasks (#8843) 2025-08-25 09:17:00 +02:00
Bastien Nollet
4eeae48ade feat: technical release (#8894) 2025-08-21 15:17:07 +02:00
Thomas Moraine
6a2d3e848b docs(xo): minor improvements to the load balancing page (#8893)
Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-08-21 13:58:54 +02:00
Thomas Moraine
e4bf576efa docs(xo): explain the usage reports plugin more explicitly (#8890)
* docs(xo): explain the usage reports plugin more explicitly

Previously, it wasn't clear what the toggle called All did. This commit makes the documentation more clear about how it works.

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>

* Update docs/docs/manage_infrastructure.md

Co-authored-by: Pierre Donias <pierre.donias@gmail.com>

---------

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
Co-authored-by: Pierre Donias <pierre.donias@gmail.com>
2025-08-20 11:27:22 +02:00
Thomas Moraine
76071b0732 docs(xo): restructure and expand load balancing doc (#8886)
Make the load balancing documentation clearer, better structured, with more illustrations, so that users can follow the process of creating or editing a load balancing plan without friction or hassle

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-08-20 10:54:27 +02:00
OlivierFL
6eaeab56a7 feat(xo-core): create UiCollapsibleList component (#8857) 2025-08-19 16:30:13 +02:00
OlivierFL
17640142ee feat(xo-core): update UiLogEntryViewer component (#8880) 2025-08-19 16:27:11 +02:00
Thomas Moraine
ff85cae993 docs(xo): mention automatic daily deployment of documentation (#8885)
The README now specifies that Xen Orchestra documentation updates are deployed automatically once per day. This makes it clearer for users that the online docs are always up to date without requiring manual intervention.

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-08-18 09:49:23 +02:00
Thomas Moraine
70d59eb5f9 docs(xo): document network bonding (#8874)
Network bonding was absent from the Xen Orchestra documentation. Information about this feature was previously only available in a blog article on XCP-ng.

This commit updates the XO doc so that it properly documents this feature, and remains the single source of truth in this topic. XO users won't have to dig through blog posts to find the relevant information, making the documentation more useful and trustworthy.

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-08-13 15:18:26 +02:00
Thierry Goettelmann
e0b9bc2004 feat(web): introducing defineRemoteResource (Web Core) and useXoCollectionState (XO 6) to handle XO API resources (#8855) 2025-08-13 10:28:40 +02:00
Pierre Donias
c1c88c6797 feat(lite/release): check that version matches build version (#8870)
* feat(lite/release): check that version matches build version

1. Let Vite's build get the last commit hash instead of passing an env variable
2. Emit a build file containing the current commit hash and package version
3. Before releasing a new version, compare hash and version with current git commit and version passed by user

* readJson
2025-08-12 12:04:20 +02:00
Mathieu
7ab857f5a7 feat(@xen-orchestra/rest-api): enhance getCurrentUser (#8875)
In the REST API, we generally work on authenticated requests. getCurrentUser can therefore be a bit tedious, as it can return undefined | XoUser. So, whenever we need the current user in an authenticated request, we need to add a check:
if user === undefined throw for typescript to be happy

So now: getCurrentUser returns XoUser (throw if no user) and getCurrentUser({throwUnauthenticated: false}) returns undefined | XoUser
2025-08-12 12:03:15 +02:00
Mathieu
199bf00df7 feat(@xen-orchestra/rest-api): expose vm(*)/:id/vdis (#8876)
Enhancements:

    Fixed @vates/types
    Added limitAndFilterArray in utils.helper to easily handle user filter/limit everywhere
    Enhance getObject type in rest-api
    makeObjectMapper can take a function to define the path (for path based on the object type)
    add getVmVdis in vmService to get VDIs from a VM

Endpoints:

    /vms/:id/vdis
    /vm-snapshots/:id/vdis
    /vm-controllers/:id/vdis
    /vm-templates/:id/vdis
2025-08-12 12:01:49 +02:00
Thierry Goettelmann
909cfd844a feat(web-stack): migrate FormSelect / select to VtsSelect + enhance useFormSelect (#8681) 2025-08-11 17:27:35 +02:00
Thierry Goettelmann
63d5de04fa feat(web): implement default tab handling (#8873) 2025-08-11 16:52:39 +02:00
Thierry Goettelmann
c19eabadc0 feat(lite): migrate the project to file-based navigation + implement default tab handling (#8872) 2025-08-11 16:40:49 +02:00
Thierry Goettelmann
6f9c5fb46e feat(web-core): add useDefaultTab to handle redirection to last visited tab (#8868) 2025-08-11 16:16:12 +02:00
Mathieu
935034517a feat(@xen-orchestra/rest-api): expose hosts/:id/smt (#8863) 2025-08-07 17:07:04 +02:00
Mathieu
4e3c1a82f4 feat(lite): 0.13.1 (#8867) 2025-08-06 17:09:27 +02:00
Mathieu
0c3ae5a560 feat: release 5.109.1 (#8866) 2025-08-06 16:55:27 +02:00
Mathieu
9e484e011f feat: technical release (#8864)
* feat(@xen-orchestra/web-core): 0.26.1

* feat(@xen-orchestra/rest-api): 0.13.1

* feat(@xen-orchestra/web): 0.24.1

* feat(xo-server): 5.184.2

* feat(xo-web): 5.182.0

* chore(CHANGELOG): update next

* fix identation
2025-08-06 15:12:00 +02:00
MlssFrncJrg
b30b897ad9 fix(xo-web): remove image format column on ISO SRs (#8852) 2025-08-06 14:43:27 +02:00
Thomas Moraine
fb69373264 doc(xo): deduplicate content across multiple pages (#8851)
* docs(xo): deduplicate acls content

The ACLs page in the XO documentation wasn't listed in the navigation bar and had content that duplicated the ACLs section of the Users page.

This commit removes the standalone page and updates the valid section with minor improvements (presentation, some missing info from the lone ACLs page) so that it becomes the only source of information on the topic.

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>

* docs(xo): remove obsolete administration page

The Administration page duplicates content in the VMs section of the Infrastructure management page.

Although the Administration page seemingly refers to itself as a 'section', it contains no subsections or extra content, so this might as been a draft for a bigger page, and was never elaborated upon.

In any case, this page isn't accessible from the navigation bar and doesn't seem to add much value to the doc, so I suggest we remove it from the tree view.

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>

* docs(xo): deduplicate backups and disaster recovery content

The 'Backups and Disaster Recovery' page in the XO documentation wasn't listed in the navigation bar and had content that was already present in other pages in the doc.

The last section of that page dealt with scheduled snapshots and completes the existing content on 'rolling snapshots'. That content has been added to the rolling snapshots section, so that everything can be grouped in a single location.

Finally, since the Backups and disaster recovery page is now obsolete, it has been deleted.

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>

* Update docs/docs/users.md

Co-authored-by: Laure S. <laure.souai@vates.tech>

---------

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
Co-authored-by: Laure S. <laure.souai@vates.tech>
2025-08-05 14:46:31 +02:00
Mathieu
f5cadfa3bc fix(xo-rest-api/xo-web/xo-lite): fix cpu provisioning computation (#8858)
* fix(xo-rest-api/xo-web/xo-lite): fix cpu provisioning computation

* changelogs

---------

Co-authored-by: debian <debian@XOA-from-source.lyon.vates.team>
2025-08-05 14:44:26 +02:00
Mathieu
bf44455250 fix(xo-server): fix incorrect state when remove server (#8854) 2025-08-05 11:35:23 +02:00
Mathieu
31a3f23fce feat(lite): 0.13.0 (#8849) 2025-07-31 18:39:06 +02:00
Mathieu
bc0720b9fc feat: release 5.109.0 (#8848) 2025-07-31 18:23:22 +02:00
Mathieu
497754ef4f feat: technical release (#8846) 2025-07-31 14:54:07 +02:00
Florent BEAUCHAMP
85e936f22f fix(vhd-lib): ensure vhd block read are always complete 2025-07-31 14:40:29 +02:00
Florent BEAUCHAMP
5d84f147ce fix(fs): better handling of incomplete read
from ticket 42001
do not retry an incomplete _read (for example read after the end of the file)
2025-07-31 14:40:29 +02:00
Florent BEAUCHAMP
2cec1aa44a fix(fs/test): fix read after the end of the file 2025-07-31 14:40:29 +02:00
Pierre Brunet
822a6f6e77 fix(xo-web/vdi): replace unknown image format by VHD (#8845)
* fix(xo-web/vdi): Replace unknown by vhd

* feat: update changelog packages

* Update CHANGELOG.unreleased.md

---------

Co-authored-by: Mathieu <70369997+MathieuRA@users.noreply.github.com>
2025-07-31 14:33:54 +02:00
Mathieu
4c229cf4a1 feat: technical release (#8844)
* feat(@xen-orchestra/web): 0.24.0

* feat(xo-server): 5.184.0

* feat(xo-web): 5.181.0

* chore(CHANGELOG): update next
2025-07-31 12:34:24 +02:00
Pierre Brunet
665a68b7fe feat(xo-cli/xo-web): add supported_image_format in xo-cli and xo-web (#8834) 2025-07-31 12:20:45 +02:00
Joris K
a7922f23aa feat(xo6): add alarms component on site dashboard (#8838)
* feat(xo6): add alarms component on site dashboard

* update

* add date sorter

* feedback and changelog

* feedback
2025-07-31 10:26:03 +02:00
Mathieu
2f39f37698 feat: technical release (#8842) 2025-07-30 16:25:08 +02:00
MlssFrncJrg
deedc5e7bf feat(@xen-orchestra/rest-api): migrate update user (#8784) 2025-07-30 16:02:50 +02:00
MlssFrncJrg
d45e4cb50b feat(@xen-orchestra/rest-api): expose patch groups (#8790) 2025-07-30 14:47:39 +02:00
MlssFrncJrg
50f5759d2e feat(@xen-orchestra/rest-api): expose delete user from group (#8773) 2025-07-30 14:06:31 +02:00
Joris K
d03c2b62fe fix(xo6): fix issue with infinite loading on site dashboard (#8841) 2025-07-30 12:07:35 +02:00
MlssFrncJrg
4465108333 feat(@xen-orchestra/rest-api): migrate add user to group (#8705) 2025-07-30 11:18:41 +02:00
Mathieu
0ce7b564ea feat(@xen-orchestra/rest-api): expose VM snapshot alarms (#8827) 2025-07-30 09:51:38 +02:00
Joris K
16f07463e1 feat(xo6/pool): Add dashboard view (#8791) 2025-07-30 09:45:08 +02:00
Mathieu
af1a8f2e2c feat(@xen-orchestra/rest-api): expose VM alarms (#8829) 2025-07-30 08:38:46 +02:00
Mathieu
95b5ee95eb fix(@xen-orchestra/rest-api/hosts): count host disabled only if running (#8833) 2025-07-30 08:37:44 +02:00
Thierry Goettelmann
13f406fe70 feat(web-stack): introducing defineRequest + convert site dashboard (#8839) 2025-07-29 17:59:27 +02:00
Pierre Donias
1045016545 feat(xo-web/backups): add strong confirm on single VM backup deletion (#8813) 2025-07-29 10:19:50 +02:00
MlssFrncJrg
51e8cf94f8 feat(@xen-orchestra/rest-api): expose post groups (#8703) 2025-07-29 09:51:27 +02:00
Enée DI IORIO
fb0e1b5f8d feat(xo-6): add connect pool view (#8763) 2025-07-28 17:21:33 +02:00
Mathieu
61e119fd55 feat(@xen-orchestra/rest-api): expose VBD alarms (#8822) 2025-07-28 17:09:37 +02:00
Mathieu
e465d6b9b1 feat(@xen-orchestra/rest-api): expose VIF alarms (#8825) 2025-07-28 17:02:46 +02:00
Mathieu
39509b5a24 feat(@xen-orchestra/rest-api): expose VM controller alarms (#8826) 2025-07-28 16:51:12 +02:00
Mathieu
6d5a1ccdd2 feat: technical release (#8836) 2025-07-28 14:53:35 +02:00
Mathieu
0faf25b050 feat(@xen-orchestra/rest-api): expose pool alarms (#8805) 2025-07-28 14:22:39 +02:00
Mathieu
df4949d5ca feat(@xen-orchestra/rest-api): expose SR alarms (#8810) 2025-07-28 14:21:32 +02:00
Pierre Brunet
ca4e4e272f feat(@xen-orchestra/rest-api): expose backup-repositories (#8831) 2025-07-28 14:21:04 +02:00
Pierre Brunet
36d1e883e2 feat(xo-web): display image_format in VDI tabs (#8835) 2025-07-28 11:23:09 +02:00
vates-bot
8535271fb3 feat(web-stack/i18n): update Xen Orchestra 6 (#8765) 2025-07-28 10:53:23 +02:00
Pierre Brunet
4ca170746d fix(backups): mustDoSnapshot now checks if a vdi has a tag NOBAK (#8820) 2025-07-28 10:24:38 +02:00
Mathieu
6277af813f fix(@xen-orchestra/rest-api): escape unsafe complex matcher input (#8832) 2025-07-25 11:54:00 +02:00
Mathieu
bd83ea3ffc feat(@xen-orchestra/rest-api): expose host logs.tgz (#8830) 2025-07-25 09:41:12 +02:00
Mathieu
afc5518e1d feat(@xen-orchestra/rest-api): expose VM template alarms (#8828) 2025-07-24 15:11:41 +02:00
Mathieu
c702433370 feat(@xen-orchestra/rest-api): expose VDI alarms (#8824) 2025-07-24 14:05:17 +02:00
Joris K
91e4003ca3 feat(web-core): update progress bar component to add possibility to display GB instead of percent depending on the case (#8815)
* feat(web-core): update progress bar component to add possibility to display prefix in case of value

* feedback
2025-07-24 10:29:05 +02:00
Mathieu
359a27bffe fix(xo-server/rest-api): unauthenticated request no longer creates xo task (#8821) 2025-07-23 17:09:36 +02:00
Mathieu
46b0a4b91f feat(@xen-orchestra/rest-api): expose VDI-snapshot alarms (#8823) 2025-07-23 17:09:19 +02:00
Julien Fontanet
aab0f75fb2 feat(xo-server): check build is up-to-date 2025-07-23 11:50:46 +02:00
Julien Fontanet
9373909581 feat(xo-server): show buid commit 2025-07-23 11:50:46 +02:00
Florent BEAUCHAMP
c922b62217 fix(backups): better handling of retrying an upload (#8776) 2025-07-23 11:44:27 +02:00
Joris K
0c914704db feat(web-core): added data ruler component (#8812) 2025-07-23 10:29:32 +02:00
Pierre Donias
e77a474614 fix(xapi): spelling and typos (#8817)
Co-authored-by: Josh Soref <2119212+jsoref@users.noreply.github.com>
See #8593
2025-07-22 17:29:07 +02:00
Pierre Donias
17a65e35e7 fix(openflow): spelling and typos (#8816)
Co-authored-by: Josh Soref <2119212+jsoref@users.noreply.github.com>
See #8593
2025-07-22 17:16:11 +02:00
Mathieu
01f22b8a66 feat(@xen-orchestra/rest-api): expose pif alarms (#8804) 2025-07-22 16:53:38 +02:00
Pierre Donias
adebc5961f fix(generator-toolbox): typo (#8814)
Co-authored-by: Josh Soref <2119212+jsoref@users.noreply.github.com>
See #8593
2025-07-22 16:06:13 +02:00
Thomas Moraine
6b172f7047 doc(xo): update links to new xo doc domain name (#8811)
The Xen Orchestra documentation moved to a new domain name a while ago. This commit updates the last remaining links in the XO doc and app that pointed to the old domain name

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-07-22 11:19:12 +02:00
Mathieu
a9789ba630 fix(@xen-orchestra/rest-api): identify errors case for some computed objects (#8806) 2025-07-22 10:09:54 +02:00
Mathieu
b86af049c1 feat(@xen-orchestra/rest-api): expose network alarms (#8801) 2025-07-22 09:39:46 +02:00
Mathieu
ef5a711bb6 feat(@xen-orchestra/rest-api): expose host alarms (#8800) 2025-07-22 08:52:47 +02:00
Mathieu
be454d8643 feat(@vates/types): enhance createVm type (#8798) 2025-07-22 08:46:58 +02:00
Mathieu
e5702e407c fix(@xen-orchestra/rest-api): include ISO SR in top 5 dashboard (#8803) 2025-07-18 16:21:14 +02:00
Mathieu
73ce910f34 fix(@xen-orchestra/rest-api): alarm time in ms and alarm value in percent (#8802) 2025-07-18 16:20:50 +02:00
Enée DI IORIO
fee7bd5813 feat(web-core): create UI alarm item and UI alarm list components (#8516)
* feat(web-core/alarm-item): creating component

* feat(web-core/alarm-item): add style

* feat(web-core/alarm-item): add description and togle button with vueuse

* feat(web-core/alarm-item): add size variant on alarm-item

* feat(web-core/alarm-item): create story for alarm-item

* feat(web-core/alarm-item): create story for alarm-item

* feat(web-core/alarm-item): compliance with the standard

* feat(web-core/alarm-item): fix responsive on ui alarm item

* feat(web-core/alarm-item): fix spacing

* feat(web-core/alarm-item): add ui-alarm-list on story

* fix(web-core/alarm-item): fix border if item is on a list

* fix: revert unwanted npmignore change

* review

* review

* add changelog

* feedback

* feedback

* feedback

* feedback

* feedback

* feedback & improve translate

* feedback & improve translate

---------

Co-authored-by: Olivier Floch <olivier.floch@vates.fr>
Co-authored-by: Joris-K <joris.kosacki@vates.tech>
2025-07-16 17:16:35 +02:00
Joris K
d4444df15a feat(xo6/lite): Updated sidebar to auto close when the screen is small (#8760) 2025-07-16 16:16:15 +02:00
Joris K
153ff4c641 fix(lite): error in changelog (#8799)
introduced by #8761
2025-07-16 15:11:56 +02:00
Pierre Donias
aa68b7432b fix(@xen-orchestra/mixins): typo (#8789)
See #8593
2025-07-15 11:38:29 +02:00
Joris K
c5ba756618 feat(web-core): updated query search bar to work in responsive (#8761) 2025-07-11 16:59:07 +02:00
Pierre Donias
0e69b3fdba feat(xo-web/acls): always use removeAcls to delete even a single entry (#8774)
See [MM](https://team.vates.fr/vates/pl/r7khs54wiidw8ehbf5kfm9enow)
2025-07-10 15:32:07 +02:00
Joris K
d4263d8408 fix(xo6/lite): fixed display error due to inversion of upload and download (#8793) 2025-07-10 15:19:28 +02:00
Mathieu
a403cd3711 feat(@xen-orchestra/rest-api): expose pool dashboard (#8768) 2025-07-10 14:51:53 +02:00
MlssFrncJrg
e47cf032e6 feat(@xen-orchestra/rest-api): expose delete group (#8704) 2025-07-07 16:51:59 +02:00
MlssFrncJrg
81fa8701c9 feat(xo-server/rest-api): migrate delete user (#8698) 2025-07-07 16:38:02 +02:00
MlssFrncJrg
424f303ade feat(@xen-orchestra/rest-api): expose create user (#8697) 2025-07-07 16:09:31 +02:00
Pierre Donias
8093cb461b fix(xo-web/health): correctly use snapshot functions/messages in snapshot tables (#8775)
See Zammad#41131
Introduced by #3274
2025-07-07 15:00:43 +02:00
Pierre Brunet
c8f9d81b8f fix(xo-lite): bump version 0.12.1 (#8788) 2025-07-03 15:40:40 +02:00
Pierre Brunet
895fd7f2d3 feat(lite): 0.12.1 (#8787) 2025-07-03 15:16:52 +02:00
Pierre Brunet
975c538229 feat: release 5.108.1 (#8786) 2025-07-03 14:50:38 +02:00
Pierre Brunet
2827c2a4ef feat: technical release (#8785)
* feat(xen-api): 4.7.3

* feat(@vates/nbd-client): 3.1.4

* feat(@vates/types): 1.8.0

* feat(@xen-orchestra/xapi): 8.3.2

* feat(@xen-orchestra/web-core): 0.24.0

* feat(@xen-orchestra/proxy): 0.29.25

* feat(@xen-orchestra/rest-api): 0.11.0

* feat(@xen-orchestra/web): 0.21.1

* feat(xo-server): 5.181.0

* chore(CHANGELOG): update next

* chore(CHANGELOG): pass changelogs to next release

* chore(CHANGELOG): remove changelog in wrong release

* chore(CHANGELOG): add packages
2025-07-03 11:56:28 +02:00
Thomas Moraine
797906283a docs(backups.md): explain how to schedule backups (#8783)
Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-07-03 11:46:59 +02:00
Thomas Moraine
0ef9ed97e4 docs(xo): deduplicate incremental backups and full replication content (#8777)
* docs: deduplicate delta_backups page

Previously, the content of the Incremental Backups page (filename: delta_backups.md) was duplicated by the page titled "Incremental Backups (formerly: Continuous Delta backups)", which was not referenced in the sidebar and had the filename incremental_backups.md.

We don't want duplicate content, as it is troublesome to maintain and may cause confusion for the reader.

Also, since Delta backup is outdated terminology and we now talk about Incremental backups, the lone incremental backups.md page has been deleted, and the current "Incremental Backups" page with the filename delta_backups.md has been renamed as the new incremental_backups.md

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>

* docs: deduplicate full_replication page

Previously, the content of the Full Replication page (filename: disaster_recovery.md) was duplicated by the page titled "Full Replication (formerly: Disaster recovery)", which was not referenced in the sidebar and had the filename full_replication.md.

We don't want duplicate content, as it is troublesome to maintain and may cause confusion for the reader.

Also, since Disaster recovery is outdated terminology and we now talk about Full Replication, the lone full_replication.md page has been deleted, and the current "Full Replication" page with the filename disaster_recovery.md has been renamed as the new full_replication.md

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>

---------

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-07-03 11:45:41 +02:00
Florent BEAUCHAMP
3bc90981af fix(xapi): respect the config file setting for preferNbd (#8780)
* fix(nbd-client): handle unreachable VM through nbd

when the user select nbd but don't have any way to reach
the storage/host of the VM (for example no NBD enabled network,
or a NBD enabled network unreachable by xo/proxy it was timing out
and blocking the start of the backup
This error was blocking the fallback to export stream mechanism

* fix(xapi): respect the config file setting for preferNbd

* fix(xapi): don't close export stream if nbd failed to connect

* fix(xapi):respect vhd/qcow2 when faling back to a full if delta exports fails
2025-07-03 10:53:59 +02:00
Mathieu
6123c82d40 fix(api-error): api-error return an error instead of throwing (#8782) 2025-07-03 09:38:32 +02:00
Joris K
193ca26ca3 fix(xo-lite): change timestamp calculation (#8778)
Reported by https://xcp-ng.org/forum/topic/11012/graph-in-v0.12.0-48bf9
introduced by #8529 and #8504
2025-07-02 15:24:21 +02:00
Joris K
e2edac3875 fix(web-core): fix tooltip overflow when too close to the edge (#8779)
Reported by https://xcp-ng.org/forum/topic/11012/graph-in-v0.12.0-48bf9/2
Introduced by #6376
2025-07-02 15:19:24 +02:00
Mathieu
3c54363b09 feat(@xen-orchestra/rest-api): expose host/:id/audit.txt (#8757) 2025-07-01 10:15:57 +02:00
Mathieu
42ddf02831 feat(@xen-orchestra/rest-api): expose pool stats (#8764) 2025-07-01 09:52:44 +02:00
Pierre Brunet
48bf9c95c9 feat(lite): version 0.12.0 (#8771) 2025-06-30 16:56:04 +02:00
Pierre Brunet
850bd41fe7 feat: release 5.108 (#8770) 2025-06-30 16:38:28 +02:00
Pierre Brunet
fcefaaea85 feat: technical release (#8767) 2025-06-30 10:43:41 +02:00
Florent BEAUCHAMP
3c8efb4dc3 fix(backups): non NBD backups stalls (#8766) 2025-06-30 09:57:44 +02:00
Thomas Moraine
ac04f0aa46 doc(configuration): document let's encrypt support in xoa (#8657)
doc(configuration) document let's encrypt support in xoa

Add documentation explaining how to  configure Let's Encrypt in Xen Orchestra Appliance (XOA). This feature was mentioned in the XO 5.73 release blog post but was not included in the technical documentation for Xen Orchestra.
2025-06-30 09:54:36 +02:00
Enée DI IORIO
d96ffde7f5 feat(xo-web/uiCounter): fix radius (#8732)
* feat(xo-web/uiCounter): fix radius

* review
2025-06-30 09:39:03 +02:00
Enée DI IORIO
d89c861ea2 fix(lite,web/Host): tag list color (#8731)
Fixing the color of the tag on all UI tags, On all UiTagsList, we always have info for the UiTag variant.
2025-06-30 09:37:29 +02:00
Enée DI IORIO
2effd8520a feat(web-core/xo-6/xo-lite): add pagination in data tables (#8573) 2025-06-27 17:50:18 +02:00
Enée DI IORIO
b2e61a146d feat(xo-6/host): add name of pGpu in system view (#8740) 2025-06-27 17:43:51 +02:00
vates-bot
9212cd2559 feat(web-stack/i18n): update Xen Orchestra 6 (#8643)
* feat(web-stack/i18n): update Czech

* feat(web-stack/i18n): update German

* feat(web-stack/i18n): update Russian

* feat(web-stack/i18n): update Russian

* feat(web-stack/i18n): update Dutch

* feat(web-stack/i18n): update Russian

* feat(web-stack/i18n): update Czech

* feat(web-stack/i18n): update Czech

* feat(web-stack/i18n): update Spanish

* feat(web-stack/i18n): update Czech

* feat(web-stack/i18n): update Spanish

* feat(web-stack/i18n): update Spanish

* feat(web-stack/i18n): update Spanish

* feat(web-stack/i18n): Update German

* add changelog

---------

Co-authored-by: OlivierFL <olivier.floch@vates.tech>
Co-authored-by: Olini <oliver.elsner@oribu.net>
Co-authored-by: Aleksey Kruglov <apkrugru@gmail.com>
Co-authored-by: Tristis Oris <faust-dourden@ya.ru>
Co-authored-by: Mitchel Nijkamp <IxFail@users.noreply.translate.vates.tech>
Co-authored-by: Ниджат <nnr@ndb24.ru>
Co-authored-by: Pavel Borecki <pavel.borecki@gmail.com>
Co-authored-by: Francisco Nacher <xiscoj@gmail.com>
Co-authored-by: Xavier Esteban <xest@hotmail.com>
Co-authored-by: Joris-K <joris.kosacki@vates.tech>
2025-06-27 17:21:47 +02:00
Mathieu
0778c6c53c fix(@xen-orchestra/web&lite): handle graphs with null value (#8722) 2025-06-27 16:54:36 +02:00
Pierre Brunet
541411586b feat: technical release (#8762) 2025-06-27 14:35:39 +02:00
OlivierFL
8527fd96ee fix(xo-6/vite-config): links in dev pages break prod build (#8759) 2025-06-27 14:03:41 +02:00
Pierre Brunet
1cb9c5e633 feat: technical release (#8758)
* feat(vhd-lib): 4.14.0

* feat(@xen-orchestra/disk-transform): 1.1.0

* feat(@xen-orchestra/qcow2): 1.0.0

* feat(@xen-orchestra/xapi): 8.3.0

* feat(@xen-orchestra/backups): 0.62.0

* feat(@xen-orchestra/backups-cli): 1.1.1

* feat(@xen-orchestra/immutable-backups): 1.0.22

* feat(@xen-orchestra/web-core): 0.22.0

* feat(@xen-orchestra/proxy): 0.29.23

* feat(@xen-orchestra/rest-api): 0.10.0

* feat(@xen-orchestra/web): 0.20.0

* feat(xo-acl-resolver): 0.5.1

* feat(xo-server): 5.180.0

* feat(xo-web): 5.178.0

* chore(CHANGELOG): update next

* feat(@vates/types): 1.6.0

* fix(chore): changelog package order
2025-06-27 10:19:25 +02:00
Florent BEAUCHAMP
d837056eac chore: update READMEs (#8734) 2025-06-26 16:07:03 +02:00
MlssFrncJrg
fe92e206eb feat(xo-server/rest-api): migrate create_vm (#8658) 2025-06-26 15:58:28 +02:00
Julien Fontanet
5950c09016 fix(xo-server,xo-web): ability to clear remote syslog (#8746)
See https://team.vates.fr/vates/pl/rmh9o5mgnfg9ueey8y7b4grsjw
2025-06-26 15:34:48 +02:00
Enée DI IORIO
b952dd1f8f feat(web-core/size): fix type of formatSizeRaw (#8723) 2025-06-26 15:28:56 +02:00
Florent BEAUCHAMP
d499f3ec9e fix(xo-web): clarify when CBT is enabled automatically (#8754) 2025-06-26 15:19:18 +02:00
mathieuRA
8b44f95de5 feat(@xen-orchestra/rest-api): expose vm unpause 2025-06-26 14:28:40 +02:00
mathieuRA
cd013b8f82 feat(@xen-orchestra/rest-api): expose vm resume 2025-06-26 14:28:40 +02:00
mathieuRA
0202b56d33 feat(@xen-orchestra/rest-api): ability to start a vm on a specific host 2025-06-26 14:28:40 +02:00
mathieuRA
80d0624409 feat(@xen-orchestra/rest-api): expose vm suspend 2025-06-26 14:28:40 +02:00
mathieuRA
36889b3841 feat(@xen-orchestra/rest-api): expose vm pause 2025-06-26 14:28:40 +02:00
mathieuRA
fd5db5bf06 chore(@xen-orchestra/rest-api): add getXapi in BaseController 2025-06-26 14:28:40 +02:00
Florent BEAUCHAMP
f0d893d29a feat(xo-web/tasks): show only failed tasks by default in xo-task view (#8676) 2025-06-26 14:20:50 +02:00
Pierre Donias
d6a702b5fa fix(xo-web/Link): fix middle-click behaviour on FF (#8756) 2025-06-26 14:09:26 +02:00
Pierre Donias
bda87c9023 feat(xo-web/remotes): creation/edition Azure/Azurite remotes (#8753)
Implement UI for creation and edition of Azure and Azurite remotes.
2025-06-26 11:19:13 +02:00
Florent BEAUCHAMP
aae93d0103 docs(backups-cli): document the new remote option (#8752) 2025-06-26 10:09:25 +02:00
Enée DI IORIO
8fb3cf3c6c feat(xo-6/site): add page to list servers (#8664) 2025-06-25 16:51:47 +02:00
Thomas Moraine
eca4cb8ba3 docs(backups.md): explain how to send logs to a syslog server (#8747)
Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-06-25 16:39:11 +02:00
Pierre Brunet
d967cc2efb feat(@xen-orchestra/rest-api): expose SM in the REST API (#8696) 2025-06-25 15:20:19 +02:00
Mathieu
4f9efb5e49 feat(@xen-orchestra/rest-api): expose VM import (#8748) 2025-06-25 14:46:32 +02:00
Florent BEAUCHAMP
bb4e14b6dd fix(backups): use the right format (qcow2/vhd) (#8750)
introduced by cbc07b319f
2025-06-25 12:15:56 +02:00
Thomas Moraine
a348ce07d8 docs(tab-advanced-js): fix wrong link to guest uefi secure boot guide (#8749)
Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-06-25 10:21:03 +02:00
Enée DI IORIO
a53297bd5a feat(web-core): create UiQuoteCode component (#8701) 2025-06-25 10:20:45 +02:00
Joris K
e4959045df feat(xo6/lite): update side panel behavior for mobile view (#8688)
* feat(xo6/lite): update side panel behavior for mobile view

* feedback & improvement

* feedback

* feedback

* fix issue with sticky side panel when datatable has a lot of data

* feedback and fix issue

* add changelog

* update icon

* review feedback

* update vts copy button icon
2025-06-24 17:03:47 +02:00
Mathieu
aa707b386a feat(@xen-orchestra/rest-api): dashboard enpoint can return a stream (#8695) 2025-06-24 16:35:11 +02:00
Florent BEAUCHAMP
cbc07b319f feat(xapi): support import and export of qcow2 disks (#8506)
This PR implement a limited support of generating and reading qcow2 . The support is limited since it only handles qcow2 with 64KB cluster size, with this structure :

    header
    refcount table
    refcount blocks
    L1 table
    L1 tables
    data clusters

generated by a9cd5bc639/scripts/qcow2-to-stdout.py
2025-06-24 15:32:20 +02:00
Pierre Brunet
7994fc52c3 feat: technical release (#8745)
* feat(xo-remote-parser): 0.10.0

* feat(@xen-orchestra/fs): 4.6.0

* feat(vhd-lib): 4.13.0

* feat(xen-api): 4.7.2

* feat(@vates/task): 0.6.2

* feat(@vates/types): 1.5.0

* feat(@xen-orchestra/backups): 0.61.2

* feat(@xen-orchestra/backups-cli): 1.1.0

* feat(@xen-orchestra/web-core): 0.21.0

* feat(@xen-orchestra/rest-api): 0.9.0

* feat(@xen-orchestra/web): 0.19.0

* feat(vhd-cli): 0.9.4

* feat(xo-web): 5.177.0

* feat(xo-server): 5.179.0

* feat(xo-server-auth-oidc): 0.3.3

* feat(xo-server-backup-reports): 1.6.0

* feat(xo-server-load-balancer): 0.10.2

* feat(xo-server-transport-nagios): 1.0.3

* chore(changelog): update next

* feat(@xen-orchestra/proxy): 0.29.22

* feat(xo-server-perf-alert): 0.6.3

* fix(chore): update changelog

* fix: fix yarn.lock
2025-06-23 17:27:36 +02:00
Florent BEAUCHAMP
1a7b56a4fe fix(fs): fix 'The last argument to .catch() must be a function, got […object Object]' (#8739)
introduced by afb110c473
2025-06-23 14:19:59 +02:00
Olivier Lambert
040ae74079 docs(restapi): improve the REST API page, explain the versioning and … (#8742)
docs(restapi): improve the REST API page, explain the versioning and the current status

Signed-off-by: Olivier Lambert <olivier.lambert@vates.tech>
2025-06-23 12:02:36 +02:00
Pierre Brunet
695b0c4d90 fix: re-add await for createOutputStream (#8741)
Fix issue in metadata backup which was broken due to forgotten async introduced by #8718
2025-06-23 11:41:45 +02:00
Florent BEAUCHAMP
858681ecc1 feat(backups): enable CBT only when using "purge snapshot data" (#8735) 2025-06-23 10:35:38 +02:00
Thomas Moraine
035f5b7651 docs(restapi): clean up the rest api page (#8683) 2025-06-23 10:00:04 +02:00
Josh Soref
be3677d0bb fix(rest-api): typo
See #8593
2025-06-23 09:52:46 +02:00
Pierre Donias
6b26353be8 fix(vhd-lib,vhd-cli): typos and spelling (#8730)
Co-authored-by: Josh Soref <2119212+jsoref@users.noreply.github.com>
See #8593
2025-06-20 16:30:13 +02:00
Pierre Brunet
0776fc1616 Feat fs safeguards (#8718)
Add safety functions in abstract instead of s3 and azure. A new function "withTimeout" allows to handle timeout and success/failure after timeout.
It should help for better debug and it can be used in several situations.
2025-06-20 14:55:51 +02:00
Josh Soref
1d6ea0a2b9 fix(xo-acl-resolver): typo
See #8593
2025-06-20 10:13:53 +02:00
Thierry Goettelmann
19412728cb feat(web-core): create initial icon packs + icon dev page (#8724) 2025-06-19 16:08:39 +02:00
Thierry Goettelmann
5772bbd005 feat(lite): remove old lite components usage in favor of web-core components (#8685)
* feat(lite): remove old lite components usage in favor of web-core components

* feedback
2025-06-19 15:27:55 +02:00
Pierre Donias
31ef709b30 fix(plugins): typos and spelling (#8728)
Co-authored-by: Josh Soref <2119212+jsoref@users.noreply.github.com>
See #8593
2025-06-19 14:15:41 +02:00
Pierre Donias
8d498151d9 fix(lite,web-core): typos and spelling (#8727)
Co-authored-by: Josh Soref <2119212+jsoref@users.noreply.github.com>
See #8593
2025-06-19 14:12:13 +02:00
Pierre Donias
fb9bd06dfd fix(@vates/task): typos (#8726)
Co-authored-by: Josh Soref <2119212+jsoref@users.noreply.github.com>
See #8593
2025-06-19 11:11:49 +02:00
Pierre Donias
c6ee83bcad fix(workflows): typo (#8725)
See #8593
2025-06-19 11:04:48 +02:00
Joris K
a8723e3619 fix(xo6/site): fix issue with prefix in site dashboard (#8721)
Introduced by #8585
2025-06-19 09:48:22 +02:00
Mathieu
607e2ef67e feat(xo-server): ability to add/remove data source for VMs (#8699)
XO-846

Methods are also added in the JSON-RPC API because our partner do not use the REST API for now.
2025-06-18 10:27:53 +02:00
Florent BEAUCHAMP
4da43ff805 fix(fs): ensure configuration is really passed to remotes (#8707)
remoteOpiions of config file wasn't properly passed to the remotes

especially the timout settings
from ticket 36083
2025-06-18 10:04:28 +02:00
Florent BEAUCHAMP
c8f0a5a583 feat(backups-cli): handle cleanup of remotes (#8712)
zammad#39640
2025-06-17 16:47:35 +02:00
Florent BEAUCHAMP
d863696a17 fix(vhd-lib): handle double close of vhd file (#8706)
zammad#39533
2025-06-17 16:32:51 +02:00
p-bo
daec3dc89f fix(xo-web/intl): use correct ISO code for Swedish (#8719)
Introduced by #7844
See #8711
2025-06-17 15:16:32 +02:00
p-bo
f235925eed feat(xo-web/user): add XO6-only languages to be able to switch to them (#8711)
XO6 is translated into languages, not existing for XO5. And as it is not
possible to select language in XO6 yet (is inherited from XO5 settings), interim
solution is to add these new languages into XO5 user settings, to make them
actually accessible in XO6. It will not affect XO5, because it will simply
fallback into English in case of not existing language.
2025-06-17 14:14:41 +02:00
dinhngtu
0e02282f30 Apply suggestions from code review
Co-authored-by: Thomas Moraine <thomas.moraine@vates.tech>
Signed-off-by: Tu Dinh <ngoc-tu.dinh@vates.tech>
2025-06-17 10:36:27 +02:00
Tu Dinh
09f19ef22d docs(XO): add Windows cloudbase-init template guide
Add a step-by-step guide for creating VM templates with cloudbase-init
support, including master VM creation, template branching, customization,
reseal and VM instantiation.

Include best practices, tips and visual aids for each step.

Signed-off-by: Tu Dinh <ngoc-tu.dinh@vates.tech>
2025-06-17 10:36:27 +02:00
Joris K
6adb304e5d feat(xo-lite/vm): add dashboard view (#8529) 2025-06-17 10:29:35 +02:00
Thierry Goettelmann
b6083b214c feat(web-core): new icon management library (#8607) 2025-06-17 09:07:32 +02:00
OlivierFL
beeef40eda feat(xo-6/treeview): introduce site level in treeview (#8694) 2025-06-17 08:59:41 +02:00
Thomas Moraine
486034d32b docs(xo): upgrade docusaurus from 3.7 to 3.8.1
The new version of Docusaurus introduces performance improvements, see the announcement here: https://docusaurus.io/blog/releases/3.8

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-06-16 17:18:51 +02:00
Mathieu
bd64758e5b fix(xo-server): fix no such object when fetching servers (#8709) 2025-06-16 16:36:26 +02:00
Bastien Nollet
b71101feaf feat(xo-server-backup-reports): avoid making report content depend on reportWhen (#8670)
remove a value that was only used for backup reports, and was no longer used since we use the template system

avoid the backup report content to differ when the backup job has reportWhen = false, which also caused differences between regular backup reports and backup reports generated with the "test plugin" button. To make sure the users can still have the previous behavior, we add parameter in the backup job configuration that allows short failure reports by not displaying all successful VMs in error reports.

rewording "successful VMs" to "successful items" so it also makes sense for metadata backups
2025-06-16 16:34:18 +02:00
mathieuRA
dc2247d739 feat(@xen-orchestra/rest-api): expose delete servers/<id> 2025-06-16 16:00:34 +02:00
mathieuRA
6bd79394bd fix(xo-server): fix unregister server only disconnect 2025-06-16 16:00:34 +02:00
Pierre Donias
bb68d3495a fix(auth-oidc): require advanced prop when sub-props are required (#8662)
Introduced by #6684

If sub-properties are required but the parent property is not, then omitting
the parent property passes the validation, which is not what we want.
2025-06-16 09:45:09 +02:00
Joris K
36e594a3ca feat(xo-6/vm): add dashboard view (#8585) 2025-06-16 09:24:43 +02:00
Mathieu
7be702ef0d feat(@xen-orchestra/rest-api): expose pgpus (#8684) 2025-06-13 14:54:29 +02:00
Pierre Brunet
64eac04446 feat: add image_format to vdi object (#8654) 2025-06-12 17:02:18 +02:00
NadineYasser1
8add75a41d feat(fs): add azure blob storage (#8415)
implement azure backup storage on the backend
2025-06-11 11:58:58 +02:00
Thierry Goettelmann
1bda61e2a0 feat(web-core): simplify logic of VtsCopyButton (#8693) 2025-06-11 11:07:18 +02:00
Joris K
919cf12134 feat(web-core): create composable to translate, formatted and use pluralization with useTimeAgo (#8578) 2025-06-11 10:54:44 +02:00
Joris K
ee2bb3a1c7 feat(xo-6/dashboard): update components BackupIssues and VtsBackupState (#8674) 2025-06-11 10:53:44 +02:00
Mathieu
0c1947aba2 feat(@xen-orchestra/rest-api): expose dashboard endpoint (#8580) 2025-06-10 14:41:05 +02:00
Mathieu
b3145b1034 REST API: expose get pcis and get pci id (#8686) 2025-06-10 14:01:04 +02:00
Thierry Goettelmann
033e241a82 feat(web): improve sidebar (#8691) 2025-06-10 13:34:10 +02:00
OlivierFL
bd62d22c52 feat(web-stack/i18n): migrate $t to t (#8682) 2025-06-10 10:02:29 +02:00
Julien Fontanet
a504efb2ee fix: add missing rimraf dev dependency 2025-06-06 15:03:52 +02:00
Mathieu
9066e43f51 feat(@xen-orchestra/rest-api): ability to use ndjson for collections (#8628) 2025-06-06 15:02:18 +02:00
mathieuRA
5e733c9e69 feat(@xen-orchestra/rest-api): expose pool rolling_update 2025-06-06 14:51:10 +02:00
mathieuRA
35e8d960e2 feat(@xen-orchestra/rest-api): expose pool rolling_reboot 2025-06-06 14:51:10 +02:00
mathieuRA
1667e0f573 feat(@xen-orchestra/rest-api): expose pool emergency_shutdown 2025-06-06 14:51:10 +02:00
mathieuRA
815dad114c feat(@xen-orchestra/rest-api): expose delete network 2025-06-06 14:10:56 +02:00
mathieuRA
94db22f7b0 feat(@xen-orchestra/rest-api): expose create network 2025-06-06 14:10:56 +02:00
mathieuRA
d47fa03ec8 fix(xen-api): getObject* throw nosuchObject 2025-06-06 14:10:56 +02:00
Mathieu
83f52c25cb fix(@xen-orchestra/rest-api): fix typo in actionAsyncrone (#8675) 2025-06-06 11:44:56 +02:00
Thomas Moraine
bb0650d258 docs(vm-templates): document viridian extensions (#8525)
The Viridian setting in Xen Orchestra was mentioned in a release blog (XO 5.79) but not in the XO technical documentation.

This improvement explain what Viridian is and how to enable it for VMs and templates, from within XO.

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-06-06 11:32:23 +02:00
Pierre Donias
f817d4a813 fix(xo-server/plugins): disable strictRequired in JSON compilation (#8669)
See https://ajv.js.org/strict-mode.html#defined-required-properties
2025-06-06 10:04:25 +02:00
Florent BEAUCHAMP
45394609d2 fix(xo-web/VM/Advanced): fix CPU mask computation (#8661) 2025-06-06 10:03:13 +02:00
Mathieu
c7167bcc49 fix: order of packages to fix the ci (#8680)
fix: order packages order for fix the CI
2025-06-05 18:41:56 +02:00
Mathieu
92932dd546 feat(xo-server): inject master in server properties (#8637) 2025-06-05 16:35:27 +02:00
Mathieu
a6ed74a8ec feat: release 5.107.2 (#8679) 2025-06-05 16:31:43 +02:00
Mathieu
529e6bd7d1 feat: technical release (#8677)
* feat(@vates/generator-toolbox): 1.0.3

* feat(@xen-orchestra/backups): 0.61.1

* feat(@xen-orchestra/proxy): 0.29.21

* feat(xo-server): 5.178.2

* feat(xo-web): 5.176.0

* chore(CHANGELOG): update next
2025-06-05 15:13:41 +02:00
Julien Fontanet
ceaf3ee2da fix(CHANGELOG): fix Markdown 2025-06-05 09:52:22 +02:00
OlivierFL
b21f49e804 chore(web-core/docs): update guidelines (#8640) 2025-06-05 09:32:55 +02:00
Enée DI IORIO
392352e324 feat(xo-lite/pool): add system page (#8660) 2025-06-05 08:47:53 +02:00
Thomas Moraine
e64c434d0c docs(plugins): fix links to various plugins
The documentation for mutliple plugins was updated or moved outside the general Plugins page over time.

As a result, the links contained in various plugin's Readme or Usage files got obsolete, as they all point to the general Plugins page, instead of the specific plugin documentations.

This commit updates those links with the relevant location.

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-06-04 16:40:43 +02:00
Florent BEAUCHAMP
4253ad6823 fix(backups): properly clone data on incremental backup (#8668) 2025-06-04 15:29:07 +02:00
Josh Soref
0a378391a9 chore: fix spelling errors and typos in docs and comments (#8619) 2025-06-04 14:37:58 +02:00
Thomas Moraine
699f4e08a2 docs(usage-reports): fix link to the usage report plugin documentation
Previously, the Readme and Usage files related to the server-usage-report plugin contained links pointing to a general page on plugins.

The server-usage-report plugin has since been documented in the Management → Manage infrastructure management page of the Xen Orchestra documentation. As a result, these links have become obsolete.

This commit make the obsolete links point to the actual, new documentation on the server-usage-report plugin.

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-06-04 13:48:02 +02:00
Enée DI IORIO
77cb05d861 feat(xo-6/pool): add system page (#8581)
* feat(xo-web): create system page

* feat(xo-web): creat poolGeneralInfo component

* feat(xo-web): creat poolLicensing component

* feat(xo-web): create poolNetworking component

* feat(xo-web): create poolManagement component

* feat(xo-web): create poolStorageConfiguration component

* feat(xo-web): create poolConnection and poolResourceManagement component

* feat(xo-web): create server.store for adding data on poolConnection

* feat(xo-web) update changelog

* fix(xo-web) add loading, fix server.store

* feat(xo-web) add VtsEnabledState from [#8521](https://github.com/vatesfr/xen-orchestra/pull/8521/files#diff-38e34d645fd18a178735268961d29214f9e9b683e3849d7766bc35ba7da64427)

* fix(xo-web) fix VtsEnabledState

* feat(xo-web): create system page

* feat(xo-web): creat poolGeneralInfo component

* feat(xo-web): creat poolLicensing component

* feat(xo-web): create poolNetworking component

* feat(xo-web): create poolManagement component

* feat(xo-web): create poolStorageConfiguration component

* feat(xo-web): create poolConnection and poolResourceManagement component

* feat(xo-web): create server.store for adding data on poolConnection

* feat(xo-web) update changelog

* fix(xo-web) add loading, fix server.store

* feat(xo-web) add VtsEnabledState from [#8521](https://github.com/vatesfr/xen-orchestra/pull/8521/files#diff-38e34d645fd18a178735268961d29214f9e9b683e3849d7766bc35ba7da64427)

* fix(xo-web) fix VtsEnabledState

* fix(xo-web) use vtsColumn on system page

* review

* fix(xo6/poolSystem): add vts loading hero

* review
2025-06-04 09:14:00 +02:00
Thierry Goettelmann
a54b233ea2 feat(web-core): enhance form select library (#8618) 2025-06-03 17:54:30 +02:00
Pierre Donias
e1ee2d11ac feat(xo-web/OTP): "password" → "OTP code" when enabling OTP (#8666)
See Zammad#39728
2025-06-03 15:53:39 +02:00
Pierre Donias
3603ac1c43 feat(xo-web/VM): add "HIDE_XSA468" tag on VM to hide all XSA-468 warnings (#8665)
See #8638
2025-06-03 15:44:55 +02:00
OlivierFL
3c24064bf3 fix(xo-6/changelog): add missing packages to release (#8667)
Introduced by 5c0ee7e
2025-06-03 15:10:31 +02:00
Pierre Donias
f6c9809c1f fix(perf-alert): add missing type "array" in JSON schema (#8663)
Introduced by #7911
2025-06-03 15:09:42 +02:00
Thierry Goettelmann
77389f91eb feat(web-core): enhance collection library (#8614) 2025-06-03 15:00:38 +02:00
Thierry Goettelmann
a82af251c5 feat(web-core): enhance mapper library (#8609) 2025-06-03 11:54:03 +02:00
OlivierFL
5c0ee7e269 feat(xo-6/xo-lite/host): rename RAM usage components and update CPU provisioning logic in dashboard (#8648) 2025-06-03 11:53:20 +02:00
Mathieu
6ecabc3d9a feat: release 5.107.1 (#8656) 2025-05-28 15:16:24 +02:00
Mathieu
009f791d84 feat: technical release (#8655) 2025-05-28 14:21:52 +02:00
Pierre Donias
2fd5759489 fix(xo-server/xapi-object-to-xo): do not check vulnerabilities on templates and snapshots (#8652)
Introduced by #8638
See https://xcp-ng.org/forum/topic/10888/xsa-468-multiple-windows-pv-driver-vulnerabilities-update-now/19
2025-05-28 10:24:45 +02:00
Mathieu
6ed35551ee feat(lite): 0.11.0 (#8650) 2025-05-27 18:15:29 +02:00
Mathieu
47ec82ded4 feat: release 5.107 (#8649) 2025-05-27 18:03:47 +02:00
Mathieu
f7b3e7da92 feat: technical release (#8647)
* feat(xo-web): 5.175.1

* chore(CHANGELOG): update next
2025-05-27 17:35:21 +02:00
Pierre Donias
e931c51af0 fix(xo-web): prevent subscribeSelfLicenses from returning an object (#8646)
Introduced by #8523
2025-05-27 17:26:10 +02:00
Mathieu
b5eaf53ba9 feat: technical release (#8645) 2025-05-27 16:13:45 +02:00
OlivierFL
00466fde65 fix(xo-6/vm): add required comment in vm index.vue file to prevent build fail (#8644) 2025-05-27 16:07:01 +02:00
Mathieu
a7346871c3 feat: technical release (#8642) 2025-05-27 15:47:25 +02:00
Pierre Donias
19db81f7d8 fix(CHANGELOG): fix XSA-468 links (#8641) 2025-05-27 15:19:52 +02:00
Pierre Donias
d48e537bd2 fix(xo-server,auth-ldap): do not pass undefined ID to registerUser2 (#8639) 2025-05-27 14:31:46 +02:00
Pierre Donias
bfc39542aa feat(xo-server,xo-web): show alert on VMs that are vulnerable to XSA-468 (#8638)
See https://xenbits.xen.org/xsa/advisory-468.html
See https://docs.xcp-ng.org/vms/#xsa-468-multiple-windows-pv-driver-vulnerabilities
See https://xcp-ng.org/blog/xsa-468-windows-pv-driver-vulnerabilities/
2025-05-27 14:25:39 +02:00
Mathieu
b8f9be6553 feat(@xen-orchestra/rest-api): expose vm snapshot action (#8622) 2025-05-27 13:50:51 +02:00
Florent BEAUCHAMP
dfbc578dfa fix(disk-transform): backup omnibus fix (#8635) 2025-05-27 13:50:27 +02:00
Enée DI IORIO
2f84a07066 feat(web-core/UiCardNumbers): fix if unit is undefined (#8636) 2025-05-27 11:37:44 +02:00
Bastien Nollet
55ac7f0035 fix(xo-web): hub ensure template is a template (#8634)
See xoa#234

Prevent importing hub templates that are actually not templates.
Importing an incorrect template previously created a VM without any way to know it.
2025-05-27 11:30:40 +02:00
Pierre Donias
2e1fe1dd34 fix(xo-web/VM/Advanced): handle vm.VTPMs containing null values (#8601)
Fixes Zammad#39180
Introduced by #7085
2025-05-27 10:43:08 +02:00
Nathanaël
bf7518c98b feat(web-stack/i18n): update Xen Orchestra 6 (#8534) 2025-05-27 09:54:49 +02:00
Enée DI IORIO
88a2144339 feat(xo-6/xo-lite): redirect /vm/UUID to /vm/UUID/console (#8553) 2025-05-26 17:38:17 +02:00
Joris K
e1dab25045 feat(xo-lite): add possibility to edit SR on existing vdis (#8507) 2025-05-26 17:31:35 +02:00
Bastien Nollet
c5a268277f fix(xo-web): avoid unrelevant errors on isPubKeyTooShort (#8605) 2025-05-26 14:50:19 +02:00
Enée DI IORIO
bff0e37fbd feat(web-core): update UI card numbers component (#8626) 2025-05-26 11:00:17 +02:00
Joris K
8d0151fcb5 feat(web-core): update svg with new illustrations, and add new vtsState components (#8591) 2025-05-26 10:59:39 +02:00
mathieuRA
3628066154 feat(@xen-orchestra/rest-api): expose get pifs and get pifs/id 2025-05-26 09:49:55 +02:00
mathieuRA
a55d1c4a00 feat(@vates/types): add XoPif 2025-05-26 09:49:55 +02:00
Mathieu
6e273b3328 feat: technical release (#8632)
* feat(@xen-orchestra/proxy): 0.29.19

* chore(CHANGELOG): update next
2025-05-26 08:52:40 +02:00
Mathieu
ca227536aa feat: technical release (#8631) 2025-05-23 15:47:32 +02:00
Florent BEAUCHAMP
a8753530bd fix(vhd-lib): add to changelog (#8630) 2025-05-23 15:37:57 +02:00
Mathieu
b674e0d13f feat: technical release (#8629)
* feat(@xen-orchestra/fs): 4.5.1

* feat(@vates/generator-toolbox): 1.0.2

* feat(@vates/nbd-client): 3.1.3

* feat(@vates/types): 1.3.0

* feat(@xen-orchestra/disk-transform): 1.0.0

* feat(@xen-orchestra/xapi): 8.2.0

* feat(@xen-orchestra/backups): 0.60.0

* feat(@xen-orchestra/backups-cli): 1.0.31

* feat(@xen-orchestra/immutable-backups): 1.0.20

* feat(@xen-orchestra/web-core): 0.20.0

* feat(@xen-orchestra/proxy): 0.29.18

* feat(@xen-orchestra/rest-api): 0.7.0

* feat(@xen-orchestra/web): 0.18.0

* feat(xo-server): 5.177.1

* feat(xo-server-auth-oidc): 0.3.2

* feat(xo-server-netbox): 1.9.0

* feat(xo-server-perf-alert): 0.6.2

* chore(CHANGELOG): update next
2025-05-23 15:06:25 +02:00
Mathieu
0dec1299f1 fix(web/lite): ability to create VM without VDIs (#8617) 2025-05-23 13:57:12 +02:00
Enée DI IORIO
2cff92641e feat(xo6/xo-lite): update vm/system (#8586) 2025-05-23 13:45:17 +02:00
Sebastian CZECH
9d9158266d feat(xo-lite/host): add system page (#8536) 2025-05-23 11:57:59 +02:00
Mathieu
dc1ffedb0a fix(xo-server/xen-server): fix disabling an enabled but disconnected server (#8599) 2025-05-23 11:39:00 +02:00
Bastien Nollet
c9a8083b12 feat: release 5.106.4 (#8627) 2025-05-23 11:37:40 +02:00
Bastien Nollet
2519284521 feat: technical release (#8625) 2025-05-23 10:21:55 +02:00
Pierre Donias
cb70114aa4 fix(xo-web/update): explicitly check trial when disabling email input (#8624)
Introduced by #8595
2025-05-23 10:08:02 +02:00
Sebastian CZECH
9140b0b9bb feat(xo-6/host): add system page (#8521) 2025-05-23 09:43:12 +02:00
Enée DI IORIO
958b5b4f03 fix(xo-6/header): Safari force rendering header on size change (#8574) 2025-05-23 09:42:37 +02:00
Bastien Nollet
160d7f7712 fix(@xen-orchestra/xapi): catch error on mdadm status for offline hosts (#8597) 2025-05-23 09:32:19 +02:00
OlivierFL
ae2361da1f feat(xo-6/host): update dashboard quick info section (#8606) 2025-05-23 09:04:09 +02:00
Mathieu
aeffcd32b9 fix(@xen-orchestra/rest-api): move networks into good folder (#8610) 2025-05-22 17:30:46 +02:00
Mathieu
9af1a729bc fix(xo-server): cpuCap and cpuWeight can no longer be null (#8577) 2025-05-22 16:53:24 +02:00
Mathieu
1404fda662 feat(@xen-orchestra/rest-api): expose vm (clean/hard)_reboot (#8611) 2025-05-22 16:45:04 +02:00
Florent BEAUCHAMP
f2a38591d3 fix(backups): error "a differential VHD must have a parent" (#8616) 2025-05-22 16:44:52 +02:00
Pierre Donias
4601306b23 feat(netbox): support Netbox v4.3.x (#8588)
Fixes #8587
2025-05-22 16:43:53 +02:00
Bastien Nollet
1615e0eb77 feat: release 5.106.3 (#8621) 2025-05-22 16:27:59 +02:00
Bastien Nollet
6d129a4ec4 feat: technical release (#8620) 2025-05-22 14:46:09 +02:00
Mathieu
87b5cacf52 feat(@xen-orchestra/rest-api): expose (clean/hard)_shutdown (#8612) 2025-05-22 12:21:02 +02:00
Pierre Donias
cbfcf9b736 docs(PULL_REQUEST_TEMPLATE): instruction for external contributors (#8600)
Fixes #8594
2025-05-21 15:45:21 +02:00
Thomas Moraine
c29a682d40 docs(advanced, manage_infrastructure): deduplicate alerts content
The Alerts page was not listed in the sidebar and duplicated content from the Alerts section in the Advanced page. This commit removes the standalone Alerts page and redirects all links pointing to it to the Alerts section of the Advanced page. This change also fixes a broken anchor warning in Docusaurus, which could prevent new documentation builds from succeeding.

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-05-21 15:23:34 +02:00
Thomas Moraine
ad27a5d390 docs(manage_infrastructure): explain VIFs and network locking mode (#8584)
* doc(XO): Explain VIFs and Network locking mode

VIFs and the Network locking mode were previously missing in the Xen Orchestra technical documentation, with details scattered across XO blog posts, CLI references in the XCP-ng doc, and other sources.

This commit adds information on VIFs and the network working modes to the XO documentation, making it a more complete and reliable reference for users.

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>

* Update manage_infrastructure.md

---------

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
Co-authored-by: Julien Fontanet <julien.fontanet@vates.tech>
2025-05-21 15:23:03 +02:00
Pierre Donias
bb59801c0f fix(xo-server/VM.setAndRestart): explicitly pass forceShutdownDelay: 0 to VM.stop (#8592)
Fixes Zammad#38602
Introduced by #7247

Avoid immediately falling back to a hard shutdown when calling `VM.stop`,
especially in cases where a clean shutdown was requested explicitly by the user
like in `VM.setAndRestart`.
2025-05-21 15:20:58 +02:00
Pierre Donias
4f65a85989 feat(xo-web/update): disable registration email input when XOA is in trial (#8595) 2025-05-21 14:54:28 +02:00
Thomas Moraine
802a5ceb90 docs(manage-infrastructure): explain rolling pool update scheduling (#8549)
Rolling pool update (RPU) scheduling was introduced in Xen Orchestra 5.102 and mentioned in the corresponding blog post, but it was not included in the XO technical documentation.

This commit explains how to schedule RPUs, so users no longer need to refer to blog posts for instructions.

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-05-21 14:06:02 +02:00
Thomas Moraine
0e43512383 docs(restapi): add Swagger API documentation details (#8540)
As mentioned in the XO 5.104 release blog post, we're gradually documenting the Xen Orchestra REST API using Swagger.

The REST API page in our technical documentation already has a 'Future Improvements' section, which seems like a good place to mention Swagger, even though the documentation process is still ongoing.

This way, users won't need to check the XO blog to learn about this feature.

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-05-21 13:55:24 +02:00
Thomas Moraine
3d2d6c8248 docs(footer): correct wrong GitHub link (#8598)
The GitHub link in the footer was the default one used by the Docusaurus template.

This commit changes the link so that it points to the Xen Orchestra GitHub repository.
2025-05-21 10:02:01 +02:00
Thomas Moraine
a49b27bff7 docs(airgap): fix broken link to xoa check (#8602)
Correct a malformed link to the Support -> XOA Support -> XOA check section in the XO documentation, ensuring Docusaurus builds the doc properly.

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-05-20 16:42:02 +02:00
Thomas Moraine
4432e64b6c docs(troubleshooting): integrate general_troubleshooting (#8560)
The General Troubleshooting page is not listed in the sidebar and contains minimal content, making it suitable to be merged into the existing Troubleshooting page, which is already accessible. Consequently, the standalone General Troubleshooting page is no longer needed and is being removed.

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-05-20 14:28:05 +02:00
Enée DI IORIO
adb490db41 fix(xo-server/signin): logo size on signin screen on Safari (#8572)
Fixes #8301
2025-05-20 14:27:25 +02:00
OlivierFL
e83f90937d fix(xo-core/vts-quick-info-row): handle long values in slot, add tooltip for key, add missing mobile styles (#8596) 2025-05-20 11:09:46 +02:00
Enée DI IORIO
14ce24fa8b feat(xo-lite/vm): create system page (#8547) 2025-05-20 10:40:17 +02:00
Thomas Moraine
21d2379462 docs(manage_infrastructure): document software RAID health check (#8576)
While Software RAID is provided as-is, Xen Orchestra allows users to monitor the health of their software RAID arrays.

This includes a dedicated status interface and alert messages for any issues.

This information was previously documented in the Xen Orchestra 5.102 release blog post, and is now integrated into the XO technical documentation.

This update ensures users have a single reference point for technical information, eliminating the need to search through blog posts.

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-05-20 10:23:48 +02:00
mathieuRA
9a833ba15a feat(@xen-orchestra/rest-api): connect/disconnect a server 2025-05-19 16:46:08 +02:00
mathieuRA
4c8c34caab fix(xo-server/server): harmonize status checks in connect/disconnect 2025-05-19 16:46:08 +02:00
Florent BEAUCHAMP
15538b4f6b fix(@xen-orchestra/xapi): really stop xapi task 2025-05-19 16:37:57 +02:00
Florent BEAUCHAMP
75bdd0c4ab fix(@xen-orchestra/xapi): race condition on xapi task start 2025-05-19 16:37:57 +02:00
Florent BEAUCHAMP
b149e233ab fix(@xen-orchestra/xapi): update progress every percent 2025-05-19 16:37:57 +02:00
OlivierFL
d9087118cb feat(xo-core): add VtsEnabledState component (#8582) 2025-05-19 15:28:27 +02:00
p-bo
e3bda4488f docs(contributing): add Translations section (#8531) 2025-05-19 08:52:48 +02:00
Florent BEAUCHAMP
41e5a33cfe feat(backups): use generator instead of streams for backup and replication (#8432)
use generators instead of stream for backup and replication
2025-05-16 14:24:09 +02:00
Sebastian CZECH
5cadece9b1 fix(xo-6/vm-creation): better vifs handling (#8499) 2025-05-16 11:36:53 +02:00
Enée DI IORIO
a43292642b feat(web-core): create VtsCopyButton component (#8532) 2025-05-16 10:02:19 +02:00
OlivierFL
85b18e1d54 feat(xo-core): add VtsColumns component (#8579) 2025-05-15 10:46:43 +02:00
Thomas Moraine
95e72a8482 docs: fix links to docs and pricing thoughout the code (#8558) 2025-05-14 09:20:53 +02:00
Thomas Moraine
e652c5b341 doc(XO): Explain Differential restores (#8520)
Differential restores were mentioned in the XO blog (release 5.89)
but not in the XO technical documentation.
This commit explains in the technical doc what differential restores are
and how to perform one from the XO interface.

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-05-14 08:55:17 +02:00
Enée DI IORIO
af03cfdb3c feat(xo-6/vm): create system page (#8522) 2025-05-13 13:57:55 +02:00
Enée DI IORIO
85c65a9ea0 feat(xo-6/treeview): collapse treeview when pool/host/vm is clicked (#8556) 2025-05-13 12:58:32 +02:00
Sebastian CZECH
bd1eb1fbb9 feat(web-core): update vtsLoadingHero Component (#8559) 2025-05-13 12:35:47 +02:00
b-Nollet
47bdf40e23 fix(xo-server-perf-alert): don't monitor non-running VMs and hosts 2025-05-13 11:36:14 +02:00
b-Nollet
b341f91bbb fix(xo-server-perf-alert): fixing configuration schema 2025-05-13 11:36:14 +02:00
Bastien Nollet
b9fc6cbbee feat(xo-server-auth-oidc): update dependency (#8555)
* feat(xo-server-auth-oidc): update dependency

* changelog
2025-05-12 17:25:42 +02:00
Pierre Donias
26ee92b2a7 fix(xo-server/Redis): properly delete IDs from Redis when multiple are removed (#8571)
Fixes Zammad#37604
Introduced by 36b94f745d

Since version 4, Redis' Node library doesn't support passing multiple flat
arguments to its methods to perform an action on multiple entries. It expects
an array instead.
2025-05-12 16:54:10 +02:00
Florent BEAUCHAMP
1fc52d73e7 fix(fs/s3): mirror full backup bigger han 50GB from encrypted source (#8570)
we must compute a relevant partSize when uploading a file bigger than 50G
bigger partSize means more memory consumption, but we are limited to
upload 10K chunk of partSize bytes

this commit will ensure there is an estimate of the size from encrpted remote
and pass this estimate to the FullRemoteWriter

from ticket 38031
2025-05-12 16:48:18 +02:00
Mathieu
7d116c1b76 feat(@xen-orchestra/rest-api): ability to add a server (#8564)
* feat(@xen-orchestra/rest-api): ability to add a server

* changelog
2025-05-12 16:36:04 +02:00
Thierry Goettelmann
a61450c2d7 feat(web-core): create VtsSelect, VtsOption and composables (#8438) 2025-05-12 15:18:00 +02:00
Thierry Goettelmann
0d65ae1568 fix(web-core): sidebar z-index (#8568) 2025-05-12 10:48:01 +02:00
Bastien Nollet
255ef06acc feat(lite): 0.10.1 (#8567) 2025-05-07 10:32:29 +02:00
Bastien Nollet
7fa77a3e75 feat: release 5.106.2 (#8566) 2025-05-07 10:01:13 +02:00
Bastien Nollet
ab56924b1d feat: technical release (#8563) 2025-05-06 12:39:57 +02:00
Florent BEAUCHAMP
14fce18f97 fix(xo-web): better handling of free and trial users (#8557)
- don't check licence for users with a running trial
- don't check licence for users with a free of from source plan
2025-05-06 11:25:22 +02:00
Joris K
14411866ac fix(xo-lite): add default value when the value of firmware is undefined (#8562) 2025-05-06 10:46:23 +02:00
Joris K
8fdd68addc feat(xo-lite): add possibility to add some tags (#8515) 2025-05-06 10:45:09 +02:00
Joris K
8d39fb654a feat(xo-lite): add affinity host field in vm creation, added pbd store, type and translation (#8486) 2025-05-05 17:09:07 +02:00
Thierry Goettelmann
b0099a98f8 feat(web-core): enhance useCollection composable (#8526) 2025-05-05 16:16:25 +02:00
Bastien Nollet
80e7273994 feat: release 5.106.1 (#8554) 2025-04-30 17:29:25 +02:00
Bastien Nollet
f9e58a6918 feat: technical release (#8552) 2025-04-30 16:05:08 +02:00
Florent BEAUCHAMP
c0ae2d7d87 fix(xo-web): better handling of strange licences (#8551) 2025-04-30 15:37:00 +02:00
Bastien Nollet
4b5a273e22 feat(lite): 0.10.0 (#8550) 2025-04-30 15:01:16 +02:00
Bastien Nollet
3bb59002c6 feat: release 5.106.0 (#8548) 2025-04-30 14:17:57 +02:00
Bastien Nollet
57ae9e7566 feat: technical release (#8546) 2025-04-30 10:12:56 +02:00
Pierre Donias
aa99af22d4 fix(CHANGELOG): add missing @xen-orchestra/web to packages to release (#8545)
Introduced by #8542
2025-04-30 09:38:40 +02:00
Joris K
1613293f46 feat(xo-lite): add topology field in vm creation (#8491) 2025-04-29 16:50:16 +02:00
Pierre Donias
2ebffdf9e2 fix(lite,web): use VtsInputWrapper to show input labels (#8542)
Introduced by #8436
2025-04-29 15:45:36 +02:00
Mathieu
2ea30b1899 feat(xo-server-web-hooks): handle office 365 connector format (#8498)
See Zammad#36742

Microsoft teams webhook requires a payload in the office 365 connector format.
2025-04-29 12:04:57 +02:00
Florent BEAUCHAMP
9c92f3a561 feat(license): better handling of expiring licenses (#8523) 2025-04-29 11:39:14 +02:00
Mathieu
374bd22f7b fix(xo-server): fix possible race condition at VIF level on VM creation (#8541) 2025-04-29 11:00:36 +02:00
Thomas Moraine
eae00400b8 doc(XO): Remove orphan Plugins page (#8539)
The page https://docs.xen-orchestra.com/plugins is not referenced in the navigation bar
 and duplicates the content in the https://docs.xen-orchestra.com/architecture#plugins page.
As a result, this commit deletes the Plugins page.

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-04-29 10:55:54 +02:00
MlssFrncJrg
18c9259982 feat(@xen-orchestra/rest-api): expose get group and get groups (#8496) 2025-04-29 10:27:59 +02:00
Florent BEAUCHAMP
11050ca6d0 feat(v2v): resume import 2025-04-29 10:17:28 +02:00
Florent BEAUCHAMP
8756d12b8b fix(vmware-explorer): correctly handle stream and buffer
following dependence update 34e8ff6bae
2025-04-29 10:17:28 +02:00
MlssFrncJrg
93394508de feat(@xen-orchestra/rest-api): expose get networks and get network (#8497) 2025-04-29 09:42:19 +02:00
Bastien Nollet
ba8516d2d3 feat: technical release (#8537) 2025-04-28 16:20:12 +02:00
MlssFrncJrg
ae44845c09 feat(@xen-orchestra/rest-api): expose get user and get users (#8494) 2025-04-28 15:11:12 +02:00
Cyrille G.
88ccb60b60 feat(hub/recipes): update kubernetes version list to use Microk8s version (#8530)
feat(hub/recipes): update kubernetes version list to use Microk8s versions
2025-04-28 12:14:22 +02:00
Thomas Moraine
f879728ee9 docs(manage_infrastructure): document usage-report plugin (#8533)
The usage-reports plugin was not covered at all in the Xen Orchestra technical documentation.

This improvement explains how to get usage reports from your resources, by enabling and setting up the plugin.

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-04-28 10:30:48 +02:00
OlivierFL
47b2a45548 chore(xo-core/docs): update guidelines (#8519) 2025-04-25 17:25:41 +02:00
Enée DI IORIO
404f5a3d88 feat(web-stack/host-header): add host master icon in host header (#8512) 2025-04-25 16:12:58 +02:00
OlivierFL
c3a5fefa02 feat(xo-lite/host): add dashboard view (#8504) 2025-04-25 15:35:37 +02:00
Florent BEAUCHAMP
34e8ff6bae fix: update following dependabot (#8509) 2025-04-25 15:05:11 +02:00
Mathieu
f9838c51d9 fix(xo-server): fix videoram not correctly parsed if defined in platform (#8524)
fix videoram not correctly parsed if defined in platform
2025-04-25 08:32:48 +02:00
Bastien Nollet
9ed551f87d feat: technical release (#8528)
* feat(@xen-orchestra/fs): 4.5.0

* feat(@vates/types): 1.2.0

* feat(@xen-orchestra/audit-core): 0.4.0

* feat(@xen-orchestra/backups): 0.59.0

* feat(@xen-orchestra/backups-cli): 1.0.30

* feat(@xen-orchestra/immutable-backups): 1.0.18

* feat(@xen-orchestra/web-core): 0.19.0

* feat(@xen-orchestra/proxy): 0.29.17

* feat(@xen-orchestra/rest-api): 0.4.0

* feat(@xen-orchestra/web): 0.16.0

* feat(xo-server): 5.176.1

* feat(xo-server-audit): 0.14.0

* feat(xo-web): 5.172.0

* chore(CHANGELOG): update next
2025-04-24 15:16:31 +02:00
Nathanaël
b5dd90f731 feat(web-stack/i18n): update Xen Orchestra 6 (#8465) 2025-04-24 10:24:04 +02:00
Bastien Nollet
d7e64028ec feat(xo-server-audit): audit import (#8474) 2025-04-23 11:03:29 +02:00
Pierre Donias
f17dde1021 fix(xo-web): do not show VM creator when user is not admin (#8503)
Fixes #8463
Introduced by #7276
2025-04-23 09:28:27 +02:00
Julien Fontanet
5c386c1987 feat(xo-web/host/networks): PIFs can be filtered by network names
Internal request: https://team.vates.fr/vates/pl/fgh4irbsi3f65xpzpyh4xe16za
2025-04-22 16:58:20 +02:00
Julien Fontanet
6f0f506d31 fix(CHANGELOG.unreleased): fix Markdown 2025-04-22 16:58:20 +02:00
Enée DI IORIO
058e43c692 feat(web-core): update UiInfo component (#8513) 2025-04-22 14:01:57 +02:00
mathieuRA
355d582965 feat(@xen-orchestra/rest-api): expose get messages and get message 2025-04-22 10:27:46 +02:00
mathieuRA
bc4df1872e feat(@xen-orchestra/rest-api): expose get alarms and get alarm 2025-04-22 10:27:46 +02:00
mathieuRA
d2e5f4213e feat(@vates/types): add XoMessage and XoAlarm 2025-04-22 10:27:46 +02:00
Mathieu
41b56a7fa8 fix(xo-server/createVm): fix DEVICE_ALREADY_EXISTS (#8473)
Introduced by 04dd9e9c40
See [mm](https://team.vates.fr/vates/pl/xn49jke9sfb7byt3k94ngjgq8a)
zammad#36543
2025-04-22 09:56:31 +02:00
Thomas Moraine
8a7d7f5748 docs(continuous_replication): rename to incremental_replication (#8514)
Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-04-22 09:27:54 +02:00
Thomas Moraine
48ca9597ff docs(load_balancing): explain how to find the load balancer plugin (#8511)
Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-04-22 08:49:38 +02:00
Thomas Moraine
9d24901300 doc(manage_infrastructure): add link to the V2V section of the XCP-ng doc (#8502)
The XCP-ng doc has been recently updated with more details on how to migrate from VMware to a Vates environment,
with a choice of methods including V2V within Xen Orchestra.

As a result, a mention of V2V is added to the XO doc, with a link to the relevant section in the XCP-ng doc.

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-04-18 11:52:18 +02:00
Florent BEAUCHAMP
72f3c9f755 Update CHANGELOG.unreleased.md
Co-authored-by: Bastien Nollet <150058367+b-Nollet@users.noreply.github.com>
2025-04-16 08:45:06 +02:00
Florent BEAUCHAMP
44658110e1 fix(fs): better handling of rmtree EPERM errors
from ticket 37120
an EPERM error during a rmtree , called by the cleanup at the end
of a metdatadat backup, will trigger a ENOTDIR error
this can be caused by a misconfigured/failing immutable backup
2025-04-16 08:45:06 +02:00
Florent BEAUCHAMP
f461eff69a fix(fs): better handling of remote without VMs
remote without any VM ( either empty remote of config only remote)
are flooding the logs with errors like

Error: ENOENT: no such file or directory, scandir '/run/xo-server/mounts/f0952d37-294a-4d5e-8ba5-565e9932b4a7/xo-vm-backups'
2025-04-16 08:45:06 +02:00
Thierry Goettelmann
c609c58398 feat(web-core): don't force collection properties to be computed (#8510) 2025-04-15 16:24:19 +02:00
Florent BEAUCHAMP
e71c17bde3 chore: update dependencies (#8508)
chore: update dependencies
2025-04-15 13:49:15 +02:00
Thierry Goettelmann
06d62e9c28 feat(web-core): create useCollection composable (#8447) 2025-04-14 17:28:38 +02:00
mathieuRA
8e90ad487c feat(@xen-orchestra/rest-api): expose schedule/run 2025-04-14 13:37:09 +02:00
mathieuRA
17b95a8a8f feat(@xen-orchestra/rest-api): expose get schedules and get schedule 2025-04-14 13:37:09 +02:00
mathieuRA
11d78db88d feat(@vates/types): expose XoSchedule type 2025-04-14 13:37:09 +02:00
MlssFrncJrg
748a2ff860 feat(xo-web/dashboard): display snapshots older than 30 days (#8487)
Fixes #8258
2025-04-14 09:39:01 +02:00
MlssFrncJrg
83a69fd00f feat(@xen-orchestra/rest-api): expose get pools and get pool (#8490) 2025-04-11 13:22:27 +02:00
Thomas Moraine
6b89d30e29 Doc: Explain what 'Prevent migration' does (#8222) 2025-04-10 16:04:22 +02:00
Mathieu
5c88f9ee82 feat(xo-web/vm): rename 'disable migration' to 'prevent migration' (#8500)
introduced by dba08f0f
see https://xcp-ng.org/forum/topic/10206/block-migraton-option-on-the-vm-s-advanced-tab/14
related to #8222
2025-04-10 16:00:36 +02:00
René Paw Christensen
0ed5b7c788 docs(backups): exclude disks (#8493)
I have checked the source code, and it uses a "Contains" and not some kind of "StartsWith" to check whether the disk name should be excluded.

I think it is important to clarify that it is possible to place the "[NOBAK]" label after the disk name, which might help some to maintain their naming convention.
2025-04-09 16:59:38 +02:00
Mathieu
dba08f0fac feat(xo-web/vm): rename 'block migration' to 'disable migration' (#8492)
Introduced by 11a801c
Related to #8222
2025-04-09 10:46:30 +02:00
OlivierFL
18d8a29175 fix(xo-6/vm-creation): remove TS errors from type-check (#8472)
- Updated VM creation code to match the TS typing and remove errors in `type-check`
- Refactored code
- Simplified and improved business logic
- Improved naming
2025-04-08 16:56:16 +02:00
Thierry Goettelmann
838564b570 feat(web-core): update UiInput (#8436) 2025-04-08 16:26:08 +02:00
Mathieu
f04a469797 fix(@xen-orchestra/rest-api): fix unbrand type (#8480) 2025-04-08 11:52:28 +02:00
Mathieu
b32dcc2dcb feat(@xen-orchestra/rest-api): swagger interface qol (#8484) 2025-04-08 11:40:17 +02:00
mathieuRA
8128846ea4 feat(@xen-orchestra/rest-api): expose get vifs and get vif 2025-04-07 12:09:11 +02:00
mathieuRA
0dac0c212a feat(@vates/types): add XoVif type 2025-04-07 12:09:11 +02:00
Pierre Donias
dac9aab269 fix(xo-web/acls): disable ACL feature on plans <Enterprise (#8470)
Introduced by #3774
Introduced by #8412

ACLs feature is only available for XOA plans Enterprise and Premium. The
feature is properly disabled on the main ACL config page but was still
available from a VM's Advanced page and from the VM creation form.
2025-04-07 11:32:52 +02:00
Joris K
cf8065e56e feat(web-core): add alert component (#8459) 2025-04-07 11:29:04 +02:00
Olivier Lambert
e896ce6182 chore(docs): update Docusaurus to 3.7 (#8479)
Signed-off-by: Olivier Lambert <olivier.lambert@vates.fr>
2025-04-05 20:15:49 +02:00
Mathieu
224c840147 feat(lite): 0.9.1 (#8475) 2025-04-02 14:32:26 +02:00
Mathieu
ec78209f65 fix(web-core): fix _s is undefined (#8471)
Introduced by ac2f4e9
2025-04-01 16:48:35 +02:00
Sebastian CZECH
fd67016657 feat(web-core): circle progress bar component (#8402) 2025-04-01 14:01:22 +02:00
Mathieu
a420a95c09 feat(lite): 0.9.0 (#8468)
* feat(lite): 0.9.0
2025-03-31 16:44:41 +02:00
Mathieu
1b23812ddc feat: release 5.105 (#8467) 2025-03-31 16:31:53 +02:00
Mathieu
5c390d76e9 feat: technical release (#8466)
* feat(@vates/types): 1.1.1

* feat(@xen-orchestra/web-core): 0.18.0

* feat(@xen-orchestra/rest-api): 0.3.0

* feat(@xen-orchestra/web): 0.15.0

* feat(xo-server): 5.176.0

* feat(xo-server-backup-reports): 1.5.1

* feat(xo-web): 5.171.0

* chore(CHANGELOG): update next
2025-03-31 15:10:21 +02:00
Sebastian CZECH
82ed2bbf8c feat(xo-6): VM creation (#8324) 2025-03-31 14:49:03 +02:00
Joris K
3f565ff4a8 feat(xo-lite): VM creation (#8317) 2025-03-31 11:12:18 +02:00
Nathanaël
6d99331f26 feat(web-stack/i18n): update Xen Orchestra 6 (#8396) 2025-03-28 17:26:42 +01:00
MlssFrncJrg
b88e5c8e8f feat(@xen-orchestra/rest-api): expose get VM snapshots and get VM snapshot (#8453) 2025-03-28 16:36:31 +01:00
MlssFrncJrg
edc2591ce5 feat(@xen-orchestra/rest-api): expose get VM templates and get VM template (#8450) 2025-03-28 16:06:37 +01:00
MlssFrncJrg
2ff482ccad feat(@xen-orchestra/rest-api): expose get VM controllers and get VM controller (#8454) 2025-03-28 15:02:41 +01:00
OlivierFL
ad8f8fe0a4 fix(xo-6/host): ram usage progress bar not handling values properly (#8461) 2025-03-28 10:10:37 +01:00
MlssFrncJrg
873fe76d26 feat(xo-server): set new XAPI platform flag for nested virtualization (#8395)
set new XAPI platform flag for nested virtualization
2025-03-28 09:15:47 +01:00
Mathieu
782a93cdf8 feat(xo-server/xostor): handle XOSTOR on RPU process (#8455) 2025-03-27 12:25:06 +01:00
Mathieu
890766636a fix(xo-server/rest-api): return 404 if backup log do not exist (#8457) 2025-03-27 12:19:22 +01:00
OlivierFL
d77b195213 feat(xo-6/host): add dashboard view (#8398) 2025-03-27 09:52:51 +01:00
Mathieu
60b0b35eaa feat: technical release (#8458) 2025-03-26 15:50:59 +01:00
Joris K
6f578c0302 feat(xo-6/vm): add VIFs information in side panel (#8443) 2025-03-25 16:53:55 +01:00
Florent BEAUCHAMP
a6265fba0f fix(xo-web): remove spec message (#8452)
introduced by dca3f39
2025-03-25 16:50:32 +01:00
Mathieu
85fbdb1cd5 fix(@xen-orchestra/rest-api): remove unused return type (#8449) 2025-03-25 14:12:41 +01:00
Mathieu
d3c655bd49 feat(@xen-orchestra/rest-api): expose get servers and get server (#8385)
Implement the mecanism to expose non XAPI object endpoints:

    Added a new type, NonXapiXoRecord, which represents all XO objects that are not XAPI objects (e.g., users, servers, groups, etc.).
    Split XapiXoController to create BaseController, allowing code reuse between XapiXoController and the new XoController.
    BaseController exposes sendObjects and createAction (unchanged) and enforces subclasses to define the getObject and getObjects methods.
    XoController requires subclasses to implement getAllCollectionObjects and getCollectionObject, as these are used in its getObjects and getObject methods.
    filter and limit are handled by xo-server for XAPI objects. XoController implements its own filter and limit mechanisms for all non XAPI object in getObjects

And finally expose /rest/v0/servers and /rest/v0/servers/<server-id>🥳
2025-03-25 09:38:28 +01:00
Thierry Goettelmann
05d1552c7f feat(web-core): create usePagination composable (#8267) 2025-03-24 17:58:21 +01:00
Thierry Goettelmann
3a80bdfb36 feat(web-core): update VtsLoadingHero logic (#8437) 2025-03-24 17:35:48 +01:00
mathieuRA
39f4ad494d feat(@xen-orchestra/rest-api): expose get vdi-snapshots and get vdi-snapshot 2025-03-24 16:37:17 +01:00
mathieuRA
3aeab1585b feat(@xen-orchestra/rest-api): expose get vdis and get vdi 2025-03-24 16:37:17 +01:00
mathieuRA
2851bcbc5c feat(@vates/types): add XoVdi(-snapshot|unmanaged) types 2025-03-24 16:37:17 +01:00
Florent BEAUCHAMP
bb554a0ddd fix(@xen-orchestra/xapi): remove automatic disabling of cbt chain on export failure (#8446)
introduced by 2a2c966
zammad#35683
2025-03-24 14:34:05 +01:00
Julien Fontanet
f9de5b7e3a feat(README): add translation status and link 2025-03-24 11:59:48 +01:00
Florent BEAUCHAMP
86961aa782 fix(fs): improve compatibility with backblaze (#8393)
Fix `Unsupported header 'x-amz-checksum-mode' received for this API call.`
on backblaze/cloudlfare object storage
from version 3.729, aws sdk send headers that aren't supported yet by backblaze
2025-03-24 11:06:45 +01:00
Joris K
3aa36f907c feat(xo-6/vm): display VIFs in VM network tab (#8442) 2025-03-21 17:43:28 +01:00
Joris K
be44d75f43 feat(xo-lite/vm): display VIFs in VM network tab (#8441) 2025-03-21 16:00:41 +01:00
Sebastian CZECH
a04e58d0a5 feat(xo-6): add sidebar to host networks view (#8287) 2025-03-20 15:48:44 +01:00
OlivierFL
54e00924ed feat(xo-core): add UiProgressBar component (#8410) 2025-03-20 11:05:18 +01:00
Mathieu
f830315a3e fix(@xen-orchestra/rest-api): remove mutualization of query params (#8424)
Mutualiztion of query params require to also mutualize examples.
Introduced by 0951d56
2025-03-19 09:15:18 +01:00
Mathieu
8cc6b33ca1 fix(@vates/types): enhance xen-api and xo types (#8434) 2025-03-19 09:05:50 +01:00
Bastien Nollet
4f969adbe8 feat(xo-server-audit): log warning when audit log chain is broken (#8439) 2025-03-19 09:04:03 +01:00
Thierry Goettelmann
4f46c68aaa feat(web-core): create VtsInputWrapper component (#8435) 2025-03-17 12:03:32 +01:00
Thierry Goettelmann
9b56d93073 feat(web-core): create useRanked composable (#8431) 2025-03-14 17:23:45 +01:00
Thierry Goettelmann
9b93a7d9b3 feat(web-core): create useMapper composable (#8430) 2025-03-14 17:11:45 +01:00
Mathieu
2d062a301e fix(@xen-orchestra/lite): fix JSONRPC request type (#8421) 2025-03-14 15:23:44 +01:00
Thierry Goettelmann
7fd4528eae feat(web-core): recreate UiDropdown component from DS (#8418) 2025-03-13 12:09:39 +01:00
Thierry Goettelmann
ac2f4e9f32 chore(web-stack): update deps (#8428) 2025-03-13 11:54:36 +01:00
Mathieu
1d4b04c777 feat(@xen-orchestra/rest-api): expose get vbd and get vbds (#8404) 2025-03-13 09:41:52 +01:00
Florent BEAUCHAMP
e16f9bfa91 fix(v2v): assert error on import delta from esxi < 7.5 (#8422)
it happens when the source disk is not aligned with the vhd block size ( 2MB)
this PR will read more data into the grain directory / grain tables, but
this data won't be used since we use the virtual size to compute which
grain to read

from ticket 33018
2025-03-12 17:47:11 +01:00
Pierre Donias
9c27b53dfd fix(netbox/name-dedup): perform a case-insensitive name comparison (#8413)
Netbox doesn't allow 2 VM names to be equal within the same cluster even if they
don't have the same case.
2025-03-11 17:03:20 +01:00
Thomas Moraine
763e5f082d docs(backups): Microsoft ReFS is unsupported (#8423)
Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-03-11 16:16:09 +01:00
Pierre Donias
8a0604c274 feat(netbox): support Netbox v4.2 (#8417)
Fixes #8280
Fixes #7645
See Zammad#34699
See https://xcp-ng.org/forum/topic/10236/netbox-version-4-2-1-not-supported
See https://github.com/netbox-community/netbox/releases/tag/v4.2.0
2025-03-11 15:35:53 +01:00
Mathieu
ca84af4eda feat(@xen-orchestra/rest-api): migrate vms/:id/actions/start (#8379) 2025-03-11 12:50:42 +01:00
Mathieu
57056b2298 Add XoSr type + expose /rest/v0/srs and /rest/v0/srs/:id (#8419)
* feat(@vates/types): add XoSr type

* feat(@xen-orchestra/rest-api): expose get srs and get sr
2025-03-11 11:18:38 +01:00
Florent BEAUCHAMP
517a0c7b6b fix(backups): handle case when a new disk is added to a replicated VM (#8400)
* fix(backups): handle case when a new disk is added to a replicated VM

* changelog

* changelog
2025-03-11 10:31:56 +01:00
Mathieu
0951d5606d feat(@xen-orchestra/rest-api): mutualize code for better qol (#8401)
* feat(@xen-orchestra/rest-api): mutualize code for better qol

* fix after rebase

* use queries instead of query(s)
2025-03-11 09:16:37 +01:00
Thomas Moraine
d74828017a doc(XO): Add Amazon S3 to the list of supported remotes (#8407)
doc(XO): Add Amazon S3 to list of supported remotes

Amazon S3 remotes have been supported for a while,
but there was no section mentioning it in the Backups → Remotes doc.
This is now fixed

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-03-11 09:00:31 +01:00
Pierre Donias
1bd7bd6661 feat(xo-web,xo-server/createVm): ability to assign ACLs to VM during creation (#8412)
Fixes #6996
2025-03-10 17:10:46 +01:00
Mathieu
6816d6e759 fix(CHANGELOG.unreleased.md): fix extra space (#8420) 2025-03-10 11:29:34 +01:00
Pierre Donias
8fd8e3dff5 fix(netbox): fetch Netbox version even if version check is disabled (#8416)
See Zammad#34699
2025-03-10 09:52:59 +01:00
Bastien Nollet
37fbb7edb8 docs(perf-alert): functional description (#8414) 2025-03-07 16:04:53 +01:00
Bastien Nollet
9e7e4298ab fix(perf-alert): preventing alerts sent endlessly every minute (#8408)
Introduced by b1ce62f
2025-03-07 15:38:58 +01:00
Mathieu
f310575d0c fix(xo-server/createVm): fix OTHER_OPERATION_IN_PROGRESS (#8399)
Introduced by 04dd9e9
2025-03-07 15:27:57 +01:00
Julien Fontanet
5a501d9ee2 fix(xo-server): clarify session duration validity (#8411)
Related to zammad#35588
2025-03-07 14:04:15 +01:00
mathieuRA
37444afa12 fix(xo-server/rest-api): on VM import SR ID is no longer ignored 2025-03-07 12:10:30 +01:00
mathieuRA
31b049963f fix(@xen-orchestra/xapi/VM): throws a nice error when migrating VM without SR or default SR 2025-03-07 12:10:30 +01:00
mathieuRA
76e23ecdcc feat(@xen-orchestra/rest-api): expose hosts/:id/stats 2025-03-06 16:56:38 +01:00
mathieuRA
93706d70c9 feat(@xen-orchestra/rest-api): expose get hosts and get host 2025-03-06 16:56:38 +01:00
mathieuRA
a5866bbb6a feat(@vates/types): add XoHost type 2025-03-06 16:56:38 +01:00
Mathieu
034d9b5eca feat(@xen-orchestra/rest-api): expose VM stats (#8359) 2025-03-06 15:06:28 +01:00
Mathieu
a415c452ef fix(@xen-orchestra/rest-api): fix null values not displayed as nullable (#8406) 2025-03-06 09:23:51 +01:00
OlivierFL
adc5bea153 feat: release 5.104.1 (#8405) 2025-03-04 16:49:47 +01:00
OlivierFL
600d8d9e85 feat: technical release (#8403) 2025-03-04 15:37:15 +01:00
Florent BEAUCHAMP
82f0894fec fix(xapi): add missing changelog entry (#8397) 2025-03-04 13:19:52 +01:00
Florent BEAUCHAMP
90f8f9cff4 feat(vhd-lib): handle broken vhd directory named as aliases (#8292) 2025-03-04 09:55:04 +01:00
Florent BEAUCHAMP
cf0331391b fix(backups): handle undefined remote name in restore description (#8367) 2025-03-04 08:39:11 +01:00
Florent BEAUCHAMP
2a2c966126 fix(backups): disable CBT when CBT is unusable (#8313) 2025-03-03 11:41:39 +01:00
Julien Fontanet
39613ff2fa feat(xo-server/vdi.migrate): returns the new UUID
See https://team.vates.fr/vates/pl/169jwdqkeiys8boftay745iony
2025-02-28 11:18:39 +01:00
Sebastian CZECH
9033577406 feat(xo-6): add sidebar to pool networks view (#8286) 2025-02-28 10:18:46 +01:00
OlivierFL
6125348529 feat(lite): 0.8.0 (#8392) 2025-02-27 14:51:44 +01:00
OlivierFL
b59125cf5a feat: release 5.104.0 (#8391) 2025-02-27 14:26:02 +01:00
OlivierFL
73c9f74a45 feat: technical release (#8389) 2025-02-27 11:48:59 +01:00
OlivierFL
6a21e5525a feat(xo-core): update UiInput and UiTextArea components (#8349) 2025-02-27 11:03:55 +01:00
Sebastian CZECH
e0338c33d7 fix(xo-server): add pifs bond master of (#8368) 2025-02-27 10:49:59 +01:00
Joris K
e905817ea5 fix(xo-lite): add changelog (#8386) 2025-02-27 10:49:13 +01:00
Thomas Moraine
b0ab26b77e docs(backups): Microsoft Data Deduplication and Logical Disk Manager are unsupported (#8382)
Also, replace the screenshot of the file restore feature with an example that uses Linux instead of a Microsoft/NTFS resource

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-02-27 10:32:38 +01:00
Pierre Donias
82daa3550f fix(xo-web/tab-disks): wrong PropTypes on AttachDisk's vbds (#8387) 2025-02-27 10:27:18 +01:00
Pierre Donias
db4d394449 feat(xo-web/vm/disks): allow Self Service users to attach disks to their VMs (#8384)
See Zammad#30630
2025-02-27 10:19:51 +01:00
Joris K
8063f438d9 feat(xo-lite/host): display pif information in side panel / add pif metrics store (#8186) 2025-02-27 09:33:05 +01:00
OlivierFL
b3d66497b9 feat: technical release (#8383) 2025-02-26 16:34:07 +01:00
Mathieu
e567a3b358 feat(xo-server/rest-api): expose vms/hosts stats (#8378)
`GET /rest/v0/vms/f26eb0a5-1d91-4682-ae58-96df405a3af6/stats`
`GET /rest/v0/hosts/f26eb0a5-1d91-4682-ae58-96df405a3af6/stats`
2025-02-26 12:01:03 +01:00
Mathieu
468732cdba fix(xo-server/rest-api): do not show route twice (#8377) 2025-02-26 11:55:55 +01:00
MlssFrncJrg
13bda9812e feat(xo-server/rest-api): ability to update a user (#8343) 2025-02-26 10:03:29 +01:00
OlivierFL
ff8a020fa2 feat(web-stack): update typography (#8320) 2025-02-26 09:30:44 +01:00
OlivierFL
d1c65756be feat(web-stack/i18n): merge translation files into single file (#8380) 2025-02-26 09:00:18 +01:00
Nathanaël
905e3cc943 feat(web-stack/i18n): update translations (#8294) 2025-02-25 17:57:35 +01:00
Joris K
5a21bdfe10 feat(xo-lite/network): add side panel informations and some trad (#8150) 2025-02-25 16:16:30 +01:00
Dan Pollak
a7446ae4af fix(xo-server-audit): ignore additional API calls (#8353) 2025-02-25 15:58:46 +01:00
Julien Fontanet
d46c871b06 fix(xo-server/joinPool): remove useless and bogus obfuscation
Username was obfuscated instead of password.

Obfuscation is now properly done in `xen-api`.
2025-02-25 13:44:14 +01:00
Julien Fontanet
7cc89012d7 fix(xen-api): obfuscate password for pool.join{,_force}
Fixes zammad#35148
2025-02-25 13:44:14 +01:00
Julien Fontanet
bd8a1b25ed fix(xo-cli): timeouts with legacy JSON-RPC API
Fixes zammad#34473
2025-02-25 10:30:01 +01:00
OlivierFL
f18b010588 feat(web-stack): update "info" and "brand" colors usages (#8345) 2025-02-24 16:30:18 +01:00
Mathieu
ac2ff9b38d fix(@vates/types): add missing VM-template in XapiXoRecord (#8376)
Introduced by 0ef95d9
2025-02-24 15:54:19 +01:00
MlssFrncJrg
1a3cd3e2b9 feat(xo-server/rest-api): ability to delete user by its ID (#8283) 2025-02-24 14:46:26 +01:00
OlivierFL
f25c67d5a8 feat: technical release (#8375) 2025-02-24 10:48:54 +01:00
Pierre Donias
821c25f864 fix(generator-toolbox): normalize (#8374) 2025-02-24 10:12:19 +01:00
Mathieu
5910a47780 fix(@xen-orchestra/rest-api): rename example files to not be ignored by npm (#8373)
Introduced by 780e0bb

`.npmignore` ignores all `examples/` folders and all `*.example.*` files
Rename Open API examples as `*.oa-example.mts`
2025-02-24 09:51:05 +01:00
OlivierFL
749f063dc6 fix: bump versions of packages with wrong dependencies (#8371)
Introduced by 4eed730a09

Due to an issue with bump-pkg script, some packages were previously published on
NPM before their dependencies' versions were updated. This commit simply bumps
the versions of those packages to publish the correct list of dependencies.
2025-02-21 17:04:25 +01:00
OlivierFL
4eed730a09 feat: technical release (#8370) 2025-02-21 15:29:00 +01:00
Stephane
42ca53f80c feat(@xen-orchestra/xapi): smart reboot improvements (#8333)
feat(xapi): smart reboot improvements
2025-02-21 11:21:41 +01:00
Julien Fontanet
6b8167a2fc docs(installation): add missing openssl dependency 2025-02-21 10:50:08 +01:00
Mathieu
780e0bbefa feat(@xen-orchestra/rest-api): expose get vms and get vm (#8356)
@vates/types Added an export to the root of the lib because TSOA requires importing the type from the root library to generate the OpenAPI specification
    @vates/types Tuples ([number, number]) throw errors when generating the OpenAPI specification. They have been updated to number[]
    @vates/types Created a XapiXoRecord to be able to differentiate between XO types that come from xapi-object-to-xo and XO types that come from XO collections
    xo-server Added getObjectsByType to avoid iterating over all XAPI objects when we know what type of object we want
    Branded is not a valid type for the OpenAPI spec. I created a Unbrand type, that convert all Branded to string . (Use Unbrand only for OpenAPI specification definition to maintain Branded type safety)
    Added another error middleware to catch TSOA errors and throw XO errors
    Added a README.md to have consistency of order in the use of decorators
2025-02-21 10:31:57 +01:00
Bastien Nollet
b2ba5abacf docs(fuse-vhd): document cli file restoration (#8355)
Document how to restore a file from a VHD with fuse-vhd CLI.
This will allow users to restore by themselves large files that make the restore fail when done from the UI.
2025-02-21 10:26:12 +01:00
Pierre Donias
695b3d76e8 fix(xo-web): empty list of options in selects (#8363)
Introduced by a386680d90
Fixes #8361
See https://github.com/bvaughn/react-virtualized/issues/1871

react-virtualized@9.22.6 seems to be breaking old versions of React
Error in browser console: `TypeError: p.createRef is not a function`
2025-02-20 17:08:52 +01:00
Mathieu
6f5b97f7f3 feat(@xen-orchestra/rest-api): setup simple auth middleware (#8327)
Configure dependency injection + configure authentication middleware for openapi (copy of what actually exists in the current REST API. Will be improved later when implementing ACL/resource set)
2025-02-20 16:07:09 +01:00
OlivierFL
db3f702235 fix(web-stack): rollback vue-tsc version (#8362)
Rollback `vue-tsc` version to `2.1.10`, to fix broken `yarn type-check` and CI.
2025-02-20 13:04:43 +01:00
Bastien Nollet
fb02bf07f6 fix(@vates/task): ensure compatibility between library versions (#8347) 2025-02-19 17:44:34 +01:00
Florent BEAUCHAMP
9723075253 feat(generator): create a toolbox (#8295) 2025-02-18 17:23:51 +01:00
MlssFrncJrg
4b8cdf8043 feat(xo-server/rest-api): ability to create user (#8282) 2025-02-18 16:54:02 +01:00
Florent BEAUCHAMP
397e8b6ed7 fix(xo-server-test): normalize package 2025-02-18 16:45:23 +01:00
Florent BEAUCHAMP
da332715f6 doc(sdn-controller): update readme 2025-02-18 16:45:23 +01:00
Florent BEAUCHAMP
08c47da2b6 fix(rest-api): normalize package 2025-02-18 16:45:23 +01:00
Florent BEAUCHAMP
aa27e3ba46 fix(fatfs): normalize package 2025-02-18 16:45:23 +01:00
Julien Fontanet
a386680d90 chore: update dev deps 2025-02-18 11:05:22 +01:00
Julien Fontanet
6e508b03d8 fix(xo-server-audit): ignore host.getBiosInfo
Introduced by d5217f92f

Related to zammad#34890
2025-02-18 09:19:32 +01:00
Julien Fontanet
2aa7c012f1 fix(xo-server-audit): ignore host.getMdadmHealth
Introduced by c41ae0527

Related to zammad#34890
2025-02-18 09:13:47 +01:00
Julien Fontanet
18fec2a0af fix(CHANGELOG.unreleased): fix Markdown
Introduced by 137837cda
2025-02-18 09:10:56 +01:00
David Johnston
be6b73dcb5 docs: fix links to cloud-init (#8354)
Introduced by a89c31c75

Co-authored-by: David Johnston <david@johnstons.net>
2025-02-18 08:58:37 +01:00
Thomas Moraine
a89c31c75b docs: add page to explain VM templates (#8340)
A forum user suggested changes for better understanding of VM templates.
A new page has been created just for templates,
with Create, Read, Update, Delete (CRUD) sections.

Also, the Cloud-init/Cloudbase-init section of the Advanced page has been moved
to this new page.

This should make it easier for users to get all useful information on templates
in a single document.

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-02-17 10:06:30 +01:00
Julien Fontanet
51b06b1177 docs(xoa): always use HTTPS and wget --no-verbose
`--no-verbose-` is better than `--quite` because it does not hide errors.
2025-02-17 09:36:04 +01:00
Florent BEAUCHAMP
c0d434b612 fix(v2v): Cannot read properties of undefined (reading 'map') with empty datastore (#8311) 2025-02-17 09:35:42 +01:00
Thomas Moraine
b390f36deb doc(XO): Update encryption algorithm transition guidance (#8350)
Update the Xen Orchestra documentation to guide users
on transitioning from AES-256-GCM to ChaCha20-Poly1305 encryption,
solving an issue where users could encounter warnings due to mixed
encryption algorithms in remote storage.
Fix [this]((https://xcp-ng.org/forum/topic/10453/remote-encryption-algorithm)
2025-02-17 09:32:10 +01:00
Mathieu
1983025403 fix(@vates/types): normalize package (#8332) 2025-02-17 09:22:07 +01:00
OlivierFL
9e29c98735 feat(xo-core): update treeview components colors (#8326) 2025-02-17 09:18:00 +01:00
Florent BEAUCHAMP
66e677d7cb feat(V2V/powerOff): handle queued state when stopping the VM (#8328)
zammad#34451
2025-02-14 17:16:50 +01:00
OlivierFL
ecd7d624a0 feat(xo-core): update UiTablePagination component (#8344) 2025-02-14 16:20:24 +01:00
Florent BEAUCHAMP
5219d47fd0 test(vhd-lib): improve ci (#8335) 2025-02-14 15:05:34 +01:00
Mathieu
b7a056dfaf feat(@xen-orchestra/rest-api): add error middlware (#8323) 2025-02-14 14:54:44 +01:00
Mathieu
a5831f8a58 fix(xo-server/rest-api): restore legacy rest-api doc (#8346) 2025-02-14 11:43:41 +01:00
Thomas Moraine
ef636a9821 docs(users): add troubleshooting steps for LDAP group sync issues (#8312)
Some users weren't able to sync all LDAP groups with XO.
Adding what to check to troubleshoot the issue.
Also, refreshing the style and presentation of the LDAP section in the Users page
2025-02-14 09:20:35 +01:00
Nathanaël
987e969103 docs(airgap): replace curl by wget to avoid download errors (#8227)
cURL configuration in old XCP-ng/XenServer hosts is not compatible with https://xoa.io, use wget instead.
2025-02-13 14:40:39 +01:00
MlssFrncJrg
7615a6c5f8 feat(xo-server/rest-api): ability to remove user from a group (#8336) 2025-02-13 12:51:29 +01:00
MlssFrncJrg
a0b1ac9388 feat(xo-server/rest-api): ability to add user in a group (#8334) 2025-02-13 12:36:46 +01:00
MlssFrncJrg
4c6797d278 feat(xo-server/rest-api): ability to update group's name (#8278) 2025-02-13 12:25:02 +01:00
MlssFrncJrg
4b244daebd feat(xo-server/rest-api): ability to delete group (#8277) 2025-02-13 11:45:21 +01:00
MlssFrncJrg
2994b9a327 feat(xo-server/rest-api): ability to create group (#8276) 2025-02-13 11:08:10 +01:00
Mathieu
137837cdab fix(sdn-controller): fix no PIF found when creating private network (#8319)
Fix #8027 zammad#34140
2025-02-12 17:07:40 +01:00
OlivierFL
1fd74a29b9 feat(xo-core): update UiCheckbox and UiRadioButton components (#8342) 2025-02-12 15:26:51 +01:00
Mathieu
877ca82600 feat(@xen-orchestra/rest-api): initial setup for swagger (#8316) 2025-02-12 14:09:22 +01:00
OlivierFL
5dbb529126 feat(xo-core): update UiCounter component (#8337) 2025-02-12 11:55:18 +01:00
OlivierFL
78c3b40762 feat(xo-core): update Button components (#8329) 2025-02-12 11:25:07 +01:00
OlivierFL
47ee8799f3 feat(xo-core): update UiCardTitle and UiCardSubtitle components (#8338) 2025-02-12 11:07:00 +01:00
OlivierFL
8f877962f3 feat(xo-core): update VtsIcon component brand color (#8325) 2025-02-11 17:06:55 +01:00
b-Nollet
832634f284 chore(xo-server): upgrade hashy version (#8304) 2025-02-11 15:50:07 +01:00
Sebastian CZECH
6b6a9a4942 feat(xo-6): dashboard mobile layout (#8268) 2025-02-11 15:11:58 +01:00
OlivierFL
87551ca7b8 feat(xo-core): update UiLink component (#8331) 2025-02-11 13:57:10 +01:00
Julien Fontanet
decf1ebf3e feat(normalize-packages): Node defaults to >=18
See https://github.com/vatesfr/xen-orchestra/pull/8332/files#r1950603611
2025-02-11 11:37:27 +01:00
OlivierFL
aeb22636c7 feat(xo-core): update scrollbars color (#8330) 2025-02-11 09:39:31 +01:00
Thomas Moraine
82473fdf37 docs(sdn_controller): remove XCP-ng 8.0 and prior (obsolete) (#8322)
XCP-ng 8.0 and 7.6 are references in multiple sections.

These versions are obsolete, nobody should be using SDN Controller on anything older than XCP-ng 8.2.

As a result, references to XCP-ng 8.0 and older can be removed safely.

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-02-10 17:19:25 +01:00
Truong
f692c25638 VM Description in backup report (#8253)
Sometime, the name does not provide enough information about the VM, adding more with Description, we will know more which VM has issue with backup.

Co-authored-by: b-Nollet <150058367+b-Nollet@users.noreply.github.com>
2025-02-10 17:05:06 +01:00
OlivierFL
6b30fb50c4 feat(xo-core): update color "info" values (#8314) 2025-02-10 15:10:38 +01:00
Mathieu
0ef95d9911 feat(@vates/types): create @vates/types lib (#8308) 2025-02-10 10:16:39 +01:00
Thomas Moraine
37aa941796 docs(sdn-controller): various improvements (#8318) 2025-02-09 00:33:40 +01:00
Jonas
d907129e82 docs(users): using Google for SAML auth (#8296) 2025-02-07 12:46:57 +01:00
Thomas Moraine
57fe8aec51 docs(users): authentication with auth-oidc plugin (#8230)
Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-02-07 12:44:24 +01:00
Sebastian CZECH
90188726e3 feat(lite/release): add changelog to GitHub release description (#8265) 2025-02-07 11:18:09 +01:00
Sebastian CZECH
564a2af879 feat(web-core): migrate UiResource(s) to VtsResource(s) (#8315) 2025-02-06 11:08:37 +01:00
b-Nollet
13488b41b1 feat(lite): 0.7.1 (#8310) 2025-02-04 16:37:53 +01:00
b-Nollet
3e335a3741 feat: release 5.103.1 (#8309) 2025-02-04 16:09:19 +01:00
b-Nollet
ac015305d7 feat: technical release (#8307)
* feat(@xen-orchestra/web-core): 0.13.0

* feat(@xen-orchestra/web): 0.9.0

* feat(xo-server): 5.170.0

* chore(CHANGELOG): update next
2025-02-04 14:48:46 +01:00
Mathieu
936bdaac45 fix(web-core): fix UiStackedBar percent calculation (#8306)
Introduced by 14da422
2025-02-04 13:30:46 +01:00
OlivierFL
0960f8d8d3 fix(lite/host): improve console retrieval (#8305) 2025-02-04 10:17:18 +01:00
Mathieu
6ae05398d7 feat(XO6/dashboard): display size used by replications (#8300) 2025-02-04 10:15:11 +01:00
Stephane
e1b1fcd948 fix(xo-server): fix calculate size replication in sr (#8302)
Introduced by 90a33ea
2025-02-03 17:35:57 +01:00
Florent BEAUCHAMP
7579b3359c docs(async-each): improve the js doc (#8293) 2025-02-03 13:00:25 +01:00
Thomas Moraine
dfbdcd23f2 docs: update XO logo & require Debian 12 (#8263)
Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-02-03 12:48:49 +01:00
Thomas Moraine
683f5f61d3 docs: remove references to XOSAN (legacy) (#8299)
Since XOSAN is now legacy and XOSTOR has taken its place, we are removing XOSAN from the Xen Orchestra doc.

Links to XOSAN docs are replaced with links to XOSTOR (from the XCP-ng doc).

Signed-off-by: Thomas Moraine <thomas.moraine@vates.tech>
2025-02-03 09:28:53 +01:00
b-Nollet
c8c9f77d45 feat(xo-server): remember server's pool name and description (#8206)
Remember server's pool name and description, and display the pool name as server default label. The server label can be deleted (since 81e7e07) to get back to the default pool name value.

We did multiple commits to keep the original changes around, but I would advise not to review by commit.

XO-437
2025-02-03 08:41:38 +01:00
Mathieu
7aa51f20c9 fix(xo-server/VM): do not try to resize vdi if vdi.size is undefined (#8291) 2025-02-03 08:35:13 +01:00
b-Nollet
494ea4509f feat(lite): 0.7.0 (#8290) 2025-01-30 16:39:46 +01:00
b-Nollet
4296ca7e9b feat: release 5.103.0 (#8289) 2025-01-30 13:58:52 +01:00
b-Nollet
437e438672 feat: technical release (#8288) 2025-01-30 11:54:42 +01:00
Julien Fontanet
81e7e07312 fix(xo-server,xo-web): allow deleting server's label 2025-01-30 10:27:37 +01:00
Mathieu
05dd9238b8 fix(xo-server/test): use mock.timers for getFromAsyncCache test (#8279)
introduced by 1eeff13

use mock.timers to avoid false negative.
https://nodejs.org/dist/v23.6.1/docs/api/test.html#timers
2025-01-30 08:21:56 +01:00
b-Nollet
aae8b6b1d8 fix(@xen-orchestra/backups): avoid undefined target (#8275) 2025-01-29 17:43:26 +01:00
Sebastian CZECH
097aa5a584 feat(xo-6): add host network view (#8198) 2025-01-29 16:29:41 +01:00
Nathanaël
062dd7561f feat(web-stack/i18n): translations update from Weblate (#8178) 2025-01-29 14:41:03 +01:00
Joris K
2fe2ef49db fix(xo-lite,xo-6): issue with status in pool network table (#8284)
Fix issue with how status is calculated in pool table
2025-01-29 12:23:35 +01:00
Joris K
7862952cf6 fix(xo-lite): issue with wording in host pif table (#8285) 2025-01-29 12:18:02 +01:00
Sebastian CZECH
76c3f7472f feat(xo-6): add pool network view (#8182) 2025-01-29 09:54:06 +01:00
Thomas Moraine
35e8af6313 docs(advanced): disk health monitoring (#8264)
Disk health monitoring from XO was available since XO v5.87.
It's now documented as part of the Management -> Advanced features section.
2025-01-29 09:53:01 +01:00
Joris K
3e69d4c84b feat(xo-lite/host): add host network tab and pif table / status component … (#8180) 2025-01-28 16:22:58 +01:00
Stephane
7e3b7367f1 fix(backups): backup worker inspect failed: address already in use (#8197) 2025-01-28 15:50:45 +01:00
Pierre Donias
42b32eb079 feat: technical release (#8274) 2025-01-28 11:43:52 +01:00
Florent BEAUCHAMP
bf874bce7c fix(xo-server/getAllUnhealthyVdiChainsLength): better handling of vdi not in cache (#8273) 2025-01-28 10:32:22 +01:00
Florent BEAUCHAMP
989b3888ee feat(backups): don't use checksum if not needed (#8270)
* feat(backups): don't use checksum if not needed

encrypted backups are already authenticated, this guarantee that
a readble file has not been modified
thus, no need to compute a relatively slow hash is encryption is already done
2025-01-28 10:30:15 +01:00
MlssFrncJrg
b519e25601 fix(xo-web): in storage creation, display error when selecting SR type (#8250) 2025-01-28 10:02:03 +01:00
Florent BEAUCHAMP
2677b8ca38 fix(backups): weekly ltr retention last week of year (#8269)
the year computation use the locale year computation, whereas the week 
was using the iso week computation
2025-01-28 08:19:16 +01:00
Florent BEAUCHAMP
5024bd765b test: fix ci (#8271)
* test(xo-server/asynccache): more time to let the test run
* test(vhd-lib/openvhd): concurrency on openvhd tests
2025-01-27 16:27:52 +01:00
Joris K
6761274a16 feat(xo-lite/network): implementation of network tab and add network/pif store (#8147) 2025-01-27 16:21:46 +01:00
Thomas Moraine
512af62f7f docs(backups): long term retention (GFS) (#8223) 2025-01-27 15:38:05 +01:00
Thomas Moraine
4123ae731f docs(backups): encryption algorithms (#8266)
Explain how backups are encrypted by Xen Orchestra,
what each encryption algorithm does,
and how it works with Amazon S3
2025-01-27 11:52:39 +01:00
Stephane
90a33ead6d feat(xo-server): calculate size replication in sr (#8262) 2025-01-27 11:49:37 +01:00
Florent BEAUCHAMP
a49864abfb fix(V2V/Vsan): better handling of multiple VSAN (#8243) 2025-01-24 11:34:50 +01:00
Sebastian CZECH
1f4ec8d0e1 feat(xo-6): add console fullscreen action (#8238) 2025-01-23 15:00:22 +01:00
Mathieu
3e615f725b fix(xapi): VDI_destroyCloudInitConfig wait 5 minutes before removing the VDI (#8247) 2025-01-23 13:09:43 +01:00
Mathieu
9af58185cf fix(xo-server, xo-web): fix install patches and RPU on XS8 (#8241) 2025-01-22 15:58:18 +01:00
Sebastian CZECH
2b63829e91 feat(web-core): inverse the logic of border props in MenuList.vue (#8246) 2025-01-22 15:34:56 +01:00
Sebastian CZECH
300bb18a64 feat(web-core): focus on console (#8235) 2025-01-22 15:14:09 +01:00
Sebastian CZECH
42f205e473 feat(xo-6): switch to language based on xo5 cookie (#8242) 2025-01-22 14:55:01 +01:00
Thierry Goettelmann
fe5276217f fix(web-core): useRouteQuery composable type issue (#8261) 2025-01-22 09:04:59 +01:00
Julien Fontanet
1765600437 fix(xo-server-audit): ignore host.getIpmiSensors
Introduced by e30f28907
2025-01-21 09:07:09 +01:00
Stephane
f0680df1e1 feat(backups): add encryption chacha20-poly1305, allow file larger than 64GB on encrypted remote (#8237)
This will also incite users to create new remote with the chacha20-poly1305 instead of aes-256-gcm that will continue to work on exusting remote
2025-01-20 20:10:34 +01:00
Sebastian CZECH
6d34cf67fb feat(web-core): move chart lib from xo-lite to web-core (#8248) 2025-01-20 15:15:46 +01:00
Sebastian CZECH
9c97ac903f feat(xo-6): add Ctrl+Alt+Del (#8239)
functionality to console
2025-01-20 14:56:46 +01:00
OlivierFL
a96d5e64de docs(xo-core): update guidelines (#8194) 2025-01-20 11:44:49 +01:00
b-Nollet
4744071098 fix(usage-report): avoid report failure when previous stats are invalid (#8240) 2025-01-20 11:43:02 +01:00
b-Nollet
dc9dbd9018 fix(xo-web): display mirror backup transfer size (#8224) 2025-01-20 11:40:31 +01:00
b-Nollet
6405eeb1b5 fix(xo-server): throw when remote uses encryption without data blocks (#8244) 2025-01-20 11:38:42 +01:00
Stephane
7c666d1156 fix(backups): fix metadata.isVhdDifferencing key computation (#8216)
This PR fix metadata.isVhdDifferencing where an object was used instead of a string to set the filename.
2025-01-20 10:55:56 +01:00
Sebastian CZECH
7ca6829c27 feat(web-core): standardize console component between xo-lite and xo-6 (#8245) 2025-01-20 10:25:30 +01:00
Florent BEAUCHAMP
97cd50af44 test(backups): fix parallel test (#8257) 2025-01-20 10:16:43 +01:00
David Johnston
5bfd462616 feat(web-stack): add Spanish translation (#8220) 2025-01-20 09:03:41 +01:00
Florent BEAUCHAMP
2b964576f2 test(vhd-lib): fix ci (#8255)
Assertion messages can now contain extra info since Node 20.18.1
2025-01-17 11:50:59 +01:00
MlssFrncJrg
d044dda59a fix(xo-web/SelectTag): list SR tags (#8251)
See https://xcp-ng.org/forum/topic/9953
2025-01-16 15:22:42 +01:00
Julien Fontanet
11a4ceddce chore: update dev deps 2025-01-15 14:46:20 +01:00
Thierry Goettelmann
b97268727c feat(web-core,lite,xo6): add useDisabled composable and replace DisabledContext usage (#8133) 2025-01-13 16:30:24 +01:00
Sebastian CZECH
3a21290fde feat(web-core): add loading state on console (#8226) 2025-01-09 14:43:09 +01:00
Julien Fontanet
299a109eb6 fix(CHANGELOG): fix date
Introduced by 4235e9816
2025-01-09 14:28:28 +01:00
Julien Fontanet
4235e98166 fix(CHANGELOG): add missing date
Introduced by 281ccbb8b
2025-01-09 12:03:04 +01:00
Julien Fontanet
281ccbb8ba feat: release 5.102.1 2025-01-09 11:42:32 +01:00
Julien Fontanet
7053fc4a08 feat(xo-server-backup-reports): 1.4.4 2025-01-09 10:31:12 +01:00
b-Nollet
cd2f74cd63 fix(xo-server-backup-reports): fix undefined function in partial (#8229)
In some failure cases, backup reports were not sent because of an error during handlebars compilation.
The `formatDate` function was incorrectly passed from partial to partial causing the `executeFunction` helper to execute `undefined` as a function (the `vmFailure` helper used default `formatDate=./formatDate` instead of `formatDate=../formatDate`, the `..` being necessary because of the `#each` loop)


Introduced by aa9c49ce6a
2025-01-08 17:25:01 +01:00
Thomas Moraine
6d836df6bf docs(xoa): NTP synchronization with systemd-timesyncd (#8217)
On recent versions of Xen Orchestra, we switched to systemd-timesyncd for NTP management.
XOA documentation is updated to reflect this change.
2025-01-08 09:07:50 +01:00
Joris K
93a11cfb28 fix(lite): fix issue due to update dev deps (#8218) 2025-01-06 11:31:57 +01:00
Julien Fontanet
fd9c9b214a chore: update dev deps 2024-12-31 12:17:18 +01:00
Julien Fontanet
34c1cce029 fix(CHANGELOG): add 5.102.0 Highlights
Introduced by 320a61323
2024-12-30 13:56:14 +01:00
Julien Fontanet
320a61323c feat: release 5.102.0 2024-12-30 13:38:05 +01:00
Mathieu
db9c85df7a feat: technical release (#8214) 2024-12-20 17:34:32 +01:00
Mathieu
c4104b2d58 chore(CHANGELOG.unreleased.md): add missing @xen-orchestra/xapi entry (#8213) 2024-12-20 17:24:11 +01:00
Mathieu
79847a9129 feat: technical release (#8212) 2024-12-20 16:18:43 +01:00
Pierre Donias
0ec86e409c chore(CHANGELOG.unreleased.md): add missing XO 6 entry (#8211) 2024-12-20 16:04:54 +01:00
MlssFrncJrg
c41ae05275 feat(xo-server,xo-web): in host advanced tab, display mdadm status (#8190)
Fixes #7634
2024-12-20 15:59:38 +01:00
Paloma
9af2463922 feat(xo6/dashboard): add Pool Status component to dashboard (#7800) 2024-12-20 15:57:26 +01:00
Pierre Donias
22f9b3598d feat(xo-server/signin): temporary design matching XO 6 color palette (#8209) 2024-12-20 15:56:16 +01:00
MlssFrncJrg
97e7b9e5fe feat(xo-server/xo-web): in dashboard view, display more alarms (#8199) 2024-12-20 15:47:34 +01:00
Mathieu
87cfa649d3 fix(xo-server): fix 'HANDLE_INVALID' when creating VM (#8208)
Introduced by 04dd9e9
2024-12-20 15:23:03 +01:00
Sebastian CZECH
a945888e63 feat: technical release (#8207) 2024-12-20 09:34:02 +01:00
b-Nollet
4833c143de docs(backups): describe config (#8169) 2024-12-19 18:09:31 +01:00
MlssFrncJrg
8c8519f02d fix(xo-web): fix 'Pool is undefined' when creating a private network (#8188) 2024-12-19 17:02:29 +01:00
Mathieu
8ddd7b5290 feat(xo-web/VM/advanced): ability to manage XenStore entries (#8174)
See Zammad#26951
2024-12-19 16:13:10 +01:00
Mathieu
2b679c6cc1 feat(xo-server/rest): add pools status in the /dashboard endpoint (#8203) 2024-12-19 15:47:27 +01:00
Thomas Moraine
2f2a0aeed0 docs: cloudbase-init documentation (#8173)
Xen Orchestra now supports Cloudbase-init (for Windows VMs),
on top of the already-supported Cloud-init (for Linux VMs).
The Cloud-init section is therefore expanded to mention Cloudbase-init,
and we explain how to create a template for Windows VMs using Cloudbase-init.
2024-12-19 14:51:38 +01:00
OlivierFL
68168647aa fix(xo-core/UiInfo): issue with typography and add prop to handle text wrap (#8205) 2024-12-19 10:37:58 +01:00
Joris K
fd7d6b7ad7 feat(web-core): add table-pagination component (#8164) 2024-12-19 10:12:09 +01:00
Sebastian CZECH
086a42f38d feat(core): create connection status component (#8204) 2024-12-18 15:09:15 +01:00
Sebastian CZECH
d864cb57e0 feat: technical release (#8202) 2024-12-18 14:53:31 +01:00
OlivierFL
ee76c2c481 feat(xo-core): update UiLabel component to v1 (#8187) 2024-12-18 11:54:31 +01:00
Joris K
28cd54780d fix(xo-lite): fix issue with persistent scrollbar (#8191)
* Introduced by 21f0643

* change padding and add class layout to fix issue with persistent scrollbar

* reduction of the size of the icon (in the center of the nav bar), when reducing the screen, to avoid the double scrollbar
2024-12-18 09:29:20 +01:00
Florent BEAUCHAMP
e5acbe7a32 fix(backups): use callAsync instead of call for CBT enabling/disabling (#8184)
enabling and disabling CBT can take a while, and can timeout
with xapi.call().
2024-12-17 14:01:50 +01:00
Joris K
8bfd864ed8 feat(web-core): update UiInput component (#8117) 2024-12-17 11:25:34 +01:00
Mathieu
3c0a5df8e8 feat(xo-server, xo-web/patches): List missing patches for XenServer >= 8.4 (#8183) 2024-12-17 09:31:36 +01:00
Florent BEAUCHAMP
14da4fb8df VMs with this tag xo:no-health-check or xo:no-health-check=REASON will not be tested by health check (#8189) 2024-12-16 17:03:06 +01:00
Mathieu
5a933ed9ef fix(xo-server): fix 'no object with ...' during VM creation (#8195)
fix(xo-server): fix 'no object with during VM creation
2024-12-16 16:48:46 +01:00
Sebastian CZECH
56a18eba9a feat: technical release (#8196) 2024-12-16 11:02:22 +01:00
Stephane
1aef44bca5 feat(xo-web): merge backups synchronously (#8177) 2024-12-16 09:33:44 +01:00
Mathieu
04dd9e9c40 feat(xo-server/rest): ability to manage VDIs using REST API when creating VM (#8167) 2024-12-13 15:36:16 +01:00
Florent BEAUCHAMP
4a54685829 feat(xo-web): add rolling pool reboot and update to the plannable jobs (#8185) 2024-12-13 15:29:48 +01:00
Julien Fontanet
1bc0f8f245 fix(xapi/VM_destroy): use callAsync when appropriate
Related to zammad#32397
2024-12-11 17:38:29 +01:00
Julien Fontanet
02b067e1c5 fix(xapi/VM_create): fix destroy on failure 2024-12-11 17:38:29 +01:00
Joris K
e263f891ff feat(web-core): added UiDropdownButton component (#8076) 2024-12-11 13:43:20 +01:00
Stephane
7132b119c7 fix(xo-server): vdi_not_in_map error on migration (#8179)
Fix VDI_NOT_IN_MAP error on migration

XP-535
2024-12-11 11:46:32 +01:00
Sebastian CZECH
eb4b2c00ce feat(xo6): add network store (#8142) 2024-12-11 09:31:46 +01:00
Mathieu
5a88a48146 fix(xo-server): pool.installPatches correctly check for hosts permission (#8176)
Fix zammad#32199

pool.installPatches check user permissions on hosts if the pool is not passed.
2024-12-10 16:09:10 +01:00
Sebastian CZECH
c7657a5489 feat(web-core): remove aliasing from DonutChart (#8175) 2024-12-10 10:09:34 +01:00
Thierry Goettelmann
708b9b5bc8 feat(web-core): new menu management system (#8123) 2024-12-09 10:02:54 +01:00
Julien Fontanet
c08f84bf04 feat(xen-api): improve debug logs (#8155)
For `callAsync('VM.start', 'OpaqueRef:9a533a13-64bf-4755-ad6a-9b0f67d686ca', false, false)`, before:

```
xen-api DEBUG root@xcp1.company.net: Async.VM.start(...) [19ms] ==> string
xen-api DEBUG root@xcp1.company.net: task.destroy(...) [72ms] ==> string
```

After:

```
xen-api DEBUG root@xcp1.company.net: Async.VM.start started {
  callId: 'dtzkldk8t3f',
  args: [
    '* session id *',
    'OpaqueRef:9a533a13-64bf-4755-ad6a-9b0f67d686ca',
    false,
    false
  ]
}
xen-api DEBUG root@xcp1.company.net: Async.VM.start succeeded after 41ms {
  callId: 'dtzkldk8t3f',
  result: 'OpaqueRef:93a41f8e-005b-4c5b-a4b3-bf9d279f2827'
}
xen-api DEBUG root@xcp1.company.net: watching task { ref: 'OpaqueRef:93a41f8e-005b-4c5b-a4b3-bf9d279f2827' }
xen-api DEBUG root@xcp1.company.net: task succeeded { ref: 'OpaqueRef:93a41f8e-005b-4c5b-a4b3-bf9d279f2827', result: '' }
xen-api DEBUG root@xcp1.company.net: task.destroy started {
  callId: 'ngmpet66yj',
  args: [
    '* session id *',
    'OpaqueRef:93a41f8e-005b-4c5b-a4b3-bf9d279f2827'
  ]
}
xen-api DEBUG root@xcp1.company.net: task.destroy succeeded after 52ms { callId: 'ngmpet66yj', result: '' }
```
2024-12-06 18:21:36 +01:00
Julien Fontanet
d67a2ade37 fix(lite/deploy): download XVA from http://xoa.io/xva
Fixes https://xcp-ng.org/forum/post/86439

Other deploy methods (shell and vates.tech) uses this endpoint.

It should no longer be necessary to use the HTTP/1.0 special http://xoa.io:8888 endpoint.
2024-12-04 11:53:01 +01:00
Thierry Goettelmann
568e14f7ee feat(xo-stack): introduces job system (#8112)
New Job System that provides handling of asynchronous operations with built-in state management and identity-based concurrency control.

- Type-safe job definitions with typed arguments
- Concurrency control through identity tracking
- Built-in state management (`isRunning`, `canRun`, `errorMessage`)
- Argument validation
2024-12-04 08:41:28 +01:00
Thierry Goettelmann
c87d7a9eaf feat(web-core): new VtsLink component (#8000) 2024-12-04 08:40:01 +01:00
Sebastian CZECH
69347e9a4b feat(web-core): create tags list component (#8165) 2024-12-03 15:45:32 +01:00
Sebastian CZECH
bfb5ecc270 feat(web-core): add state for empty table (#8153) 2024-12-03 15:12:44 +01:00
Sebastian CZECH
6b2efe7039 feat(web-core): add no selection state component (#8170) 2024-12-03 14:34:03 +01:00
Joris K
e87334c0de feat(lite): 0.6.0 (#8172) 2024-11-29 15:15:12 +01:00
Joris K
427394f63f feat: release 5.101.0 (#8171) 2024-11-29 14:39:35 +01:00
Pierre Donias
2fda4130fe fix(web-core/VtsLayoutSidebar): remove bottom padding to match DS (#8168)
Introduced by #7589
2024-11-29 09:53:59 +01:00
Joris K
3b4e772eac feat: technical release (#8166)
* feat(vhd-lib): 4.11.2

* feat(@xen-orchestra/xapi): 7.8.0

* feat(@xen-orchestra/backups): 0.55.0

* feat(@xen-orchestra/backups-cli): 1.0.26

* feat(@xen-orchestra/immutable-backups): 1.0.14

* feat(@xen-orchestra/web-core): 0.7.0

* feat(@xen-orchestra/proxy): 0.29.6

* feat(@xen-orchestra/web): 0.5.0

* feat(xo-server): 5.164.0

* feat(xo-web): 5.163.0

* chore(CHANGELOG): update next
2024-11-28 16:21:17 +01:00
Florent BEAUCHAMP
511e2f70d1 fix(xo-web/sr): fix iso SR creation (#8159) 2024-11-28 15:12:19 +01:00
Mathieu
b41764405e feat(xo-server,xo-web/host): replace 2crsi-plugin.py -> ipmitool.py (#8144)
`2crsi-plugin` will be removed in favor of `ipmitool`. See https://github.com/xcp-ng/xcp-ng-xapi-plugins/pull/48
2024-11-28 14:36:53 +01:00
Stephane
11a801c129 feat(xo-web): ability to block/unblock migration (#8129)
Fixes https://project.vates.tech/vates-global/projects/70ab2907-1ac3-4e7d-831f-a8752c36474d/issues/b8c25c6d-40ba-4cb6-8a6c-33d887692525
2024-11-28 14:35:04 +01:00
Pierre Donias
07f8468317 feat(xo-web/backup): long-term retention settings (#8141) 2024-11-28 12:34:19 +01:00
Stephane
ba679a24c1 feat:(xo-server/host,xo-web): allow bypassing blocked migration in maintenance mode (#8149)
[host.setMaintenanceMode(true)] Allow bypassing blocked migration

in the UI

    detect the error
    display a modal indicating which VM cannot be migrated and asking if it should be bypassed
    if it should, retry the call and pass vmsToForceMigrate

in xo-server

    unblock migration for VMs in vmsToForceMigrate

XO-390
2024-11-28 11:46:12 +01:00
b-Nollet
10eafb493f fix(vhd-lib): return accurate merge size (#8156) 2024-11-28 11:38:46 +01:00
Sebastian CZECH
5219e41a64 feat(web-core): create VtsCardRowKeyValue component (#8148) 2024-11-28 11:31:39 +01:00
Florent BEAUCHAMP
fa97887d7e Feat(backups): support VTPMs content backup/restore (#8139) 2024-11-28 11:25:06 +01:00
OlivierFL
c5570c1e15 feat(xo-6): add 404 page (#8145) 2024-11-28 10:12:05 +01:00
MlssFrncJrg
d5217f92f9 feat(xo-server, xo-web): in host general tab, display 2CRSI BIOS update (#8146) 2024-11-27 14:40:51 +01:00
Mathieu
4082f12ad3 feat(xo-server): ability to manage VIFs using REST API when creating a VM (#8137) 2024-11-27 14:38:07 +01:00
Joris K
01cc733cac feat: technical release (#8163) 2024-11-27 11:01:05 +01:00
Florent BEAUCHAMP
49d5f273f2 fix(backups): update yarn.lock (#8160)
introduced by e80b39e417
2024-11-26 15:57:11 +01:00
Sebastian CZECH
904273f48b feat(xo-lite): display host console (#8136) 2024-11-26 14:48:23 +01:00
Florent BEAUCHAMP
e80b39e417 feat(backups): implement long term retention (#7999)
* feat(backups): implement long terme retention

long term retention sometimes called GFS ( Grand Father / Father / Son)
is a way to promote some backup to be kept on a long time

that way , the user can use the find the best equilibrium between
storage and security

This commit add the code mechanics to identify backup that
can be deleted safely. It is intended to use with a form
that ask the user for the number of day, week, month, and year
for which XO will keep the most recent

It extends the actual system of keeping the n most recent backup

Keep in mind that the backup promoted by week and month can be decaled
2024-11-26 14:39:39 +01:00
Sebastian CZECH
96769322a7 feat(xo-6): add state for panel to stateHero (#8124) 2024-11-26 11:27:47 +01:00
Julien Fontanet
be05b69d41 test(task): compat with Node >= 20.18.1
Introduced by ba3753ab1
2024-11-26 10:57:05 +01:00
Mathieu
a22e4a6340 fix(xo-server): support of cloudbase-init (#8154) 2024-11-26 10:01:29 +01:00
p-bo
aecc5f6aa9 fix(eslint): exclude "cs" locale for XO front projects (#8102)
Fix ESLint errors for missing `cs` locale translation keys.
2024-11-26 09:36:05 +01:00
p-bo
b2ac0d3abc feat(web-core): add Czech to i18n config (#8101) 2024-11-26 09:25:59 +01:00
p-bo
ad9a05b03e feat(web-core): add czech translation (#8100) 2024-11-26 09:24:44 +01:00
p-bo
65d98eb5a9 feat(xo-6): add czech translation (#8099) 2024-11-26 09:23:43 +01:00
p-bo
1bc3d5c1bd feat(xo-lite): add czech translation (#8098) 2024-11-26 09:22:04 +01:00
Mathieu
fa974f920c feat(web-stack): implement actions and clipboard for VM console (#8125) 2024-11-25 17:39:02 +01:00
Joris K
87b7016669 feat: technical release (#8157)
* feat(@xen-orchestra/fs): 4.3.0

* feat(@xen-orchestra/web-core): 0.5.0

* feat(@xen-orchestra/proxy): 0.29.5

* feat(@xen-orchestra/web): 0.3.2

* feat(xo-server): 5.162.0

* feat(xo-server-perf-alert): 0.6.0

* feat(xo-web): 5.162.0

* chore(CHANGELOG): update next
2024-11-25 14:58:35 +01:00
OlivierFL
21f0643c4d feat(xo-6/header): update user menu button (#8143) 2024-11-22 09:13:01 +01:00
Stephane
7445acdafe chore(xo-server-test): add app-conf (#8093)
Use app-conf to get xo-server hostname and port.
2024-11-21 17:38:42 +01:00
b-Nollet
1e98a3ed26 feat(@xen-orchestra/fs): add getSizeOnDisk function (#8138)
Split getSize in two functions and have it return a more accurate value without any ivLength magic and encryption padding
2024-11-21 15:44:05 +01:00
Florent BEAUCHAMP
a5ad395b33 fix(xo-web/New SR): better handling of ipv6 when creating a nfs iso SR (#8134) 2024-11-21 15:17:03 +01:00
Thierry Goettelmann
86c45ef3de docs(web-core): update documentation structure (#8135) 2024-11-20 15:04:53 +01:00
MlssFrncJrg
9939cee832 feat(xo-server): in proxies tab, display current version (#8104)
* feat(xo-server): in proxies tab, display current version
2024-11-18 17:07:20 +01:00
Sebastian CZECH
b120f5486c feat(xo-lite): add links to user menu (#8114) 2024-11-18 16:53:47 +01:00
Joris K
c72e6ab66e feat(web-core) add UiRadioButtonGroup component (#8096) 2024-11-18 16:36:27 +01:00
OlivierFL
7c68ff83cf feat(xo-lite/header): update user menu button (#8109) 2024-11-18 16:35:07 +01:00
OlivierFL
2a8acd2770 fix(xo-lite/stories): bad custom-event name case (#8140) 2024-11-18 16:25:19 +01:00
MlssFrncJrg
6825b24108 fix(xo-server-perf-alert): fix no writable SRs being monitored (#8113) 2024-11-18 10:15:09 +01:00
Julien Fontanet
0603b63035 chore: update dev deps 2024-11-15 19:08:37 +01:00
Stephane
99c56d282b fix(xen-orchestra/fs): nfs port (#8085)
XO-375

In "remotes", fix nfs port if specified.
The problem : port was specified in url, when it should be specified as an option.

Options already exist. It should continue to work as before.
2024-11-15 14:19:49 +01:00
OlivierFL
29b4c0a764 fix(xo-lite/dashboard): add min-width to hosts patches container (#8108)
Set a minimum width for the "Patches" and "Status" cards to align with the design system and allocate enough space for displaying data when it is being loaded.
2024-11-15 12:41:34 +01:00
Joris K
b81e83c619 fix(web-core): changing variable name due to new guidelines (#8131) 2024-11-15 11:18:47 +01:00
Mathieu
d7d4b40d66 feat(xo-server/xostor): do not install/update packages in airgap environement (#8105) 2024-11-15 09:14:49 +01:00
Thierry Goettelmann
a3340a7a7e feat(lite,core,web): control domain store, refactor context access (#8130) 2024-11-15 09:14:28 +01:00
Mathieu
91bfdf54ec fix(xo-web/host/network): do not PIF.reconfigure_ipv6 if IPv6 is an empty string (#8119)
See https://team.vates.fr/vates/pl/utda1cc3p3roiknt5y4yn3xqjo
Introduced by 1becccf
2024-11-15 09:13:20 +01:00
Sebastian CZECH
317a6587d3 feat(xo-6): add panel component (#8122) 2024-11-15 09:10:39 +01:00
Joris K
d229e2b82e feat(web-core): add UiCheckboxGroup component (#8094) 2024-11-15 09:07:40 +01:00
Joris K
36bab99a10 feat(web-core): add UiToggle component (#8084) 2024-11-15 09:03:28 +01:00
Joris K
2dafb3a1ec feat(web-core): added UiTableActions component (#8072) 2024-11-15 09:00:57 +01:00
Joris K
09b4246207 feat(web-core): added UiRadioButton component (#8067) 2024-11-15 08:56:48 +01:00
Joris K
92d504012a feat(web-core): added UiTopBottomTable component and some trad (#8055) 2024-11-15 08:54:25 +01:00
Julien Fontanet
cd6a856986 feat: release 5.100.2 2024-11-14 17:49:58 +01:00
Julien Fontanet
2f20370aec feat(xo-web): 5.161.0 2024-11-14 16:34:46 +01:00
Julien Fontanet
e5abd5c390 feat(xo-server): 5.161.0 2024-11-14 16:34:14 +01:00
Julien Fontanet
834c32f1da feat(@xen-orchestra/proxy): 0.29.4 2024-11-14 16:33:13 +01:00
Julien Fontanet
b46598f2b1 feat(@xen-orchestra/backups): 0.54.3 2024-11-14 16:32:48 +01:00
Julien Fontanet
d317e70282 feat(@xen-orchestra/xapi): 7.7.1 2024-11-14 16:30:46 +01:00
Julien Fontanet
f9c7aa92f9 feat(@xen-orchestra/log): 0.7.1 2024-11-14 16:28:42 +01:00
Julien Fontanet
fc57a7f9be feat(xo-server/api): ability to capture all logs for a call
The goal of this new feature is to help developers investigate issues by
allowing them to easily gather more information.

When enabled, all logs emitted in a given API call are stored in a file
(`${tmpdir}/xo-api-${date}-${method}.log`).

Administrators can use the special `_log` param to request it:

```sh
xo-cli vm.start id=$id _log=json:true

xo-cli vm.start id=$id _log=failure
```

Or it can be enabled for all calls to a method in xo-server's configuration:

```toml
[api.logs]
'vm.start' = 'failure'
```
2024-11-14 16:00:15 +01:00
Julien Fontanet
9abfc1509c feat(log/captureLogs): possibility to forward to fallback transport 2024-11-14 16:00:15 +01:00
Nathanaël
224c09ed57 docs: migrate from VuePress 1.4 to Docusaurus 3.6 (#8078)
Migrate docs from VuePress wich is not maintained anymore, to Docusaurus, which is maintained and also used fro XCP-ng docs.

---------

Co-authored-by: Thomas Moraine <thomas.moraine@vates.tech>
2024-11-14 10:09:28 +01:00
Julien Fontanet
10a82b07a9 fix(backups,xapi): use PV_drivers_detected instead of PV_drivers_version.major
Fixes zammad#27432
Fixes zammad#29040
2024-11-14 09:42:34 +01:00
Florent BEAUCHAMP
d6e76f4558 fix(backups): force delta chain length at zero for base backup (#8126)
from ticket 31268
probably caused by a combination of restore/clone of a VM
2024-11-14 07:44:53 +01:00
Sebastian CZECH
75a19e7ea0 feat(web-core): add UiToaster component (#8095) 2024-11-13 16:08:56 +01:00
MlssFrncJrg
05c4e8ea8a feat(xo-web/VM/Advanced): nested virtualization warning tooltip (#8107) 2024-11-13 10:11:48 +01:00
Thierry Goettelmann
ec63244ada chore(web stack): update dependencies (Vue 3.5, TS 5.6) (#8111)
- Update Vue `3.4` to `3.5`
- Update TypeScript `5.3` to `5.6` 
- Update Pinia `2.1` to `2.2`
- Update `vite.config.ts` to import paths with `fileURLToPath` and `URL` instead of `resolve`
- Update `size.util.ts` to use named imports from `human-format`
- Fix TS error in `vite.config.ts`
- Fix TS error in `story-param.ts`
- Fix TS error in `UiCardNumbers.vue`
- Fix TS error in `tree-node-base.ts`
2024-11-13 10:05:22 +01:00
Julien Fontanet
bc5182b3ca chore: format with Prettier 2024-11-13 09:39:34 +01:00
Florent BEAUCHAMP
ce16eb5ee4 fix(@xen-orchestra/xapi): use callAsync for VDI_listChangedBlocks (#8120) 2024-11-12 16:44:21 +01:00
Joris K
c7ddf33bcf feat(web-core): added UiCheckbox component (#8064) 2024-11-12 15:24:35 +01:00
Julien Fontanet
02f34c18e6 feat(log/levels): expose names, values and resolve() 2024-11-12 10:37:44 +01:00
Sebastian CZECH
86accbf912 feat(xo-6): add host console (#8103) 2024-11-12 08:43:11 +01:00
MlssFrncJrg
efee92dbdf fix(xo-web/Editable/Text): trim spaces (#8115) 2024-11-08 15:59:19 +01:00
MlssFrncJrg
28735191bc feat(xo-web): add documentation link when the host TLS key is too small (#8110) 2024-11-08 12:55:54 +01:00
Florent BEAUCHAMP
96abd49646 feat: release 5.100.1 (#8118) 2024-11-07 16:23:01 +01:00
Florent BEAUCHAMP
d8c4b60b63 feat: technical release (#8116) 2024-11-07 15:38:43 +01:00
Florent BEAUCHAMP
41bc59bdf4 fix(nbd): connect to only one host at a time per disk (#8086)
connecting to multiple host in parallel sometimes lead to a race condition in xapi-nbd while updating the sm_config property of the vdi. This lead to VDI that are not disconnected, thus VDI_IN_USE error at the next step of the backup

from : https://xcp-ng.org/forum/topic/9864/vdi-staying-connected-to-dom0-when-using-nbd-backups/46?_=1730797966321
2024-11-07 14:49:57 +01:00
Florent BEAUCHAMP
a8fd967576 fix(xo-remote-parser): encode username (#8106)
from ticket 30845
2024-11-07 14:43:57 +01:00
Julien Fontanet
9de714b5d6 feat(xo-web,xo-server): hint numeric for OTP inputs 2024-11-07 11:17:31 +01:00
Mathieu
a4ba695125 feat(web-core): new UiTextarea component (#7993) 2024-11-06 15:32:45 +01:00
Joris_K
7e4c33b2f7 feat(web-core): update the UiButton component to follow the new guidelines (#8049) 2024-11-06 11:17:00 +01:00
MlssFrncJrg
bb51de262d feat(xo-web): in health tab, hide PVS accelerator in orphan VDIs (#8039)
Fixes #7938
2024-11-06 10:52:55 +01:00
OlivierFL
4a7a2b74e0 feat(web-stack): use new guidelines for web-core components (#8069) 2024-11-05 15:33:46 +01:00
OlivierFL
804af1dc68 feat(web-stack): update normal colors to info and add brand colors (#8054) 2024-11-05 09:46:14 +01:00
Julien Fontanet
3a0155b464 fix(proxy/system.getServerVersion): fix description 2024-11-04 16:41:16 +01:00
b-Nollet
ff1189ef69 feat(lite): 0.5.0 (#8092) 2024-10-31 13:57:41 +01:00
b-Nollet
350fae90eb feat: release 5.100.0 (#8091) 2024-10-31 13:03:38 +01:00
b-Nollet
4fc97a572e feat: technical release (#8090) 2024-10-31 11:30:41 +01:00
Julien Fontanet
f077ccb09a fix(xo-server): ensure group name unicity 2024-10-31 10:49:45 +01:00
Julien Fontanet
8ffd7f993c fix(xo-server/Users): properly check email unicity (#8089)
Replaces #8088

Introduced by f2fe7731d

This commit introduce two new `Collection/Redis` protected async methods:

- `_beforeAdd(model)`: called before a new model is added
- `_beforeUpdate(model, previous)`: called before a model is updated

If the method throws, the corresponding operation is aborted.
2024-10-31 10:38:56 +01:00
b-Nollet
34bccbda56 feat: technical release (#8087) 2024-10-30 16:06:56 +01:00
Julien Fontanet
07ad2ca201 feat(backups): add debugs to file restore 2024-10-30 13:36:59 +01:00
Julien Fontanet
f1a7436a90 fix(xo-cli rest): don't alter unprefixed response 2024-10-30 13:36:59 +01:00
Stephane
7c9e1439a9 fix(xen-orchestra/fs): error creating nfs encrypted remote (#8081)
XO-386

When adding a nfs remote with encryption, the remote directory must be empty, then we create metadata.json and encryption.json on it.
If not, we fail to test these json files and the user receive an error "file not found: metadata.json" which is not understandable.

In this case, this PR return a message explaining the problem.
2024-10-30 13:14:37 +01:00
Pierre Donias
9ec7462a04 feat(netbox): synchronize description and comments (#8083) 2024-10-30 10:03:38 +01:00
Florent BEAUCHAMP
73e170e849 fix(Restore): ignore cbt_medata disk when doing differential restores (#8082)
differential restore works by reusing local data of a snapshot
linked to a delta chain on the remote
cbt_metadata don't have the disks data , thus are not eligible to
be used  for differential restores

from  https://xcp-ng.org/forum/topic/9728/problem-with-differential-restore/8
2024-10-30 09:59:13 +01:00
Pierre Donias
10150e5902 feat(xo-web/acls): ability to filter objects by tags (#8068)
See Zammad#24820
2024-10-29 15:55:08 +01:00
Julien Fontanet
30e6d4b4f1 feat(xo-web/new-vm): new cloud-init template var {index} 2024-10-29 15:16:19 +01:00
Florent BEAUCHAMP
b018e5acb3 feat(vmware): keep connection alive (#7839)
this lead to failing transfer when powering off the VM , since this is the
first api call after the export, that can take hours. The error code is a 500

We do a dummy vmware api call every 15 minutes, to ensure the session stays
up.

ticket 25980 and 29939
2024-10-29 13:45:43 +01:00
Stephane
f2fe7731d9 fix(xo-server): user can set his email to an already used email (#8062)
user can set his email to an already used email

    add a check, if email already exists, throw an error

XO-323
2024-10-29 13:41:56 +01:00
Mathieu
d89fb329ef feat(xo-server/rest-api): create_vm cloud init support (#8070) 2024-10-29 12:05:26 +01:00
Joris_K
5b34022d1d feat(web-core): add UiTitle component (#8046) 2024-10-29 11:55:26 +01:00
Julien Fontanet
297b9b2025 feat(task/{failure,success}): ensure not called during run
Introduced by ba3753ab1
2024-10-29 08:34:48 +01:00
Julien Fontanet
53266ec8f6 chore: don't auto build before running tests
This does not integrate well with Turbo and slows down the CI.
2024-10-28 17:06:44 +01:00
Julien Fontanet
163e80b6c5 feat(ci): test with Node 20 2024-10-28 16:49:59 +01:00
b-Nollet
04b3fc26fb feat: technical release (#8079) 2024-10-28 16:42:40 +01:00
Julien Fontanet
c0b61d5f67 fix(ci): correctly cache Turbo 2024-10-28 16:40:49 +01:00
Julien Fontanet
2da3721d83 chore(ci): use actions/checkout/v4 2024-10-28 16:38:23 +01:00
Julien Fontanet
0cf1d52935 chore(ci): separate steps with new lines 2024-10-28 16:37:13 +01:00
Julien Fontanet
41e847a32f chore: use native node:test instead of test package 2024-10-28 16:33:21 +01:00
Julien Fontanet
14e9059cb3 test(fs): fix broken tests 2024-10-28 15:43:14 +01:00
Mathieu
58bace558e fix(xo-server/rest-api): fix "/users/me" redirection (#8075)
fix(xo-server/rest-api): fix  redirection
2024-10-28 13:57:59 +01:00
Julien Fontanet
40fc999a3a feat(xen-api/call): add duration to error 2024-10-28 11:31:23 +01:00
Julien Fontanet
8116535b1b fix(CHANGELOG.unreleased): remove empty line
Introduced by ba3753ab1
2024-10-28 11:31:23 +01:00
Pierre Donias
95e5f50ce7 Revert "feat(xo-web/XOA update): display "Downgrade" when trial is over" (#8074)
This reverts commit c6f3b2b1ce.

Showing "Downgrade" after a trial has ended can be confusing.
2024-10-28 11:13:30 +01:00
Florent BEAUCHAMP
d1cdf6c0c5 fix(backup/incremental): clean vm before starting the transfert
especially in case of mirror backup, the cost of a backup repo in
an invalid state exceeds the cost of a retransfer
2024-10-28 11:06:46 +01:00
Florent BEAUCHAMP
bc74a0bd42 chore(backup): fix typo 2024-10-28 11:06:46 +01:00
Florent BEAUCHAMP
0eb50099af revert(backup): do not call updateuuid
commit ac8659021f

chaining must be redone since the path of the parent can change
from alias to non alias or the opposite
2024-10-28 11:06:46 +01:00
Pierre Donias
65fe1d83be feat(lite/xoa-deploy): configure custom NTP servers (#8059)
Add NTP servers to xenstore so that XO can automatically configure them on first start.
2024-10-28 11:05:24 +01:00
Mathieu
8c85a4657b feat(xo-server/rest-api): implement authentication tokens route (#8065) 2024-10-25 15:11:28 +02:00
Florent BEAUCHAMP
f236238c73 fix(backups): keep only the last snapshot across all delta schedules (#8051) 2024-10-25 11:29:57 +02:00
Joris_K
3d681f868a feat(web-core): add actions title component (#8045) 2024-10-25 11:23:18 +02:00
Julien Fontanet
c79efa0fe8 docs(xml-rpc): don't normalize or trim whitespaces when parsing XML 2024-10-24 11:21:42 +02:00
Julien Fontanet
bc5fa0f3f5 fix(xo-cli rest --json): output ndjson if response is ndjson 2024-10-24 11:21:42 +02:00
Florent BEAUCHAMP
fa9f865494 fix(Backups/cleanVm): handle missing vhd file of an alias (#8053) 2024-10-24 10:34:47 +02:00
Julien Fontanet
ba3753ab1a feat(task): add start, success & failure methods (#8061)
* feat(task): add start, success & failure methods

Allow managing the task manually instead of using `.run()` and `.runInside()`.
2024-10-22 17:08:57 +02:00
Stephane
a71e78fdbc chore(xo-server-test): cleanup and rewrite user tests (#8048) 2024-10-22 17:08:17 +02:00
Julien Fontanet
a3cb9d5619 feat(fs/cli): new method cat
```sh
xo-fs "$remote" cat "$file1" "$file2"
```
2024-10-22 17:01:47 +02:00
Julien Fontanet
cc1d492510 feat(fs/cli): ability to call a method directly from CLI
Example with `mkdir(path)`:

```sh
xo-fs "$remote" mkdir "$path"
```
2024-10-22 17:01:47 +02:00
Florent BEAUCHAMP
d0b7d305a2 fix(backups): VDI_INCOMPATIBLE_TYPE error (#8043)
See https://help.vates.tech/#knowledge_base/1/locale/en-us/answer/135
2024-10-22 15:09:50 +02:00
Julien Fontanet
c0bc294886 feat(xo-web/home/vms): ability to filter by MAC addresses
Fixes https://team.vates.fr/vates/pl/7xju4kwb6bra8nxupqxfhbiupc
2024-10-22 14:42:06 +02:00
Florent BEAUCHAMP
ac8659021f fix(backup/mirror): do not call updateuuid 2024-10-21 17:06:02 +02:00
Florent BEAUCHAMP
6756c9de99 fix(backups): ensure checkBaseVdis is called on all delta backup
before this commit checkbasevdis is not called if there are no disks
this leads to an erronous error message `checkbasevdi must be called
before updateUuidAndChain for incremental backups` instead of a
message on the missing vhd
this wille trigger  'A differential VHD must have a parent' instead
2024-10-21 17:06:02 +02:00
Florent BEAUCHAMP
56f3d9d7a9 fix(backup/mirror): homogenize differental vhd computation 2024-10-21 17:06:02 +02:00
Julien Fontanet
649add3ab3 fix(xo-server-audit): ignore host.isPubKeyTooShort
Fixes https://xcp-ng.org/forum/post/84464
2024-10-21 11:16:21 +02:00
Pierre Donias
78ae16b21e fix(xo-web/menu): handle null patches (#8060) 2024-10-18 17:30:59 +02:00
Pierre Donias
4102810be6 fix(xo-server): ability to remove blank tags (#8058)
See Zammad#30259
2024-10-18 16:51:50 +02:00
Pierre Donias
86883857d4 fix(xo-server-netbox): ignore empty tags (#8056)
See Zammad#30259
2024-10-18 16:31:19 +02:00
Julien Fontanet
79450a1c51 feat(xo-cli): new watch command 2024-10-18 15:14:23 +02:00
Pierre Donias
6495d563f5 fix(xo-web/createVm): fix typo error → err (#8052)
Introduced by #7122
2024-10-17 15:51:11 +02:00
mathieuRA
761c03e46c feat(xo-server/rest-api): implement getFromAsyncCache in the dashboard 2024-10-17 15:28:41 +02:00
mathieuRA
1eeff13de1 feat(xo-server/utils): creation of getFromAsyncCache 2024-10-17 15:28:41 +02:00
Pierre Donias
2027f8a282 fix(lite): handle IPv6 hosts (#8044)
See https://xcp-ng.org/forum/topic/9767/xo-lite-issue-8-3-ipv6

Add mandatory `[]` around IPv6 addresses when making requests.
2024-10-17 11:47:43 +02:00
Mathieu
2e8d398623 fix(xo-server,xo-web/SR/new): fix reattach button not displayed for HBA (#7986)
See zammad#26485
2024-10-16 11:15:03 +02:00
Florent BEAUCHAMP
fff3ec1f8b fix(backups): support system without cbt (XS< 7.3) (#8038) 2024-10-15 10:54:20 +02:00
Thierry Goettelmann
a7d7cf18c0 feat(web-core): new VtsLabel component (#7983) 2024-10-11 10:50:46 +02:00
Julien Fontanet
00d1792578 feat(xo-cli): 0.31.0 2024-10-10 15:20:05 +02:00
Julien Fontanet
8f6c087e3a feat(xo-cli rest patch): now behaves like post and put 2024-10-10 13:36:15 +02:00
Julien Fontanet
e886e91271 fix(xo-cli rest): correctly resolve server URLs
Previously it failed with a similar error:

```
✖ TypeError [ERR_INVALID_URL]: Invalid URL
    at new NodeError (node:internal/errors:405:5)
    at new URL (node:internal/url:676:13)
    at Object.exec (file:///usr/local/lib/node_modules/xo-cli/rest.mjs:188:21)
    at COMMANDS.<computed> (file:///usr/local/lib/node_modules/xo-cli/rest.mjs:151:29)
    at async main (file:///usr/local/lib/node_modules/xo-cli/index.mjs:434:14) {
  code: 'ERR_INVALID_URL',
  input: 'localhost'
}
```
2024-10-10 13:31:54 +02:00
Mathieu
3d054c8358 feat(xo-server/rest-api/dashboard): avoid iterating over all XAPI objects (#8008) 2024-10-09 14:38:25 +02:00
b-Nollet
a596702a96 feat: release 5.99.1 (#8036) 2024-10-04 14:45:47 +02:00
b-Nollet
bfb2ea6b17 feat: technical release (#8035) 2024-10-04 10:17:23 +02:00
Florent BEAUCHAMP
52c79caa45 fix(vdi): disconnect from dom0 succeed if disk is already destroyed 2024-10-04 09:00:50 +02:00
Florent BEAUCHAMP
8d48797639 feat(@xen-orchestra/xapi): try to disconnect vdi before retry destroy
can happens when a previous job failed with oom while
xapi-nbd kept disk attached to dom0

from https://help.vates.tech/#ticket/zoom/28709
2024-10-04 09:00:50 +02:00
Florent BEAUCHAMP
30172caa1f fix(task/combineEvents): remove ended tasks from map (#8030) 2024-10-03 14:35:10 +02:00
Julien Fontanet
a9b99a8b45 fix(xo-web/Tooltip): don't hide on changing children prop (#8031)
Due to the way React works, `props.children` always change even if it will
resolve to the same DOM node.
The implementation is therefore updated to check equality on DOM nodes directly.
2024-10-03 11:46:12 +02:00
Julien Fontanet
9321b04c5f feat(log): helper to capture logs in an async stack (#7975) 2024-10-02 15:14:32 +02:00
Julien Fontanet
6c258af43a feat(scripts/gen-deps-list.js): reject @xen-orchestra/lite 2024-10-01 11:26:29 +02:00
Stephane
0a28abaada feat(lite): 0.4.0 (#8028)
Co-authored-by: Stephane MEYER <stephane.meyer@vates.tech>
2024-09-30 18:18:18 +02:00
Stephane
a609e98c40 feat: release 5.99.0 (2024-09-30) (#8026) 2024-09-30 17:15:42 +02:00
Stephane
ac06a8ef49 feat: technical release (#8025) 2024-09-30 16:15:18 +02:00
Pierre Donias
2ea2f8040a fix(xo-web/render-xo-item/Schedule): handle undefined job/schedule name (#8024)
See https://xcp-ng.org/forum/topic/9690
Introduced by d520e53f9e
2024-09-30 14:52:40 +02:00
Julien Fontanet
f6e6e052ef feat(xo-web/tasks): ability to delete XO tasks' logs
Related to https://team.vates.fr/vates/pl/s7eb6mkpj7bzpqmwh89apu3eio
2024-09-30 11:33:52 +02:00
Julien Fontanet
748ed07241 chore(xo-web): format with Prettier 2024-09-30 11:30:00 +02:00
Stephane
e5b833dada feat: technical release (#8022) 2024-09-30 11:26:12 +02:00
Mathieu
68b1641e07 fix(xo-server/rest-api/dashboard): fix 'cannot get handler to proxy remote' (#8021) 2024-09-30 10:59:26 +02:00
Florent BEAUCHAMP
ad8cd3791b fix(xo-server): migration of vm with cbt enabled disk (#8017) 2024-09-30 09:04:33 +02:00
Julien Fontanet
030b3ad4d1 feat: move invalid response detection from xen-api to xapi
Introduced in ea5358e76

Fixes https://xcp-ng.org/forum/post/83157

The detection taints the stream and makes helpers like `body.text()` unusable.
2024-09-29 17:15:05 +02:00
Stephane
cfea2b3a2b feat: technical release (#8020) 2024-09-27 16:21:46 +02:00
OlivierFL
44e33666cf feat(xo-6/dashboard): add resources overview data (#8009)
Display resources overview data on XO 6 dashboard.
2024-09-27 14:20:06 +02:00
Stephane
939ab29d04 fix(xo-server/api): private data in api call (#8019) 2024-09-27 14:04:22 +02:00
MlssFrncJrg
cdfe0b0374 feat(xo-server,xo-web): display bond mode of a network (#8010) 2024-09-27 12:37:25 +02:00
Julien Fontanet
eb39e14972 fix(xo-server/rest-api): set apiContext
This makes the REST API more closely resemblethe JSON-RPC API and addresses
several issues such as the broken _Rolling Pool Update_ pool action.

Fixes https://xcp-ng.org/forum/post/82867
2024-09-27 12:15:42 +02:00
Pierre Donias
d520e53f9e feat(xo-web/backup): backup job sequences (#8014)
See #7985
2024-09-27 12:13:55 +02:00
Florent BEAUCHAMP
f7df1c4109 feat(xo-server/api): add a schedule.runSequence method (#7985) 2024-09-27 10:30:33 +02:00
Florent BEAUCHAMP
558ea84880 feat(backups): improve health check error messages (#8016)
- waitObjectState already throw if timeout is reached
- gives more details to help user understand the issue
  - timeout reached while waiting for  ${refOrUuid} to be running
  - timeout reached while waiting for  ${refOrUuid} to report the
    driver version through the xen tools.
2024-09-27 09:11:04 +02:00
Mathieu
0e9242be51 fix(xo-server/rest-api/dashboard): fix 'no such VM <uuid>' when calculating vms protection (#8013) 2024-09-27 09:07:22 +02:00
MlssFrncJrg
943ad781cc fix(xo-server/xo-web/mirrorBackup): correct new schedule property on edited mirror backup job (#8001)
Introduced by ee0adae
2024-09-26 17:18:56 +02:00
OlivierFL
6b21f08ab0 feat(xo-6/dashboard): add VMs protection data (#8007) 2024-09-26 17:10:51 +02:00
Julien Fontanet
ea5358e76b feat(xen-api/getResource): detect invalid XAPI response 2024-09-26 15:15:00 +02:00
Julien Fontanet
742109ccba fix(CHANGELOG.unreleased): add missing entry
Introduced by b47019e0e
2024-09-26 15:14:22 +02:00
Julien Fontanet
00f2f8c103 fix(xo-cli rest get): properly parse --output 2024-09-26 15:13:07 +02:00
Julien Fontanet
291c5a430d feat(xo-cli rest): post/put accept --input $file 2024-09-26 15:13:04 +02:00
Stephane
9ad13608eb feat: technical release (#8015) 2024-09-26 14:55:46 +02:00
OlivierFL
fc3e954d3e feat(xo-6/dashboard): add S3 backup repository data (#8006) 2024-09-26 14:40:59 +02:00
b-Nollet
cc3d5f2efc feat(xo-server, xo-web): warning for too small host TLS keys (#7995) 2024-09-26 11:58:59 +02:00
Julien Fontanet
090c4ecb23 docs(airgap): fix bad copy/paste 2024-09-25 22:00:20 +02:00
Olivier Lambert
b78c7d228d docs(airgap): add the full offline process via our deploy script (#8011) 2024-09-25 21:40:15 +02:00
Mathieu
13f2afb0d6 feat(web-core): new Info component (#7997) 2024-09-25 15:32:16 +02:00
Mathieu
f651943add feat(xo-server/rest-api/dashboard): add resources overview information (#8005) 2024-09-25 15:24:22 +02:00
Julien Fontanet
c0f1d61c01 feat(PULL_REQUEST_TEMPLATE): document review process 2024-09-25 10:55:02 +02:00
Stephane M.
e65823b4a5 fix(xo-server/api): undefined on connecting iscsi lun to xoa (#8004) 2024-09-25 10:41:25 +02:00
OlivierFL
75684cbe12 feat(xo-core): update UiIcon component (#8003) 2024-09-25 10:31:59 +02:00
Mathieu
971a561879 fix(xo-server/rest-api): remove alarms info from the dashboard and messages endpoint (#7959) 2024-09-25 10:20:58 +02:00
Mathieu
d6bba81d36 feat(xo-server/rest-api/dashboard): add vmsProtection information (#7964) 2024-09-24 17:33:25 +02:00
Stephane M.
206f59575a test(xo-collection): convert from Jest to node:test (#7987)
Co-authored-by: Stephane MEYER <stephane.meyer@vates.tech>
Co-authored-by: Julien Fontanet <julien.fontanet@isonoe.net>
2024-09-24 17:04:22 +02:00
OlivierFL
dbf3d82a1b feat(xo-core): update VtsCounter component to v2 (#7994) 2024-09-24 16:00:16 +02:00
b-Nollet
d3414a94c6 feat(xo-web): display more notes on backup main page (#7977) 2024-09-24 14:31:23 +02:00
Mathieu
7e9b4447bf feat(xo-server/rest-api/dashboard): add S3 backup repositories information (#7978) 2024-09-24 12:22:25 +02:00
Pierre Donias
8a10070f4d feat(netbox): support Netbox v4.1 (#8002)
Fixes #7966
2024-09-24 11:21:19 +02:00
Stephane M.
b365e4aa25 test(defined): create tests for defined() (#7967)
Co-authored-by: Stephane MEYER <stephane.meyer@vates.tech>
Co-authored-by: Julien Fontanet <julien.fontanet@isonoe.net>
2024-09-24 10:17:31 +02:00
Julien Fontanet
28709b660e fix(eslint): accept Node 16 ES sytaxes in tests 2024-09-23 18:03:06 +02:00
Julien Fontanet
19067f7f6c feat(xo-cli rest): post/put from file support params
Params are passed in the query string instead of the body.
2024-09-23 18:03:06 +02:00
Pierre Donias
a297160432 feat(netbox): check Netbox version down to minor + allow to bypass check (#7992) 2024-09-23 14:59:51 +02:00
Stephane M.
381c83d0b3 test(parse-duration): create unit tests (#7968) 2024-09-22 20:50:42 +02:00
Julien Fontanet
7e14152473 feat(xo-server/rest-api): expose VM controllers' VDIs 2024-09-20 14:15:48 +02:00
OlivierFL
21bd7394fa fix(xo-lite/stories): add missing required props for UiButton component configs (#7996) 2024-09-20 11:07:54 +02:00
Pizzosaure
89aa7df744 fix(xo-web/backup): fix normalizedSettings[''] is undefined when editing a backup job
Introduced by 8a9a67c
2024-09-20 10:22:01 +02:00
Pizzosaure
b62e8035fc fix(xo-web/backup): fix r[''] is undefined when creating a backup job
Introduced by 8a9a67c
Fixes #7990
2024-09-20 10:22:01 +02:00
Thierry Goettelmann
02ed1bcee2 docs(web-core): component variants guidelines + composable (#7743) 2024-09-20 10:17:55 +02:00
Julien Fontanet
63a88b1525 fix(xen-api): don't normalize/trim strings in XML-RPC
This applies to both XML-RPC transport and results of XAPI tasks.

Before this commit, all whitespaces (spaces, new lines, etc.) were reduces to
a single whitespaces and leading and trailing whitespaces where removed.

This led to malformed values such as the result of `host.get_server_certificate`.
2024-09-19 16:19:58 +02:00
Thierry Goettelmann
2b1d6f21a0 fix(lite,web,web-core): lock Vue version to 3.4 + ESLint error (#7998)
Prevent Vue upgrade to 3.5 and fix ESLint error in the demo story.

- The recent upgrade of XO Lite / 6 to Vue 3.5 broke the CI due to typing errors (778362d8db)
- Temporarily blocks Vue from upgrading beyond 3.4 to avoid CI failures
- Fixes an attribute case mismatch in the demo story that was causing an ESLint error
2024-09-19 15:38:25 +02:00
Thierry Goettelmann
e13c0789e8 docs(web-core): component guidelines (#7696) 2024-09-19 11:23:45 +02:00
Julien Fontanet
778362d8db chore: refresh yarn.lock 2024-09-19 10:58:41 +02:00
Julien Fontanet
530c30fd50 fix(xo-server/rest-api): handle missing content-length
Unconditional cast gave `NaN` instead of `undefined` which broke automatic
computation when using VHD.
2024-09-18 11:12:22 +02:00
Julien Fontanet
4debc0f893 chore(backups/importIncrementalVm): remove VHD stream length computation
It's now unnecessary thanks to 57a399c64.
2024-09-18 10:47:19 +02:00
Julien Fontanet
57a399c64d feat(xapi/VDI_importContent): compute VHD stream length if missing 2024-09-18 10:45:51 +02:00
Julien Fontanet
0acd7c3530 fix(xapi/SR_importVdi): use VDI_destroy on error
It retries on `VDI_IN_USE` error contrary to `VDI.destroy`.
2024-09-18 10:18:22 +02:00
Julien Fontanet
088bd7cfd3 feat(xo-cli rest): post/put from a file 2024-09-17 17:48:40 +02:00
Julien Fontanet
b47019e0e4 feat(xo-cli rest get): displays stats when using -o $file 2024-09-17 16:02:02 +02:00
Julien Fontanet
aa490dc066 fix(xo-server/rest-api): fix broken VDI export
Introduced by 7b256ab8e

Not completely fixed by 8eae8e7f4

See zammad#27167
2024-09-17 15:38:34 +02:00
Julien Fontanet
b8388bb255 fix(backups): error message typo 2024-09-17 15:21:57 +02:00
OlivierFL
f969056d02 feat(web-stack): update components to match new colors from design system (#7989) 2024-09-17 08:47:54 +02:00
OlivierFL
5e11547439 feat(web-stack): replace components CSS color variables with new ones (#7984)
Replace legacy CSS colors variables in components with new ones created by #7973
2024-09-17 08:39:52 +02:00
MlssFrncJrg
04f3a09ab0 fix(xo-web/host): fix "an error has occurred" in host Mode column (#7954) 2024-09-16 09:46:50 +02:00
MlssFrncJrg
385ff21f4a feat(xo-web/disks): add icon for empty metadata VDI snapshots (#7970) 2024-09-16 09:44:17 +02:00
b-Nollet
40f5f48f17 fix(xo-web/backup): avoid 0 value for backup speed limit (#7980)
Backup job's speed limit (`maxExportRate`) had values `0` and `undefined`
leading to the same behaviour, but the values were both accepted, which could be
confusing. 0 values are now replaced by `undefined` when creating or editing a
backup job.
2024-09-13 09:25:35 +02:00
Julien Fontanet
74e6fa26a6 chore: refresh yarn.lock 2024-09-11 11:58:00 +02:00
Julien Fontanet
e26e1a2f90 fix(xo-server/hub/recipes/kubernetes): sort versions in selector 2024-09-11 11:53:05 +02:00
Julien Fontanet
c7970b3809 feat(scripts/gen-deps-list.js): don't upgrade lite due to dependency
XO Lite has a separate release process.
2024-09-11 10:55:45 +02:00
Julien Fontanet
4c7acc1614 feat: release 5.98.1 2024-09-10 16:57:12 +02:00
Julien Fontanet
fd18bee62f feat(xo-web): 5.155.0 2024-09-10 14:50:47 +02:00
Julien Fontanet
a9ad679933 feat(xo-server-sdn-controller): 1.0.10 2024-09-10 14:50:37 +02:00
Julien Fontanet
cd2b7a2553 feat(xo-server-perf-alert): 0.5.0 2024-09-10 14:50:15 +02:00
Julien Fontanet
b061ff63e7 feat(xo-server): 5.154.0 2024-09-10 14:49:13 +02:00
Julien Fontanet
28d1d8b473 feat(@xen-orchestra/proxy): 0.28.14 2024-09-10 14:45:06 +02:00
Julien Fontanet
8f5c4f336d feat(@xen-orchestra/backups): 0.53.1 2024-09-10 14:44:15 +02:00
Julien Fontanet
3c5ad184b5 feat(@xen-orchestra/xapi): 7.4.0 2024-09-10 14:43:12 +02:00
Mathieu
3ced19b4dc fix(xo-web/dashboard/health): alarms value can be Infinity, -Infinity or NaN (#7965)
See zammad#28645
2024-09-10 14:15:39 +02:00
Florent BEAUCHAMP
9504132585 feat(backups/CBT): retry data_destroy when error is VDI_IN USE (#7960)
Fixes #7826

Sometimes XAPI takes too long to detach the VDI,
in this case, the timeout is fixed at 4s, non modifiable
when the timeout is reached the xapi raise a VDI_IN_USE error

This commit adds a retry on XO side to give more room for XAPI
to work through this process, as XO already does it on VDI destroy
2024-09-10 12:19:13 +02:00
Pierre Donias
fc67abd25b chore(xo-web/i18n): update Japanese locale file 2024-09-10 10:49:02 +02:00
Yasushi Taki
72d0866174 feat(xo-web/i18n): add additional Japanese translations 2024-09-10 10:49:02 +02:00
Thierry Goettelmann
073b15ed07 feat(web-core): new useTable composable (#7936) 2024-09-10 10:14:37 +02:00
Thierry Goettelmann
7c31b44bb0 fix(web-core/useRouteQuery): URL not updating immediately in some cases (#7935)
Introduced by 290b5df
2024-09-10 09:11:43 +02:00
Thierry Goettelmann
e830bf0f0c fix(web-core): tooltip position does not update when content changes (#7979) 2024-09-10 09:06:24 +02:00
Thierry Goettelmann
790ba9bdd1 feat(web-core): new color scheme + naming from design system (#7973) 2024-09-10 08:35:35 +02:00
OlivierFL
6c8d41db00 feat(xo-6/dashboard): add backup issues data (#7974) 2024-09-09 15:44:15 +02:00
Thierry Goettelmann
576a3aa007 fix(web6): record can be undefined in single record context (#7976) 2024-09-09 14:48:15 +02:00
Julien Fontanet
af17f4a28a fix(xo-server-sdn-controller): don't try to install certs on ro pools 2024-09-09 10:33:18 +02:00
Florent BEAUCHAMP
2f7e0d0963 fix(v2v): computation of memory_static_max (#7971)
Introduced by ad1bf3b348

The max memory that can be assigned to a VM is not correctly passed by the v2v import
2024-09-09 09:26:53 +02:00
Julien Fontanet
01c71414ae fix(xo-server/xen-servers): don't try to mark read-only pool
This led to many warnings in the log.
2024-09-06 15:49:37 +02:00
Pierre Donias
1ca468064f fix(xo-web/host/PCI): "Enabled" → "Passthrough enabled" (#7961)
See https://team.vates.fr/vates/pl/p66inuymi3gm7cxf9tgkx3aa8c
2024-09-05 10:13:10 +02:00
MlssFrncJrg
69ffac65f0 feat(xo-server-perf-alert): don't compute RAM usage when no tools (#7886)
See https://kanban.vates.fr/b/jnfjuip4eBARBNuv9/xo-releases/jHtPoS4TKqZB7QL7Z
See #7831
2024-09-05 09:21:34 +02:00
MlssFrncJrg
f38b449624 feat(xo-server/rest-api/dashboard): add backup name and type (#7958) 2024-09-05 09:09:27 +02:00
Julien Fontanet
07cd06c245 feat(xo-server/rest-api): expose PIFs and VM controllers 2024-09-05 08:47:20 +02:00
Julien Fontanet
813ca246c4 feat(xo-web/pool/networks): searchable VLANs
See zammad#28710
2024-09-05 08:42:09 +02:00
Julien Fontanet
3b217ea975 feat(xo-web/pool/networks): sortable VLANs
See zammad#28710
2024-09-05 08:41:56 +02:00
Julien Fontanet
2151450584 chore(xo-web/pool/networks): inject default PIF directly into networks 2024-09-04 17:19:13 +02:00
Julien Fontanet
7cebe46e86 fix(log): revert incorrect change
Introduced by 974668587
2024-09-02 17:26:40 +02:00
Julien Fontanet
89b9a1f4b7 fix: revert to rimraf@5 to keep Node 18 support 2024-09-02 17:19:06 +02:00
Julien Fontanet
974668587d chore: update dev deps 2024-09-02 17:08:05 +02:00
Julien Fontanet
dfe6911aba chore: update dev deps 2024-09-02 13:49:50 +02:00
Mathieu
f1780b7b0f feat: release 5.98.0 (#7952) 2024-08-30 14:41:47 +02:00
Julien Fontanet
20c88b4e90 feat(xo-server-backup-reports): 1.4.1 2024-08-30 11:21:21 +02:00
b-Nollet
aa9c49ce6a fix(xo-server-backup-report): replacing partial symlinks by shared partials
Symlinks are not packed by npm which led to a broken package.
2024-08-30 11:19:22 +02:00
Julien Fontanet
951de95e4b chore(xo-server-backup-reports): shared partials 2024-08-30 11:19:22 +02:00
Mathieu
385b6b2fee feat: technical release (#7951) 2024-08-30 11:13:49 +02:00
mathieuRA
a976a5a3b3 fix(xo-server/rest-api/dashboard): catch error if getSchedule throw 2024-08-30 10:24:32 +02:00
mathieuRA
e8b32fef81 fix(xo-server/rest-api/dashboard): remoteInfo can be undefined 2024-08-30 10:24:32 +02:00
Julien Fontanet
edb021e40e fix(xo-server): fix mirror backup filter schema
Introduced by 259beead8
2024-08-29 17:40:07 +02:00
Mathieu
ae2e9e1a58 feat: technical release (#7948) 2024-08-29 17:33:01 +02:00
Florent BEAUCHAMP
83a8f295c7 fix(xo-server/migration): don't loop if VM failed to migrate with CBT enabled (#7940)
bug not reproducted on our lab
apply the same patch as commit d2a897c3b88d478a04fef0fb75b809cacc80b97a

The disk attached to dom0 is a xapi internal process, this commit ensure
it is not taken into account when choosing a stratrgey to disable CBT

this commit also ensure the process is not stuck in infinite loop if the
xapi fail to disable CBT
2024-08-29 16:54:28 +02:00
MlssFrncJrg
bddfb21e2d fix(xo-web/disks): error not displayed when toggling CBT (#7947)
Fixes https://kanban.vates.fr/b/jnfjuip4eBARBNuv9/xo-releases/YbkpWEJPpQgz7GTsx
2024-08-29 16:36:30 +02:00
Mathieu
cf7dbd1c36 fix(xo-server/rest-api/dashboard): exclude disabled and S3 from backupRepositoriesSize (#7945)
introduced by 4dfd77b
2024-08-29 16:29:01 +02:00
Florent BEAUCHAMP
204cb25d2b feat(backups): replication failing with snapshot attached to dom0 (#7920)
disks could still be attached to dom0 after the transfers given the caches and the asynchronous nature of the operation.

This PR ensure the cache are fully up to date before running the destroy code and also will let the XAPI handle the disk attached to dom0, as it was before the refactoring
2024-08-29 15:53:07 +02:00
Mathieu
5656ab1d48 feat(xo-web/mirror): add the possibility to select vm backups (#7941)
* feat(xo-web/mirror): add the UI to select vm backups to transfer

following 259beead81
2024-08-29 15:48:32 +02:00
b-Nollet
99ffefae10 feat(xo-web,xo-server-backup-reports): smaller backup reports option 2024-08-29 15:20:31 +02:00
b-Nollet
a78e1346f6 feat(xo-server-backup-reports): adding compact templates for Slack and XMPP 2024-08-29 15:20:31 +02:00
MlssFrncJrg
0d5f86620d fix(xo-server-perf-alert): CPU usage alert email displays NaN (#7925) 2024-08-29 15:01:40 +02:00
Florent Beauchamp
18bea75d28 refactor(backup/mirror): compute filter predicate only once 2024-08-29 14:53:43 +02:00
Florent Beauchamp
5e6bb22025 feat(backup/mirror): better full backup filtering
If the user defined a filter and the filter only match part of the full
backups, then we'll only transfer the matched backups

If the user is using incremental backup, then we'll trnsfer the full chain
if at least only one match
2024-08-29 14:53:43 +02:00
Florent Beauchamp
091da7b913 fix(backups): mirror from multiple jobs
the algorithm sorting the backup to transfer do not take into account multiple
job writing to the same remote
It can lead to additional VM being transferred
2024-08-29 14:53:43 +02:00
Florent Beauchamp
ec3fe212e1 feat: gives more information to the user 2024-08-29 14:53:43 +02:00
Florent Beauchamp
259beead81 feat(backups/mirror): filter backup to be transfered 2024-08-29 14:53:43 +02:00
Mathieu
b1ce62f23a feat(xo-server-perf-alert): add a toggle to exclude items (#7911) 2024-08-29 14:42:37 +02:00
OlivierFL
cd25873182 fix(xo-core/StackedBar): division by 0 in some cases (#7944)
Introduced by 14da422
2024-08-29 10:49:06 +02:00
OlivierFL
a7165da4a0 fix(xo-core/CardNumbers): division by 0 in some cases (#7946)
Introduced by dc7fd78
2024-08-29 10:43:11 +02:00
Julien Fontanet
95f0ef504d feat(xo-web): show copiable when activating OTP
Requested by an IRC user to make it easier to use with Bitwarden.
2024-08-29 09:25:29 +02:00
MlssFrncJrg
732cab3ac0 fix(xo-web/vm/general): fix 'an error as occured' (#7928) 2024-08-28 18:58:18 +02:00
MlssFrncJrg
fb01d20c2e fix(xo-web/new/sr): fix an error as occured when host is missing (#7931) 2024-08-28 18:42:24 +02:00
Julien Fontanet
034d4faa6a feat: release 5.95.2 2024-08-28 15:45:03 +02:00
Mathieu
beb93cf66f feat: technical release (#7943) 2024-08-28 15:03:36 +02:00
Florent BEAUCHAMP
ad1bf3b348 fix(xo-server/v2v): use the template method for static_memory_min (#7923) 2024-08-28 14:33:14 +02:00
OlivierFL
43c3a82800 fix(CHANGELOG.unreleased): add missing entries (#7942) 2024-08-28 14:05:15 +02:00
OlivierFL
7fc5b850ca feat(xo-6/tree-view): display running VMs count (#7873) 2024-08-28 12:11:58 +02:00
Julien Fontanet
916c15d8c7 chore(xo-server-backup-reports): unify templates compilation (#7939)
It will make adding new templates easier.

Co-authored-by: b-Nollet <bastien.nollet@vates.tech>
2024-08-27 15:28:59 +02:00
MlssFrncJrg
4b47bf9220 feat(xo-web/home): sort VMs by install time (#7910)
Fixes #7902
2024-08-27 15:11:19 +02:00
Julien Fontanet
877fe9a663 fix(CHANGELOG.unreleased): add missing entries
Introduced by 8eae8e7f4
2024-08-27 14:56:14 +02:00
OlivierFL
88c7c8d3ae feat(xo-core): add BackupItem component (#7934) 2024-08-26 14:52:31 +02:00
OlivierFL
23720dd05f feat(xo-core/ButtonIcon): add prop to change the click target size (#7922) 2024-08-26 13:57:43 +02:00
OlivierFL
d796e37df5 feat(xo-core): update SearchBar component's name -> QuerySearchBar (#7933) 2024-08-26 11:10:32 +02:00
Mathieu
9734410833 feat(xo-server/rest-api/dashboard): add backup issues information (#7919) 2024-08-26 10:39:11 +02:00
OlivierFL
aa7ff37b94 feat(xo-6/vm): use HeadBar component instead of custom integration (#7858) 2024-08-26 10:33:49 +02:00
OlivierFL
0eaa6a93a3 feat(xo-6/dashboard): add patches data (#7930) 2024-08-26 10:22:09 +02:00
OlivierFL
b33a84e5c7 feat(xo-6/dashboard): add backups jobs data (#7929) 2024-08-26 10:08:39 +02:00
OlivierFL
e65c5d02f3 feat(xo-6/dashboard): add storage repository data (#7927) 2024-08-26 09:00:12 +02:00
OlivierFL
dc7fd78b4a feat(xo-6/dashboard): add backup repository data (#7926) 2024-08-26 08:46:24 +02:00
Julien Fontanet
8eae8e7f46 fix(xapi/VDI_exportContent): return stream in raw mode
Introduced by 7b256ab8e

See zammad#27167
2024-08-23 10:49:25 +02:00
Julien Fontanet
da84ab1590 feat(xo-server/vif.set): returns VIF id because it might change
Fixes https://team.vates.fr/vates/pl/j1cxbejxkfdwud1qw8qwgog8oa
2024-08-22 10:40:39 +02:00
Thierry Goettelmann
290b5df27c feat(web-core): new useRouteQuery composable (#7906) 2024-08-20 17:52:58 +02:00
b-Nollet
72592a54d2 fix(backups): correctly update allowed_operations - temporary fix (#7924)
Fixes https://xcp-ng.org/forum/post/81327

`allowed_operations` are currently not updated correctly when `blocked_operations` are modified, which causes backup jobs to remove `migrate_send` and `pool_migrate` from VM's `allowed_operations`. This commit fixes that, until `allowed_operations` updates correctly again.
2024-08-20 11:11:48 +02:00
Mathieu
e5c53dfa52 feat(xo-server/rest-api/dashboard): add backupJobs info (#7908) 2024-08-19 11:20:24 +02:00
Mathieu
9d196c4211 feat(xo-server/rest-api/dashboard): add alarms info (#7914) 2024-08-19 11:06:03 +02:00
Thierry Goettelmann
e15f2a1428 feat(web-core): replace no-use-before-define ESLint rule with its TS-compliant version (#7916) 2024-08-16 16:07:55 +02:00
Thierry Goettelmann
f78a140fbb feat(web): new REST API and XO objects configuration system (#7918)
Major revamp of the REST API configuration to get a single source of truth + stronger typing + support for single objects.
2024-08-16 15:03:49 +02:00
MlssFrncJrg
79ce97b3fd fix(xo-web/import): properly filter selectors with selected pool (#7905) 2024-08-14 17:23:51 +02:00
OlivierFL
1e7d02603b fix(xo-6): rollup error when building with npm (#7891)
Add `overrides` section in XO6 `package.json` to fix
`Error: Cannot find module @rollup/rollup-linux-x64-gnu` rollup error when
building with npm.
2024-08-14 11:52:53 +02:00
MlssFrncJrg
59bf23a41a feat(xo-web/sr/disks): duplicate CBT state to storage view (#7888)
Fixes #7786
2024-08-14 11:28:09 +02:00
Thierry Goettelmann
39e34eede7 feat(web-core): add Branded TS utility type (#7917) 2024-08-14 10:02:08 +02:00
Julien Fontanet
32228e8c6a fix(xo-web/Home/VM): sort by start time move halted VMs at the end
Fixes https://team.vates.fr/vates/pl/kyxx4qgq5fn58fs7odia7zca8w
2024-08-13 11:45:47 +02:00
Julien Fontanet
7163002c51 feat(xo-web/Home): sortByFn to use a function instead of a property 2024-08-13 11:43:51 +02:00
OlivierFL
700149dabe chore(xo-core): update NoVnc typescript type (#7900)
Use type definitions from DefinitelyTyped instead of using custom declaration
2024-08-09 15:56:44 +02:00
OlivierFL
06af045dac fix(xo-core): wrong CSS lang in StackedBarWithLegend component (#7907) 2024-08-09 15:26:37 +02:00
OlivierFL
b6ccb72e43 chore(web stack): add ESLint rule to check style and script tags "lang" attribute (#7898) 2024-08-09 14:44:56 +02:00
Paloma
14da422b8b feat(xo-web): add stacked bar with legend component (#7819) 2024-08-09 14:38:46 +02:00
Mathieu
5dd305228b feat(xo-server/rest-api/dashboard): add storage repositories info (#7904)
Add storage repository info in the dashboard endpoint for the XO6 dashboard
replications and other data will be calculated in another PR as there is no trivial way to do it

```ts
{
 // ...
  "storageRepositories": {
    "size": {
      "available": number,
      "other": 0,
      "replicated": 0,
      "total": number,
      "used": number
    }
  }
}
 ```
2024-08-08 15:44:12 +02:00
Julien Fontanet
e75cccf1be feat(web-core/stores/ui): default theme is now _auto_
Introduced by 7f4f86073
2024-08-08 13:47:52 +02:00
Julien Fontanet
0e6bc063db fix(xo-server/isHyperThreadingEnabled): better XCP-ng>=8.3 support 2024-08-07 16:02:12 +02:00
Julien Fontanet
0291d42af7 fix(xo-web/home/sr): fix shared sort
It was not working at all because current system only accepts strings for `sortBy` property.
2024-08-07 15:00:40 +02:00
Julien Fontanet
656786eb86 fix(proxy/authentication): keep token synced with config 2024-08-07 14:56:10 +02:00
Mathieu
4dfd77b2d2 feat(xo-server/rest-api/dashboard): add backup repositories info (#7882) 2024-08-06 17:51:20 +02:00
Mathieu
895a551c7b fix(xo-server/rest-api/dashboard): ignore EOL hosts if getHVSupportedVersions unavailable (#7901)
Introduced by ddfdce9
2024-08-06 16:51:58 +02:00
Pierre Donias
e750a66c02 fix(xo-web/self): remove unit in CPU usage total count (#7894)
Introduced by #7353
2024-08-06 09:33:40 +02:00
Julien Fontanet
4d768252f0 feat(@vates/json-hash): 0.2.0 2024-08-05 17:56:58 +02:00
Dan Pollak
f0f5cdba72 fix(docs,xo-web): trials are now 30 days (#7896) 2024-08-05 17:38:55 +02:00
Julien Fontanet
8cc3d0cbaf feat(json-hash): use base64url instead of base64 2024-08-05 17:12:09 +02:00
Julien Fontanet
3284021964 fix(json-hash): strict mode and Node version
Introduced by 14325fe99
2024-08-05 14:43:28 +02:00
Julien Fontanet
e333332131 feat(@vates/json-hash): 0.1.0 2024-08-05 14:38:36 +02:00
Julien Fontanet
14325fe992 feat(json-hash): extract into own package 2024-08-05 14:37:33 +02:00
Mathieu
ddfdce9da5 feat(rest-api): add number of EOL hosts in the dashboard endpoint (#7895) 2024-08-05 10:14:01 +02:00
Dan Pollak
a2c62117a1 fix(xo-server,xo-web): optionnal → optional (#7897)
Signed-off-by: Dan Pollak <danpollak2@gmail.com>
2024-08-05 08:12:02 +02:00
Olivier Lambert
cb6cfc3a74 docs(airgap): improve the air gap doc and add our fully offline XOA s… (#7863)
docs(airgap): improve the air gap doc and add our fully offline XOA solution

Signed-off-by: Olivier Lambert <olivier.lambert@vates.fr>
2024-08-01 09:17:48 +02:00
Mathieu
9d61e0232d feat(xo-web): create a backup job schedule selector (#7804)
New UI component `SelectSchedule` that will be used for chaining backup jobs.
2024-07-31 17:31:42 +02:00
b-Nollet
fedab820f1 chore(xo-lite): updating package.json (#7892)
Introduced by #7890
2024-07-31 15:54:15 +02:00
OlivierFL
7eac1d1c5a fix(xo-6/css): wrong lang in components style tags (#7880)
The wrong CSS lang (`scss` instead of `postcss`) was used in some components.
2024-07-31 14:24:57 +02:00
b-Nollet
06a9ab6718 feat(lite): 0.2.7 (#7890) 2024-07-31 12:24:17 +02:00
b-Nollet
d0bd6562d0 feat: release 5.97.0 (#7889) 2024-07-31 11:21:44 +02:00
b-Nollet
7b60fab7ea feat: technical release (#7887) 2024-07-31 10:12:03 +02:00
Pierre Donias
045cae24fb fix(xo-web/VM/Stats): do not show guest tools warning when VM is offline (#7883)
Introduced by #7831
2024-07-31 09:51:41 +02:00
Olivier Lambert
bd7e82cb6b docs(supported hosts): update to add support on XS 8 and XCP-ng 8.3 (#7885) 2024-07-31 09:13:52 +02:00
b-Nollet
307179b142 feat: technical release (#7879) 2024-07-30 16:10:41 +02:00
b-Nollet
0a3c32f9d2 feat(backups): add reportWhen 'skipped and failure' (#7869)
Replace the "don't send reports for skipped backups" toggle by an option in "Report when"
2024-07-30 15:01:25 +02:00
OlivierFL
124d96f31a fix(xo-6): add comments in host and pool pages to fix Vite build (#7878)
The components `/host/[id]/index.vue` and `pool/[id]/index.vue` only use
`definePage()` macro.
The macro is removed during the build, leaving an empty script tag that causes
the build to fail.
This PR addresses this issue by adding a comment in the components to avoid
empty content in `<script>` tags at build time.
2024-07-30 14:57:27 +02:00
Pierre Donias
916418b6cf feat(lite): local XO Lite will try to load app from lite.xen-orchestra.com first (#7870) 2024-07-30 11:13:05 +02:00
MlssFrncJrg
7592734c9a feat(xo-web/VM/Stats): warning when guest tools are not installed (#7831)
Memory usage is not collected without guest tools. That means that the stats
graph shown in the VM page is pointless.
2024-07-30 10:20:41 +02:00
b-Nollet
b1088e2a5b fix(xo-web/backup): replace reportWhen raw value with message (#7876)
Replace `reportWhen`'s raw value by a message (e.g. *never* is replaced by the
`reportWhenNever` message, which is *Never*)
2024-07-30 09:49:53 +02:00
Mathieu
83715bedc6 fix(xo-web/VM/new): use new secureboot API (#7874)
Fixes #7500
2024-07-29 17:48:41 +02:00
Mathieu
e30f289073 feat(xo-server/xo-web/host): display 2CRSi informations in general tab (#7838) 2024-07-29 17:33:32 +02:00
OlivierFL
0977542dbd fix(web-core/novnc): add custom declaration file to fix type-check error (#7875)
See #7824
See 287f38cfd2/types/novnc-core
See https://github.com/DefinitelyTyped/DefinitelyTyped/pull/70022

The types definitions in DefinitelyTyped/NoVnc are outdated and don’t reflect
the changes made in the NoVnc package.
This causes an error when running `yarn type-check`.

While waiting for https://github.com/DefinitelyTyped/DefinitelyTyped/pull/70022
to be merged, a temporary workaround is to add a custom `novnc.d.ts` (moved from
`lite/src/types/novnc.d.ts`) declaration file in `web-core` to fix the
`type-check` error.
2024-07-29 16:49:37 +02:00
MlssFrncJrg
c9699c8f02 feat(xo-web/VM): display accurate Secure Boot status (#7751) 2024-07-29 14:12:27 +02:00
Thierry Goettelmann
636c88539f feat(web-core): new useItemCounter composable (#7868) 2024-07-26 13:51:01 +02:00
Paloma
333012bd29 feat(xo-web): add host status to xo6 dashboard (#7799) 2024-07-26 11:09:15 +02:00
OlivierFL
8fd516040b feat(xo-6/host): add VMs table list view (#7851) 2024-07-26 10:49:45 +02:00
Paloma
2017ec26ad feat(xo-web): add vms status for xo6 dashboard (#7795) 2024-07-26 10:33:39 +02:00
Thierry Goettelmann
72d6da38c5 feat(web-core): update heroes + add stories (#7866)
- `StateHero`, `LoadingHero` and `ComingSoonHero` can now be used inside a card by passing `type="card"` or inside a page by passing `type="page"`
- `LoadingHero` has now a `disabled?: boolean` prop and can now take a slot which will be displayed when `disabled` is `true`
- Added stories for `StateHero`, `ComingSoonHero`, `ObjectNotFoundHero` and `LoadingHero`
2024-07-26 10:01:20 +02:00
Paloma
59784315a8 feat(xo-core): add donut with legends ui component (#7829) 2024-07-26 09:00:29 +02:00
Mathieu
c5f6bf574f fix(xo-web/SR): remove newSrExistingSr modal for NFS SR (#7865)
Introduced by 659c735
See https://xcp-ng.org/forum/topic/9425
2024-07-25 17:45:50 +02:00
Jonas
991b4641ae docs(installation): add systemd service (#7848) 2024-07-25 15:53:07 +02:00
b-Nollet
0fee31b345 feat: technical release (#7864) 2024-07-25 15:35:03 +02:00
ventra007
d58ee9611f docs(backups): grammar fixes in the Concurrency section (#7859) 2024-07-25 15:08:27 +02:00
Julien Fontanet
da9d796d3f Revert "fix(xo-web/host/advanced): fix netdata link"
This reverts commit b393d72eb9.
2024-07-25 14:31:15 +02:00
Pierre Donias
e4c66bc0e8 fix(CHANGELOG): missing package to release (#7862)
Introduced by #7776
2024-07-25 14:09:29 +02:00
mathieu
d61429852d fix(xo-server-backup-reports/metadata): fix task.tasks is not iterable 2024-07-25 13:59:27 +02:00
Pizzosaure
a06e78c77c feat(xo-web/backup): add 'report recipients' when creating a metadata backup 2024-07-25 13:59:27 +02:00
Julien Fontanet
e66bdda6a1 feat(mixins/Tasks): buffer task events (#7841)
Fixes zammad#26718
Fixes zammad#26778
Fixes zammad#26865
Fixes zammad#26885
Fixes zammad#26980
Fixes zammad#27205
Fixes https://xcp-ng.org/forum/post/79281
Fixes https://xcp-ng.org/forum/post/80010
2024-07-25 12:41:41 +02:00
Mathieu
659c735b70 feat(xo-web/SR): add confirmation modal before SR creation (#7845) 2024-07-25 11:25:06 +02:00
OlivierFL
35c6248251 feat(xo-6/tree-view): improve indentation of empty items (#7861) 2024-07-25 10:46:03 +02:00
Thierry Goettelmann
4344e1567c fix(web-6/tree-view): issue with item without children (#7860)
- Remove the responsibility to exclude branches with no children from `branch.ts`
- `PoolTreeItem` and `HostTreeItem` no longer create a sublist if they have no children
2024-07-25 09:59:25 +02:00
Florent Beauchamp
2291505865 test(nbd-client): testing half succeeding multi nbd 2024-07-24 17:23:47 +02:00
Florent Beauchamp
92acd16779 feat(backups): improve error message when CBT backups aren't possible 2024-07-24 17:23:47 +02:00
Florent Beauchamp
3c5307cd64 feat(nbd-client): filter out unreachable hosts 2024-07-24 17:23:47 +02:00
Florent Beauchamp
f55ffc7d06 fix(backups): NBD backups must respect default backup network 2024-07-24 17:23:47 +02:00
Florent Beauchamp
6c118e6af5 fix(backups): incorrect assert check 2024-07-24 16:50:57 +02:00
Florent Beauchamp
d0984a7cb4 fix(backups): remove snapshot data only after the transfer is finished
* _removeUnusedSnapshots is called before and after the backup
* in some case it can delete the snapshot data before the transfer is done
2024-07-24 16:50:57 +02:00
Florent BEAUCHAMP
76336fa422 fix(xo-server): VHD is a disposable (#7856)
Introduced by 24d584e905
2024-07-24 16:44:14 +02:00
Julien Fontanet
2a9f5bcf53 fix(CHANGELOG.unreleased): add missing xen-api
Introduced by 79690fcdf
2024-07-24 16:39:31 +02:00
Julien Fontanet
9d3ec46086 feat(xo-server/self service): admins alway bypass quotas (#7855)
Fixes Zammad#27050
Fixes https://team.vates.fr/vates/pl/jb5xsh3bijf17fjokq3uczg4bo
2024-07-24 16:21:33 +02:00
Julien Fontanet
79690fcdfa feat(xen-api): cache support for call & callAsync (#7853)
* cache support for call & callAsync
* composite key is based on hashed JSON of function call arguments
2024-07-24 15:56:53 +02:00
b-Nollet
23e42c1764 feat: technical release (#7857) 2024-07-24 15:05:17 +02:00
Julien Fontanet
4b8f7146f6 feat: use new deploy page URL 2024-07-24 10:48:16 +02:00
Julien Fontanet
8172a327e4 fix(xo-web/HomeTags): strict tag filtering
Fixes https://team.vates.fr/vates/pl/776boet4qty55jkt4srabaz4hc

Exact match and respect letter case.
2024-07-23 22:28:41 +02:00
Pierre Donias
919d215b64 fix(xo-web/VM): properly identify self user to hide unauthorized actions (#7854) 2024-07-23 17:07:07 +02:00
b-Nollet
161169f295 feat(backups): option to not send reports for skipped runs (#7832) 2024-07-23 14:45:11 +02:00
b-Nollet
e91b7f8571 feat(xo-server-backup-reports): include info (#7815)
Show info of backup tasks in MJML template, for example show when NBD is used.

Currently it only displays a the message associated with the info, not its data (unlike e44933e2f7/packages/xo-web/src/xo-app/logs/backup-ng/log-alert-body.js (L131-L159)). It would be possible to display the info data, but it would probably not be done in a clean way in the current template (and I'm not sure it would be that useful).

From https://xcp-ng.org/forum/post/79833
2024-07-23 12:06:22 +02:00
OlivierFL
60291e317c feat(xo-6/pool): add hosts and VMs table list views (#7842) 2024-07-22 17:46:45 +02:00
OlivierFL
c704f156fc fix(xo-6/xo-lite): tree-view vertical line display (#7847)
Introduced by fe1f5cb

The `TreeItemLabel` component `expanded` property wasn’t handled correctly when displaying the last item of a sublist.
2024-07-22 17:42:41 +02:00
Thierry Goettelmann
9a811d7f1e feat(web-stack): upgrade Vue Router to 4.4 (#7850)
- Upgrade `vue-router` to `4.4` and `unplugin-vue-router` to `0.10`
- Disable `no-undef` ESLint rule since it's already handled by TypeScript ESLint
2024-07-22 17:01:04 +02:00
OlivierFL
a97d55c53c feat(xo-stack): add text-ellipsis utility class (#7843) 2024-07-22 16:31:44 +02:00
Julien Fontanet
8542b83f7c fix(xen-api/cli): use @xen-orchestra/log
Follows 0702454fa
2024-07-22 15:12:47 +02:00
Pierre Donias
73755c0e8c feat(lite/XoaButton): support xo-server's setting http.publicUrl (#7849)
See https://xcp-ng.org/forum/topic/9392

`xo-server` has a config setting `http.publicUrl` that allows the user to force
XO to report a custom URL in the pool's other_config (along with the
`networkInterfaces` fallback). With this change, the "Access XOA" button in
XO Lite will open that URL if it exists and fallback to `networkInterfaces`
otherwise.
2024-07-22 11:10:34 +02:00
Julien Fontanet
0702454fa8 feat(xen-api): use @xen-orchestra/log 2024-07-19 16:05:16 +02:00
Jonas
a0c3920d00 docs(users): SAML instructions for use with Google Workspace (#7846)
This shows a working example of how to connect XO SAML-plugin with Google Workspace SAML.

It's a rough example, with simple screenshots. And I've mentioned the caveat that a successfull authentication points the user to the login screen. Needing to browse into the bare URL, for access into the dahsboard. But at least it works!
2024-07-19 09:55:59 +02:00
Florent BEAUCHAMP
d4637e3335 fix(vmware-explorer): handling disks without storage (#7840)
Some VM may have disks without any storage declared. Since we
didn't find the cause, this PR ensure we don't break the VM listing.

Fixes zammad#26677
2024-07-18 16:35:06 +02:00
Jonas
6fcb838b70 feat(xo-web/i18n): add Swedish translation (#7844) 2024-07-18 10:17:30 +02:00
Julien Fontanet
065c44cc92 feat(xapi/parseDateTime): support timezones
Fixes https://team.vates.fr/vates/pl/ifht7eyhiffhtyxwywxsqwonma

`host.get_server_localtime` will include timezones in the near future.
2024-07-17 11:45:42 +02:00
Mathieu
b539b5f5e3 fix(xo-web/VM/Advanced): fix 'not enough permission' error for super admins when attaching PCIs (#7793) 2024-07-16 17:11:50 +02:00
Thierry Goettelmann
d1ce35f20a feat(web): add task store + tasks quick view (#7813) 2024-07-16 16:45:08 +02:00
Thierry Goettelmann
3f754fdc05 feat(web-core): tasks quick view (#7812) 2024-07-16 16:41:27 +02:00
Thierry Goettelmann
57d2d301ae feat(web): add polling option to xo store config builder (#7809)
This is a temporary solution. A better implementation will follow.
2024-07-16 11:12:51 +02:00
OlivierFL
d2507025a9 feat(xo-core): add HeadBar component (#7806) 2024-07-16 10:43:45 +02:00
OlivierFL
de934ec609 feat(xo-core): add CellText component (#7801) 2024-07-15 16:24:12 +02:00
OlivierFL
6894841038 feat(xo-core): add CellObject component (#7798) 2024-07-15 16:05:27 +02:00
John P. Cooper
c5e4f05d3b feat(xo-6): Initial PWA manifest for Xen Orchestra 6 (#7445)
* Update index.html

Rebased on latest commits.

* Create manifest.webmanifest

The initial PWA web manifest but rebased for latest commits.

* Update CHANGELOG.unreleased.md

Rebased on the latest commits as the conflicts were too major.

* Update CHANGELOG.unreleased.md

* Update CHANGELOG.unreleased.md

* Make URLs relative and remove changelog entry

---------

Co-authored-by: Pierre Donias <pierre.donias@gmail.com>
2024-07-15 15:28:33 +02:00
OlivierFL
dad3dc5926 feat(xo-core): add ObjectLink component (#7794) 2024-07-15 15:24:24 +02:00
Thierry Goettelmann
3fe46cae64 feat(web): fix dev token (#7779) 2024-07-15 14:58:41 +02:00
OlivierFL
14c5d2c4ec feat(xo-core): add SearchBar component (#7726) 2024-07-15 14:57:23 +02:00
Mathieu
4a4122b9a6 feat(xo-server/xo-web/VM_coalesceLeaf): implement Coalesce Leaf (#7810) 2024-07-15 11:26:34 +02:00
Dan Pollak
acffdbec8f fix(xo-server/rest-api): add dashboard endpoint to index (#7835)
Signed-off-by: Dan Pollak <danpollak2@gmail.com>
2024-07-15 11:11:28 +02:00
OlivierFL
f9220cd272 fix(xo-core/eslint/i18n): add "fa" to the list of excluded locales for missing keys checks (#7833)
Introduced by 28f94b3

Fix ESLint errors for missing `fa` locale translation keys.
2024-07-12 14:33:53 +02:00
Julien Fontanet
518b0f77bd fix(eslint): restrict require-atomic-updates to limit number of warnings 2024-07-12 12:07:40 +02:00
Mathieu
b35a5cffa6 feat(xo-server/rest-api): implement dashboard endpoint (#7823) 2024-07-11 10:30:49 +02:00
OlivierFL
bb88834fcd fix(xo-core/xo-lite): update NoVncClient import (#7824)
Introduced by e44933e

b35cf6dd12 has resulted in a change to the import path of `NoVncClient` in `web-core` and `XO Lite` console components.
2024-07-10 15:16:42 +02:00
Julien Fontanet
e492be3a67 feat(CHANGELOG.unreleased): add Security section for future releases
Related to zammad#26875
2024-07-09 18:00:27 +02:00
Julien Fontanet
a223207ff3 docs(configuration/redis): replace incorrect info
Fixes zammad#26893
2024-07-09 17:26:06 +02:00
OlivierFL
4d42f86b2c fix(xo-6/header): make XO5 link work (#7719) 2024-07-09 14:56:43 +02:00
Julien Fontanet
da3aa59781 docs(xoa): extraneous → secondary 2024-07-09 13:22:43 +02:00
Julien Fontanet
2b46e6cf30 docs(xoa): extraneous IP addresses 2024-07-09 13:12:13 +02:00
Julien Fontanet
9406d20672 docs(xoa): show CIDR syntax for xoa network static 2024-07-09 13:12:13 +02:00
Pierre Donias
0e6d3ae27a chore(xo-web/i18n): update russian locale 2024-07-09 11:01:53 +02:00
a.anushko@spbu.ru
ee3bc185da fix(xo-web/i18n/ru): fix typos, remove wrong translations, add translations 2024-07-09 11:01:53 +02:00
Jokar-xen
28f94b3888 feat(xo-web,web-core,lite/i18n): add Persian (#7775) 2024-07-09 10:27:57 +02:00
Julien Fontanet
e44933e2f7 chore: update dev deps 2024-07-08 14:41:20 +02:00
MlssFrncJrg
30dd89243f feat(XO6): create link reusable helper (#7681)
Add helper to handle external links
2024-07-08 11:25:02 +02:00
Julien Fontanet
96b7673e27 feat: release 5.96.0 2024-07-05 17:28:52 +02:00
Julien Fontanet
69a312a0c4 feat(xo-server): 5.148.2 2024-07-05 16:57:19 +02:00
Julien Fontanet
a0e6c8b115 feat(@xen-orchestra/proxy): 0.28.8 2024-07-05 16:57:14 +02:00
Julien Fontanet
dc047d47ea feat(@xen-orchestra/xapi): 7.1.1 2024-07-05 16:56:55 +02:00
Julien Fontanet
a00b24f6b8 fix(xapi/VM_snapshot): destroy snapshot VDIs instead of original ones
Fixes https://xcp-ng.org/forum/post/79769

This code, only used for running VMs, triggered `VDI_IN_USE` errors and left the
created VM snapshot with all the VDIs.
2024-07-05 16:44:58 +02:00
Julien Fontanet
7601dee7f2 fix(xapi/VM_snapshot): log original error when failing to destroy a ignored VDI 2024-07-05 16:41:42 +02:00
Julien Fontanet
1ace3cbbe8 feat(@xen-orchestra/proxy): 0.28.7 2024-07-05 11:16:32 +02:00
Julien Fontanet
8651e61210 feat(xo-server): 5.148.1 2024-07-05 10:46:58 +02:00
Julien Fontanet
6c6b6b9fa1 feat(@xen-orchestra/backups): 0.52.1 2024-07-05 10:46:49 +02:00
Julien Fontanet
6374e0d3f5 feat(@xen-orchestra/xapi): 7.1.0 2024-07-05 10:38:02 +02:00
Julien Fontanet
664d4b1af6 feat(backups/worker): forced exit after 30s 2024-07-05 10:32:08 +02:00
Julien Fontanet
0117e9dbc8 chore(mixins/Tasks): don't duplicate log deletion logic 2024-07-04 17:44:39 +02:00
Julien Fontanet
174e32173f fix(xo-server/sr.getAllUnhealthyVdiChainsLength): lodash.throttle instead of debounceWithKey
`debounceWithKey` should not be used because the API method will always be called with a different
empty object as param which will render the cache useless.

Fortunately `lodash.throttle` can be used here as `sr.getAllUnhealthyVdiChainsLength` is synchronous
and has no meaningful parameter.
2024-07-04 17:43:07 +02:00
Mathieu
0e4a300058 feat: technical release (#7808) 2024-07-04 16:42:52 +02:00
Florent Beauchamp
76b54ec579 feat(backups): expose setting to purge snapshot data
* when using CBT backup, no rolling snapshot and NBD
* this will delete the snapshot data , thus limiting the pressure on the SR
* snapshot won't be listed in the UI
* snapshot won't be usable to revert a VM
2024-07-04 16:24:25 +02:00
Florent BEAUCHAMP
7b256ab8ee feat(backups): enable Change Block Tracking Backups (#7750)
Enable CBT for all backups

* enable cbt each time a VM should be backuped by nbd
* if there are no rolling snapshot on a job =>
the snapshots data are only kept during the transfer.
Snapshot data deletion is behing a config flag 'purgeSnapshotData' (default false )

adverse effect:

* rolling back to previous XO version will make full backups
* removed read ahead in nbd , performance gain was low with concurrency
and it make code more complex
2024-07-04 16:24:25 +02:00
Florent Beauchamp
7a2bb5104c fix(backups): Cannot destructure property 'other_config' of 'undefined'
introduced by a85f44d699
2024-07-04 16:24:25 +02:00
Florent Beauchamp
56c881fd2a fix(backups): ensure vhd stream are exactly the right length 2024-07-04 16:24:25 +02:00
Florent Beauchamp
db89485efe fix(backups): fix a off by one error on delta chain length 2024-07-04 16:24:25 +02:00
Julien Fontanet
3c6a7a9575 feat(xo-server/rest-api): expose servers 2024-07-04 15:52:48 +02:00
Julien Fontanet
992d636bcd feat(xo-server/rest-api): expose a VM's VDIs 2024-07-03 15:41:59 +02:00
Mathieu
253aac4eaa feat(xo-web/SR/XOSTOR): add state column to the resource list table (#7784) 2024-06-28 16:25:56 +02:00
Mathieu
ea551a5175 chore(xo-web/SR/XOSTOR): remove unused import (#7785)
Introduced by 1ab62d4
2024-06-28 16:19:47 +02:00
OlivierFL
fe1f5cbad7 feat(xo-6/tree-view): add simple search (#7780) 2024-06-28 15:05:56 +02:00
OlivierFL
ce4c2e17af feat(xo-core): add UiInput component (#7724) 2024-06-28 14:52:29 +02:00
Mathieu
e5608680ec feat: technical release (#7787) 2024-06-28 09:49:00 +02:00
Julien Fontanet
6ee7a274d9 Revert "feat(backups): enable Change Block Tracking Backups (#7750)"
This reverts commit 2db21d3086.
2024-06-27 23:00:22 +02:00
b-Nollet
ffc93250f0 feat(xo-server): add progress to RPU and RPR XO-task (#7768) 2024-06-27 22:01:41 +02:00
b-Nollet
52b27ae884 fix(backups): fix delete first on incremental replication (#7739) 2024-06-27 21:39:20 +02:00
b-Nollet
f5cee45c02 feat(backup-reports): mjml template (#7747) 2024-06-27 21:36:59 +02:00
Julien Fontanet
818a5b7f5b fix(xapi/VM_snapshot): sets ignoreVbds to undefined
Introduced by 37a0d9da7

Fixes https://xcp-ng.org/forum/post/79317
2024-06-27 18:23:40 +02:00
Julien Fontanet
19a2f4e002 fix(xapi/VDI_export): destroy NBD task after export
Introduced by 2db21d308

Fixes https://xcp-ng.org/forum/post/79129
2024-06-27 18:20:42 +02:00
Mathieu
83920589db fix(xo-server-sdn-controller): install CA certificate on pools after plugin config update (#7755) 2024-06-27 17:25:48 +02:00
MlssFrncJrg
bc1db9960a fix(xo-web): correct link for the pool secure boot setup (#7783) 2024-06-27 16:54:56 +02:00
Julien Fontanet
5bf1aea761 fix(xo-server/test.createTask): various fixes
Initialize progress and correctly update name
2024-06-27 16:20:26 +02:00
Julien Fontanet
dcf6885dfa feat(xo-server): support [NOSNAP] tag on disks
Fixes https://xcp-ng.org/forum/post/79179
2024-06-27 15:37:56 +02:00
Julien Fontanet
37a0d9da7c feat(xapi/VM_snapshot): ignoredNoBakVdis → ignoredVdisTag
This new param is more flexible and permits the use of other tags.
2024-06-27 15:24:19 +02:00
Mathieu
abcbeb8719 feat: technical release (#7781) 2024-06-27 10:01:22 +02:00
Thierry Goettelmann
8db808a415 feat(web-stack): better layout system (#7777)
- `[core]` Created a StateHero component
  - `[core]` Created a `ComingSoonHero` component
  - `[core]` Created a `LoadingHero` component
  - `[core]` Created an `ObjectNotFound` component
- `[core;lite]` Moved `object-not-found` translation from Lite to Core
- `[core]` Updated `CoreLayout` to remove panel-related code
- `[web]` Renamed `DefaultLayout` to `AppLayout`
- `[web]` Wrap `RouterView` with `AppLayout` in `App.vue`
- `[web]` Removed all slots from `App.vue` but `default` one
- `[web]` Created `web/pages/vm/[id].vue` which handle layout around all `/vm/*` pages
2024-06-27 09:22:22 +02:00
Julien Fontanet
9383306231 fix(xo-server/rest-api): remove incorrect comma operator
Introduced by 800655a9a

Fortunately this did not have any impact.
2024-06-26 14:07:54 +02:00
Julien Fontanet
3235963cfb fix(xo-web/host/advanced): use relative path
This is required to avoid breaking reverse proxies with a preppended path.
2024-06-25 16:40:33 +02:00
Julien Fontanet
b393d72eb9 fix(xo-web/host/advanced): fix netdata link
Fixes #7702
2024-06-25 16:14:35 +02:00
Julien Fontanet
cd2942af71 chore(xo-server-netbox): unify unload handling 2024-06-25 09:03:26 +02:00
Julien Fontanet
e92cb66954 chore(xo-server-netbox/configure): use state.loaded 2024-06-25 09:03:26 +02:00
Pierre Donias
dac0b20a19 fix(xo-server-auth-ldap): do not use syntax "key=value" when key is "DN" (#7759)
See Zammad#25659
2024-06-24 17:19:29 +02:00
Julien Fontanet
0fc5d60791 feat(scripts/normalize-packages): licenses default to ISC for @vates/ 2024-06-24 17:12:17 +02:00
Julien Fontanet
2df144d43d feat(scripts/new-pkg): create a new package in the monorepo 2024-06-24 17:12:17 +02:00
Mathieu
758e3c47b8 fix(xo-web/VM/advanced): fix 'firmware not supported' for UEFI (#7767)
Introduced by 68e99a2
See https://xcp-ng.org/forum/topic/8878/uefi-firmware-not-supported
2024-06-24 14:58:23 +02:00
Mathieu
cfcc78b6d8 feat(xo-web/XOSTOR): column that links to SR (#7764) 2024-06-24 14:38:11 +02:00
Julien Fontanet
5f5580925d docs(xen-api): more CLI examples 2024-06-24 11:29:38 +02:00
Mathieu
a667e7cdbd fix(xo-web/XOSTOR): fix approximate SR capacity (#7765)
Introduced by 038d230
2024-06-24 10:53:45 +02:00
b-Nollet
a14c4bbb1c feat(xo-server/rest-api): add rolling pool reboot action (#7761) 2024-06-21 15:46:37 +02:00
Florent BEAUCHAMP
2db21d3086 feat(backups): enable Change Block Tracking Backups (#7750)
Enable CBT for all backups

* enable cbt each time a VM should be backuped by nbd
* if there are no rolling snapshot on a job => the snapshots data are only kept during the transfer. Snapshot data deletion is behing a config flag 'purgeSnapshotData' (default false )

adverse effect:

* rolling back to previous XO version will make full backups
* removed read ahead in nbd , performance gain was low with concurrency and it make code more complex
2024-06-21 11:32:37 +02:00
MlssFrncJrg
6b1036f5ce feat(xo-web): display SCSI id during creation of SR (#7742) 2024-06-21 10:59:31 +02:00
Florent BEAUCHAMP
5cc6b4fe70 feat(xo-web): add CBT to the disk tab (#7732)
show a toggle to enable CBT from the VM disk tab 

---------

Co-authored-by: Mathieu <70369997+MathieuRA@users.noreply.github.com>
2024-06-21 10:36:20 +02:00
Florent BEAUCHAMP
442dd16813 feat(xo-server): disable cbt on vdi/VM/host migration (#7756)
Change Block Tracking (CBT) is blocking VDI migration from one storage to another
The migration errror is computed at the VM level on the xapi, that mean that we need to disable CBT for any disk of the VM that use a VDI
We don't enable CBT after the migration : any client / backup software that need this will need to enable it on demand, and a migration force a full transfer
 host.evacuate don't move the vdi ,it can't generate a VDI_CBT_ENABLED error
2024-06-21 10:23:41 +02:00
Mathieu
6e000af7cb fix(xo-server/XOSTOR): remove callAsync workaround (#7723) 2024-06-21 09:50:17 +02:00
Julien Fontanet
3c13e0ab43 fix(CHANGELOG): move latest badge
Introduced by 7b8a4e720
2024-06-20 17:18:03 +02:00
Julien Fontanet
7b8a4e7209 feat: release 5.95.1 2024-06-20 17:16:26 +02:00
Pierre Donias
c63d2ab00b fix(netbox): force xo-server to use at least http-request-plus@1.0.3 (#7758)
See Zammad#24458

`xo-server-netbox` uses `response.text` which has been added in
http-request-plus@1.0.3. Therefore, the dependency version in `xo-server` needs
to be `^1.0.3` to ensure that `response.text` can be used.
2024-06-20 17:02:20 +02:00
Florent BEAUCHAMP
ba7a29eb5e docs(backups): nbd concurrency and full on migrate (#7741) 2024-06-20 15:36:23 +02:00
Paloma
304b06ca97 feat(xo-core): add card subtitle ui component (#7731) 2024-06-20 15:13:04 +02:00
Julien Fontanet
0661fbae78 feat(xo-server): 5.145.0 2024-06-20 15:08:00 +02:00
Julien Fontanet
16ae1c0d4b fix(lite/stories/card-title): fix imports order
Introduced by 9c29046a8
2024-06-20 14:38:46 +02:00
Paloma
9c29046a88 feat(xo-core): add card title component to web core (#7721) 2024-06-20 11:41:20 +02:00
Julien Fontanet
bb0fd2898e fix(xo-server/rest-api): handle collection without getObject
For instance `/backup/vms` would trigger an *Internal Error*, now it correctly returns 404.
2024-06-20 11:27:14 +02:00
Thierry Goettelmann
276d920cca feat(web-stack): add new i18n guidelines + ESLint + update and fixes (#7753)
- Add new i18n guidelines
- Remove nested keys: `"foo": { "bar": "..." }` ➡️ `"foo.bar": "..."`
  This makes code cleaner (and as a side-effect, it now allows to use `foo` + `foo.bar` keys)
- Lite/6 shared translations are no longer prefixed with `core.`
- Duplicated keys across translation files are no longer accepted.
  This will prevent accidental overwrite of missing common translations
- `fr.json` and `en.json` now required to contains the same keys
- Raw text is no longer accepted in template to prevent forgetting a translation
  Raw text is still accepted in dev-related files (stories, dev pages...)
- Remove useless `alt` on `img`
- Display of percentage now uses `$n(value, 'percent')`
- Removed legacy `lite/src/i18n.ts`
- Add missing translations
- Added visual indicator for missing translations while in dev env: `🌎❗⟨i-am-missing⟩`
2024-06-20 09:35:36 +02:00
Thierry Goettelmann
dd8ad3f274 chore(web stack): add new ESLint Vue rules #6 (#7738)
Enforces import order via the `import/order` ESLint rule
2024-06-20 09:18:15 +02:00
Florent BEAUCHAMP
7ddd579818 fix(backups): EEXIST error when restarting mirror backup (#7694)
feat(backup): remove temporary VHD before backups run

- cleanVm can only delete files when backup job is successful
- an interrupted transfer leave the temp file in place
- the temp file don't change name in a mirror backup since we transfer exactly the same file
- outputStream method use, by default, a flag that create the file if not exists and fail otherwise
    => EEXIST error

- This PR change the behaviour of cleanVM to delete temporary files on the pass before the transfer, thus removing any dot file

---------

Co-authored-by: Julien Fontanet <julien.fontanet@isonoe.net>
2024-06-20 08:24:48 +02:00
Paloma
290f510843 feat(xo-core): add card ui component (#7710)
This component can contain other components and manage their layout.
It can align elements vertically or horizontally.
2024-06-19 11:47:34 +02:00
OlivierFL
c134bbaee3 fix(lite/Dashboard): add missing translations and remove hardcoded values (#7744) 2024-06-18 09:42:27 +02:00
Thierry Goettelmann
e1dd5354a1 chore(web stack): add new ESLint Vue rules #5 (#7736) 2024-06-17 16:56:47 +02:00
Thierry Goettelmann
070258d0e3 chore(web stack): add new ESLint Vue rules #4 (#7734) 2024-06-17 16:48:06 +02:00
Julien Fontanet
f5a49b6da3 fix(xo-server/_xcpUpdate): callAsync result is already parsed
Fixes zammad#26054

Introduced by 08dc33bc9
2024-06-17 10:55:39 +02:00
Florent BEAUCHAMP
a85f44d699 Refactor(backups): move metadata to VDI (#7648)
Preparing for CBT backup that will only keep a part of the VDI snapshot, and remove the VM

* extract most of the other_config operation to a file as constants/methods
* name the constants
* set the relevant metadata values to the vm AND all its attached VDIs
* use the VDI as the base to search and update snapshots/replica/backup
2024-06-17 09:19:46 +02:00
Julien Fontanet
31461118e0 chore: update to turbo@2 2024-06-14 11:43:38 +02:00
Thierry Goettelmann
306a58e412 fix: missing routes in typed-router.d.ts + ignore it from Prettier (#7746) 2024-06-14 10:10:33 +02:00
Julien Fontanet
32448cfa1b feat(task): info, set and warning are now instance methods
Info, properties and warnings should be set on a specific/known task instead of relying on the async context.

For instance, this permits updating the progress of a task from the code on one of its subtasks.
2024-06-13 17:34:34 +02:00
Julien Fontanet
3dde723e31 feat(xo-server/api): no tasks for ignored methods
Follows 33a388193
2024-06-13 16:21:17 +02:00
Julien Fontanet
be5a523b95 feat(xo-server-transport-email): sendEmail() now accepts HTML 2024-06-13 14:56:28 +02:00
Thierry Goettelmann
ad18a860f3 chore(web stack): add new ESLint Vue rules #3 (#7729)
Add `vue/define-macros-order` ESLint rules to ensure consistency across components.

Macros will require to be defined in the following order:
1. `defineOptions`
2. `defineProps`
3. `defineEmits`
4. `defineModel`
5. `defineSlots`

Also ensures `defineExpose` to be the last statement of `<script setup>`
2024-06-13 14:06:26 +02:00
Julien Fontanet
be2efce595 fix(xo-server-transport-email): set text to markdown even if html is defined 2024-06-13 11:23:08 +02:00
Pierre Donias
4295dad3ac fix(web-core): devDependencies → dependencies + peerDependencies (#7707)
web-core is published as a library so its dependencies need to be installed
when web installs its own dependencies

- packages that are (or will be) used by lite and web are declared as
  dependencies in lite and web and as peerDependencies in web-core
- other packages that are only used in web-core are declared as dependencies in
  web-core
2024-06-13 10:42:24 +02:00
Julien Fontanet
cdf902bdf3 chore(.prettierignore): explain why Handlebar is ignored
Introduced by 3f4ca1b32
2024-06-12 15:45:00 +02:00
Thierry Goettelmann
97dd211d0f fix: prettify script must respect .prettierignore (#7745)
Specifying `--ignore-path` option overrides the default value of `[.gitignore, .prettierignore]`.
2024-06-12 15:43:54 +02:00
Paloma
0f11e4c4c4 feat(web-core): add UI separator component (#7722)
This component is a grey line (hr). When its parent is a flexbox with
`flex-direction: column`, it is horizontal, and with `flex-direction: row`,  it
is vertical.
2024-06-12 09:49:55 +02:00
Julien Fontanet
33a388193c feat(xo-server/api): pending/failed calls have an associated tasks 2024-06-11 10:36:29 +02:00
MlssFrncJrg
bed18fc954 feat: open external links in a new tab (#7695) 2024-06-11 10:20:46 +02:00
Thierry Goettelmann
1d8385e1f0 chore(web stack): add new ESLint Vue rules #2 (#7728)
Add `vue/define-emits-declaration` ESLint rule to ensure consistency in `defineEmits` syntax across the components.

It uses the new Vue 3.3+ more succinct syntax.
2024-06-11 09:12:41 +02:00
Thierry Goettelmann
11fbbf5158 chore(web stack): add new ESLint Vue rules (#7727) 2024-06-10 16:54:23 +02:00
Olivier Lambert
209dddda2b docs(roadmap): update our roadmap page (#7709) 2024-06-10 12:54:51 +02:00
Julien Fontanet
7f0984aff0 feat(xo-server/proxy.updateApplianceSettings): support for register and xoaPassword 2024-06-10 10:56:04 +02:00
Julien Fontanet
3f32f9981e chore(xo-server/updateProxyAppliance): simplify code 2024-06-10 10:56:04 +02:00
OlivierFL
faf54e18a8 feat(lite/web-core): add examples for tree-view components stories (#7532) 2024-06-10 09:56:45 +02:00
Pierre Donias
f70f4ea0e6 feat(netbox): support both content_type (Netbox <4) and object_type (Netbox 4) fields
Fixes #7645
See Zammad#24458
See Zammad#25690
See Zammad#24821
See #7733
2024-06-10 09:50:38 +02:00
Pierre Donias
c346cadf24 feat(netbox): explicit supported Netbox versions 2024-06-10 09:50:38 +02:00
Dan Pollak
00c8f37e73 docs: Storage Management (#7674) 2024-06-10 09:02:27 +02:00
Dan Pollak
ee6fa67246 docs: continous → continuous (#7466) 2024-06-07 13:10:25 +02:00
Julien Fontanet
691f36a223 fix(proxy-cli): timeout with long calls
Similar to 29d39a576
2024-06-06 16:38:55 +02:00
Julien Fontanet
3c41d612d0 feat(xo-web/proxies): refresh upgrade status every 30s 2024-06-06 13:58:09 +02:00
Julien Fontanet
0294c3dd68 fix(xo-web/proxies): fetch upgrades even if fetching licenses failed 2024-06-06 13:57:30 +02:00
Dan Pollak
6c25d9e147 docs(incremental_backups): fix XO 5.81 blogpost link (#7725) 2024-06-05 23:07:45 +02:00
Florent BEAUCHAMP
58cc1de804 fix(vmxware-explorer): vsan detection (#7717)
Fixes zammad#25110

Introduced by 2d07fdcd02
2024-06-05 16:37:35 +02:00
b-Nollet
3f4ca1b322 feat(backup-reports): rewrite with Handlebars (#7543) 2024-06-05 15:47:06 +02:00
Julien Fontanet
99e44fe139 chore(xo-web): rename proxyApplianceUpdaterState
The subscription is for a single proxy, not all of them.
2024-06-05 09:22:53 +02:00
Julien Fontanet
b87bc29f0e fix(fuse-vhd): handle readRawData failure (#7718)
The bug may leads to blocked mount.
2024-06-04 16:33:36 +02:00
Mathieu
f6672a643f feat(XO6/core): creation of the interactive UiTable (#7677) 2024-06-03 15:53:47 +02:00
OlivierFL
2a2fe93476 fix(xo-6/tree-view): show halted VMs attached to a pool (#7683)
Introduced by 796bb60
2024-06-03 15:19:00 +02:00
Paloma
93303ca7ac feat(xo-core): add stacked bar UI component (#7676) 2024-06-03 14:28:38 +02:00
Julien Fontanet
3a211524cb docs(installation): request Node LTS
XO is no longer stuck on Node 18.
2024-06-03 10:50:40 +02:00
Paloma
1bba37adb1 feat(xo-core): add card number ui component (#7666) 2024-06-03 09:34:43 +02:00
Paloma
8c4fcc43d2 feat(xo-core): add legend UI component (#7675) 2024-06-03 09:22:56 +02:00
Paloma
e20e3526a5 feat(xo-core): add Legend title UI component (#7678) 2024-06-03 09:17:14 +02:00
Paloma
17fec5876c feat(xo-core): add multi color donut chart ui component (#7661)
SVG based donut chart
2024-06-03 09:16:47 +02:00
Pierre Donias
4cf03cf0a2 feat(lite): 0.2.3 (#7715) 2024-05-31 17:51:06 +02:00
Pierre Donias
57e44734e2 feat: release 5.95.0 (#7714) 2024-05-31 17:39:15 +02:00
Pierre Donias
3075ce9232 feat: technical release (#7713) 2024-05-31 17:22:13 +02:00
Florent BEAUCHAMP
196f3969eb fix(xo-server,vmware-explorer): template is not defined (#7712) 2024-05-31 17:09:49 +02:00
Julien Fontanet
d635de0a96 fix(scripts/gen-deps-list.js): handle dev dependencies 2024-05-31 15:59:52 +02:00
Julien Fontanet
d1e3d79bf8 feat(scripts/gen-deps-list.js): add web & lite
They are applications and must be bumped if any of their deps is bumped.
2024-05-31 15:59:52 +02:00
Pierre Donias
5adec6b2ef feat: technical release (#7708) 2024-05-31 15:59:20 +02:00
MlssFrncJrg
b2b6262aea fix(xo-server,xo-web/pci): allow force reboot host after enabling/disabling PCI passthrough (#7687)
See https://xcp-ng.org/forum/topic/9043/xo-enable-pci-devices-for-pass-through-should-it-work-already-or-not-yet/14
2024-05-31 15:16:47 +02:00
Florent BEAUCHAMP
82d3ec6033 fix(xo-server-perf-alert): improve performances and reliability (#7692)
* make one query per host instead of one per object (VM or host ) per counter ( Memory/CPU)
* fix(xo-server-perf-alert): handle VM without guest tools that does not have memory used metrics
---------

Co-authored-by: b-Nollet <150058367+b-Nollet@users.noreply.github.com>
2024-05-31 14:52:34 +02:00
OlivierFL
3dd5a6ba13 feat(xo-6/vm): add console view (#7693) 2024-05-31 14:23:24 +02:00
Pierre Donias
0215ac2491 fix(yarn.lock): after adding dependency (#7706)
Introduced by 3044a42
2024-05-31 13:43:31 +02:00
Pierre Donias
3044a429cc fix(web-core): missing dependency @fontsource/poppins (#7705) 2024-05-31 11:02:32 +02:00
Florent BEAUCHAMP
53ee6988db feat(xo-server): improve error handling in v2v (#7654)
* use one defer per Vm import
*  improve error lisibility by extracting relevant values
2024-05-31 10:05:01 +02:00
b-Nollet
89950e77f4 fix(xo-server): handle unknown ref in task.other_config.applies_to (#7685) 2024-05-31 09:20:38 +02:00
Julien Fontanet
800655a9a3 fix(xo-server/rest-api): host logs are in tar+gzip
Fixes #7703
2024-05-31 09:12:30 +02:00
Florent BEAUCHAMP
59fbb3ef48 feat(v2v): select template before import (#7566)
Ask user for the base template to use when importing VM
2024-05-31 09:06:17 +02:00
Florent BEAUCHAMP
9133e32dd0 fix(backups/forkStreamUnpipe): unpause stream after unpipe (#7669)
when a backup job does delta replication + backup and the replication
fails to find the base VM, the backup job does not proceed

This commit force the stream to continue to flow after unpiping a
descendant stream
2024-05-31 08:45:33 +02:00
b-Nollet
cb6df6d155 fix(xo-server): don't use stats that were cached exactly one step ago (#7697)
Update stats instead of using cache when cache is exactly one step old. It avoids the stats to be twice the same in a row when fetching it every step.

Introduced by 8347ac6ed8
2024-05-31 08:37:40 +02:00
b-Nollet
20f398398f feat(xo-server-load-balancer): adding option to balance hosts before CPU reaches threshold 2024-05-31 08:36:43 +02:00
b-Nollet
c4d1dee6fd fix(xo-server-load-balancer): execute vCPU-prepositionning separately for each pool 2024-05-31 08:36:43 +02:00
b-Nollet
93627a794c fix(xo-server-load-balancer): don't do vCPU-prepositionning when one host is overloaded 2024-05-31 08:36:43 +02:00
b-Nollet
bfb2442df1 fix(xo-server-load-balancer): some migrations were not awaited 2024-05-31 08:36:43 +02:00
Florent BEAUCHAMP
24d584e905 fix(xo-server): dispose stream properly after v2v import (#7655) 2024-05-31 08:18:10 +02:00
MlssFrncJrg
882facd246 feat: technical release (#7704) 2024-05-30 17:41:04 +02:00
Pierre Donias
4c37be5b31 fix(web): missing prepublishOnly script (#7701) 2024-05-30 16:04:16 +02:00
Pierre Donias
5811a2ede2 chore(web-core): configure package to be published on NPM (#7700) 2024-05-30 14:50:28 +02:00
MlssFrncJrg
8fb918a64d feat: technical release (#7699) 2024-05-30 13:15:38 +02:00
MlssFrncJrg
682198df42 feat(xo-server,xo-web/pool): add migration compression (#7642) 2024-05-29 17:27:00 +02:00
Julien Fontanet
de9288b432 docs(xo-server/REST API): ova extension for VM OVA export
Introduced by acc44f0ce
2024-05-29 17:20:04 +02:00
Julien Fontanet
42d58e9dbf feat(obfuscate): new lib to obfuscate sensitive data
Code was extracted from xo-server and xen-api.
2024-05-29 16:58:54 +02:00
Julien Fontanet
d55f614540 fix(backups): handle migration blocked by a previous run
Fixes https://xcp-ng.org/forum/post/77857
Fixes zammad#25131
Fixes zammad#25443
2024-05-29 16:54:27 +02:00
Julien Fontanet
61ecc85beb feat(xapi): no longer export extractOpaqueRef()
BREAKING CHANGE

It's no longer necessary now that task results are properly parsed.
2024-05-28 11:42:57 +02:00
Julien Fontanet
08dc33bc9d feat(xen-api/watchTask): returned parsed result instead of XML-RPC
BREAKING CHANGE

Also impacts `getResource()` and `putResource()`.
2024-05-28 11:42:57 +02:00
Pierre Donias
e23f649e74 feat(xo-web/tasks): wait 10 seconds before estimating end of task (#7691)
Fixes #7689
2024-05-28 10:27:42 +02:00
OlivierFL
f0cd83e3c4 feat(xo-6/account-menu): add menu items (links to doc and support) (#7662) 2024-05-28 09:13:23 +02:00
OlivierFL
136ea23199 feat(xo-lite): add german translation (#7686)
See #7284
2024-05-28 09:11:17 +02:00
b-Nollet
73ea4fa6b4 fix(fs,xo-server): remote encryption algorithm was private (#7638)
Encryption was not showing up in remote page because the remote mixin was using an attribute that was private. See https://help.vates.tech/#ticket/zoom/24076

Introduced by 86ddb8f2d9
2024-05-27 09:18:51 +02:00
Pierre Donias
990c23b8f5 feat(xo-web/render-xo-item/Vm): yellow icon next to VM name when VM is busy (#7680)
Fixes #7593
2024-05-23 14:24:24 +02:00
Pierre Donias
5fca2f0c74 feat(lite/header): add a link to XOA when detected on the pool (#7679)
When XOA is connected to a pool, it adds information about itself on the pool's
other_config. We can use that in XO Lite to find the XOA's IP address and add a
link to open Xen Orchestra.
2024-05-23 13:32:24 +02:00
Thierry Goettelmann
5cd9e50fa3 feat(web-core/tree): tree filter composable (#7536) 2024-05-23 09:44:00 +02:00
Paloma
18a2b5b549 feat(xo-core): add status pill UI component for backup issues (#7631) 2024-05-23 09:15:30 +02:00
Thierry Goettelmann
da9b9419ae feat(web-core/tree): enhance tree library (#7534)
- Context now stores the selected/expanded/active IDs instead of the `TreeNode` to allow easy manipulation and initial hydration.
- Rename `activable` option to `selectable`
- Rename `labelClasses` to `statuses`
- Add `hasChildren` on `Branch`
- `predicate` now takes the `TreeNode` as argument instead of `TData`
- Add a `meta` option, to pass additional arbitrary data
2024-05-22 17:07:44 +02:00
Olivier Lambert
8c599b0bad docs(advanced): fix old Terraform provider links (#7673) 2024-05-22 15:47:11 +02:00
Julien Fontanet
1ded79169b chore: format with Prettier 2024-05-22 15:42:14 +02:00
Thierry Goettelmann
bea123f347 feat(lite): update stores to use new core subscribable stores (#7602)
Update XO Lite stores to use the new subscribable store system from Web Core
2024-05-22 15:08:55 +02:00
Julien Fontanet
88fb977db9 feat(xo-cli): --url allows bypassing registration
Related to zammad#25158
2024-05-22 12:11:06 +02:00
Julien Fontanet
b48e16c316 feat(xo-cli): use subcommand syntax
This change allows to properly separate options and subcommands,
which opens the door to global options.

Previous syntax is still supported for now but will show a deprecation
message.

```sh
xo-cli --register
xo-cli --createToken

xo-cli register
xo-cli create-token
```
2024-05-22 12:10:37 +02:00
Julien Fontanet
a8ffa91d41 docs(infrastructure): update xo-cli usage 2024-05-22 12:10:16 +02:00
Mathieu
6a67944112 feat(xo-web/XOA/licenses): handle new XOSTOR licenses (#7573) 2024-05-22 11:17:43 +02:00
Mathieu
4908982263 feat(lite/pool/dashboard): remove DVDs from the Storage usage card (#7670) 2024-05-17 14:28:08 +02:00
b-Nollet
6444f88662 chore(xo-server-backup-reports): remove unused legacy handler (#7665) 2024-05-16 16:16:31 +02:00
Pierre Donias
644654c7eb feat(lite/release): add CHANGELOG.md to GitHub release (#7667) 2024-05-16 15:21:00 +02:00
Thierry Goettelmann
5629bbef05 fix(xo-6): rename dynamic pages (#7668)
Fix dynamic pages name: `/:id.vue` => `/[id].vue`
2024-05-16 14:52:52 +02:00
Mathieu
a627fe31e2 fix(XO6/LogoTextOnly): fix color (#7664) 2024-05-16 11:53:54 +02:00
Julien Fontanet
2534d9ff38 chore: update deps 2024-05-16 11:16:18 +02:00
Julien Fontanet
13863beed8 chore: update dev deps 2024-05-16 10:48:44 +02:00
Thierry Goettelmann
796bb60b62 feat(web6): subscribable stores, REST API fetching, infra tree view (#7600)
- Implement subscribable store on XO 6
- Fetch data from REST API
- Display infrastructure tree view
- Updated README
- Added dev pages:
  - **index.vue**: empty page for component development
  - **token.vue**: form to register or clear a token cookie
2024-05-16 09:57:17 +02:00
b-Nollet
7882debe7a feat: release 5.94.2 (#7660) 2024-05-15 11:07:44 +02:00
b-Nollet
548a2e8141 feat: technical release (#7659) 2024-05-15 10:15:11 +02:00
Mathieu
63f89bb6af fix(xo-server/XOSTOR): license.tags can be undefined (#7657)
Co-authored-by: mathieu <mathieura@vates-mathieu.home>
2024-05-15 09:15:46 +02:00
b-Nollet
ae1043a89a feat: technical release (#7656) 2024-05-14 16:58:52 +02:00
Julien Fontanet
c272c9ef2d fix(CHANGELOG.unreleased): add missing backups
Introduced in 7513b90c5
2024-05-14 16:42:02 +02:00
Julien Fontanet
7513b90c5c fix(backups): block migration of whole VM during backup
Related to zammad#16108

Introduced by b00cf1302
2024-05-14 15:57:27 +02:00
Julien Fontanet
ef3ade72e4 fix(xo-server/rest-api): wait for task change when wait is NOT undefined
Introduced by 6c1a1307c
2024-05-14 15:24:28 +02:00
Florent Beauchamp
152c4e69c8 changelog 2024-05-14 15:10:46 +02:00
Florent Beauchamp
60286ba0d8 fix(vmware-explorer): handle new lines in fetchProperty 2024-05-14 15:10:46 +02:00
Thierry Goettelmann
f7664b317e feat(web-core): add helper to create subscribable stores (#7599)
Add a helper which allow to easily create a subscribable store (store that return its context only after calling a subscribe method and handle what happen on subscribe/unsubscribe)

App-agnostic, to be used with XO Lite and XO 6.
2024-05-14 14:42:44 +02:00
Mathieu
89ea175de1 fix(xo-server/XOSTOR): throw clearer error if attempt to create multiple trials (#7649) 2024-05-14 14:18:15 +02:00
OlivierFL
adbae95027 feat(xo-6): handle logout (#7635) 2024-05-14 11:13:43 +02:00
OlivierFL
ffeca2a621 feat(xo-core): add design system version info in components (#7633) 2024-05-14 10:31:46 +02:00
Julien Fontanet
9d122f9e9a fix(CHANGELOG.unreleased): add missing xen-api
Introduced in 859920e6d
2024-05-13 14:58:34 +02:00
Julien Fontanet
859920e6d7 fix(xen-api/{get,put}Resource): avoid unhandled rejection on task result 2024-05-13 14:45:26 +02:00
Julien Fontanet
703d32ce7c chore(xen-api/_sessionCall): remove unused timeout param 2024-05-13 11:05:42 +02:00
Julien Fontanet
acc44f0cea feat(xo-server/rest-api): OVA support for VM export 2024-05-13 09:01:37 +02:00
b-Nollet
9b9c71a80f fix(xo-server): RPU failed to install host patches (#7640) 2024-05-09 13:04:38 +02:00
Julien Fontanet
902f0b1957 fix(xo-server/proxy-console): falling back to legacy is not a debug 2024-05-07 17:12:40 +02:00
Julien Fontanet
29f6f92ad3 fix(xo-server): console support via HTTP proxy
Introduced by e8c9e620c

Fixes https://xcp-ng.org/forum/post/76935
2024-05-07 17:12:01 +02:00
Pierre Donias
771b04acc4 fix(CHANGELOG): packages versions (#7639)
Introduced by 5d5dc9891f
2024-05-06 17:18:07 +02:00
MlssFrncJrg
d3ab7927af feat: release 5.94.1 (#7637) 2024-05-06 15:42:04 +02:00
MlssFrncJrg
5d5dc9891f feat: technical release (#7636) 2024-05-06 14:40:27 +02:00
MlssFrncJrg
1ab62d4762 feat(xo-web/xostor): ability to copy VDI UUID in the resources table (#7629) 2024-05-06 14:10:43 +02:00
MlssFrncJrg
b9a6651f88 feat(xo-web/XOSTOR): warn if replication count is higher than number of hosts with disks (#7625) 2024-05-06 11:39:25 +02:00
OlivierFL
960cf6632d feat(xo6/core): update chip component to v1.1.0 (#7632)
Update the `ChipRemoveIcon` component by replacing the `faCircleXmark` icon with
the `faXmark` icon to match version 1.1.0 from the design system.
2024-05-06 11:23:59 +02:00
Mathieu
da48a396ff fix(xo-server,xo-web/XOSTOR): do not require XCP-ng licenses (#7628) 2024-05-06 10:34:51 +02:00
Mathieu
ed66635b89 fix(xo-web/XOSTOR): handle older versions of linstor plugin (#7630)
Fixes "an error has occurred" in XOSTOR resource list
2024-05-06 10:07:10 +02:00
Pierre Donias
e3d718f1f7 fix(xo-web/pool): only show pool SRs in default SR selector (#7626)
Introduced by #7451
2024-05-06 09:20:51 +02:00
Pierre Donias
3a44b6d777 feat(lite): 0.2.2 (#7624) 2024-04-30 17:05:32 +02:00
Julien Fontanet
6870e067a0 fix(xo-server): use callAsync to install XCP-ng updates
Fixes https://team.vates.fr/vates/pl/bkqyatm7w3yquyw1o9watx3c1o
2024-04-30 16:26:42 +02:00
MlssFrncJrg
507949330f feat: release 5.93.1 (#7623) 2024-04-30 16:17:21 +02:00
OlivierFL
a6a63325cc feat(lite): update tree-view with new components (#7531) 2024-04-30 15:24:56 +02:00
MlssFrncJrg
22bd7ce8d4 feat: technical release (#7620) 2024-04-30 15:07:02 +02:00
Mathieu
dad34e9027 fix(xo-server/XOSTOR): fix install dependencies (#7619) 2024-04-30 14:46:08 +02:00
MlssFrncJrg
c280aecd33 feat: technical release (#7618) 2024-04-30 13:07:18 +02:00
Julien Fontanet
dd0afe3b02 feat(bump-pkg): prevent bump if package.json has modifications 2024-04-30 11:51:30 +02:00
b-Nollet
a8118ec7dd feat(xo-server): implement XO tasks for RPR and RPU (#7578) 2024-04-30 10:33:25 +02:00
MlssFrncJrg
63ebfce3f2 feat(xo-web/new VM): warn if pool is not setup for secure boot (#7562)
Fixes #7500
2024-04-30 10:08:12 +02:00
Pierre Donias
2e9c1d7c11 fix(xo-web/pool/advanced): handle undefined default SR (#7616)
Introduced by #7451
2024-04-30 09:56:17 +02:00
Florent BEAUCHAMP
3a68a61d7e fix(vmware-explorer/esxi): extent chain computation (#7617)
Introduced by bb47dafbf9

This is used to show the UI for the import using  exportVm instead of datastore access
2024-04-30 09:51:05 +02:00
Florent BEAUCHAMP
195a3f6220 fix(xo-server/vm.importFromEsxi): workDirRemote is optional even for single import (#7615)
introduced by 2d07fdcd02
2024-04-30 09:46:03 +02:00
Manon Mercier
8ed24899f5 docs: add example to the Cloud Init section (#7575) 2024-04-29 17:31:23 +02:00
Mathieu
6a31acd28b fix(xo-web/SR/XOSTOR): block access to XOSTOR tab for source users (#7611) 2024-04-29 17:02:50 +02:00
Julien Fontanet
b2e807b309 feat(xo-server/rest-api): actions can be listed without an existing object 2024-04-29 16:50:57 +02:00
Julien Fontanet
d64f5f8ab4 feat(xo-server/rest-api): GET endpoint for single action 2024-04-29 16:50:57 +02:00
Pierre Donias
264eb8166a fix(lite/release): pass "duplex: 'half'" option to tarball request (#7612) 2024-04-29 16:40:35 +02:00
Florent Beauchamp
bb47dafbf9 feat(xo-web): implement vsan import ui 2024-04-29 16:27:55 +02:00
Florent Beauchamp
2d07fdcd02 feat(xo-server): use ExportVM to import disks from vsan
must use a remote to store the temporary vmdks during imports
since they can't be parsed on the fly nor accessed by range
2024-04-29 16:27:55 +02:00
Florent Beauchamp
71e269eeb2 feat(vmware-explorer): implement VHD adapter for stream optimzed vmdk 2024-04-29 16:27:55 +02:00
Florent Beauchamp
5b0105690f feat(vmware-explorer): implement exportVm method
this method internally calls the web service method ExportVM :
 https://developer.vmware.com/apis/196/vim.VirtualMachine.html#exportVm

which can export all the disk of a stopped VM, regardless of the
datastore used,  including VSAN
The disks are exported in stream optimized VMDK , with their
grain directory ( level 1 adressing table) at the end, and
all the data are stored in comrpessed grains with markers
2024-04-29 16:27:55 +02:00
Florent Beauchamp
ed62f738ce refactor(vmware-explorer): extract fetch method 2024-04-29 16:27:55 +02:00
Florent Beauchamp
f0c92c6ed1 fix(vmware-explorer): use fetchProperty instead of search 2024-04-29 16:27:55 +02:00
Mathieu
75d37a52a1 feat(xo-web/XOSTOR): remove beta banner (#7609) 2024-04-29 16:26:57 +02:00
Mathieu
d1318e72c5 fix(xo-server): handle new XOSTOR licenses (#7558) 2024-04-29 15:45:12 +02:00
Mathieu
50938a3c23 feat(xo-web/xo-server/VM): ability to attach PCIs to a VM (#7464)
See #7432
2024-04-29 15:21:52 +02:00
Mathieu
e2a49605f1 feat(xo-web/host/advanced): list PCIs known by the XAPI (#7455)
See #7432
2024-04-29 15:06:15 +02:00
Mathieu
c32ca3d944 feat(xo-server/api): implement PCI API (#7444)
See #7432 
xen-api PR https://github.com/xapi-project/xen-api/pull/5542
2024-04-29 14:52:32 +02:00
Mathieu
08d31051de feat(xo-web/home/SR): display pro support status for XOSTOR SR (#7601) 2024-04-29 14:39:52 +02:00
Julien Fontanet
0c67610cb6 docs(troubleshooting): document stats and backup network 2024-04-29 13:55:06 +02:00
MlssFrncJrg
8946d5c149 fix(xo-server/XOSTOR): fix LVM_ERROR(5) during formatDisks (#7598) 2024-04-29 11:21:58 +02:00
MlssFrncJrg
a321398f43 fix(xo-server/XOSTOR): install or update packages on all pool hosts (#7597) 2024-04-29 11:13:45 +02:00
Florent BEAUCHAMP
da1b452540 fix(CHANGELOG.unreleased): package name (#7610)
Introduced by d64c1b8c3c
2024-04-29 11:10:00 +02:00
MlssFrncJrg
038d230d63 fix(xo-web/xostor/create): don't ignore hosts without disks when checking consistency (#7572) 2024-04-29 10:39:44 +02:00
Florent BEAUCHAMP
d64c1b8c3c fix(vmxware-explorer): handle multiple datacenter (#7553)
When downloading from the http browsing api, we need to pass the datacenter corresponding
to the datastore used
2024-04-29 10:36:38 +02:00
Florent BEAUCHAMP
2427f48618 feat(xva): improve compatibility with xenserver (#7563)
feat(xva): improve import compatibility with xenserver

* from ticket 23636
* fix error (Failure "Field last_boot_CPU_flags not present in rpc")
* fix error (Failure "(Failure "Field suspend_VDI not present in rpc"")
* fix error (Failure "(Failure "Field suspend_SR not present in rpc"")
2024-04-29 10:32:41 +02:00
MlssFrncJrg
81a125846f feat(xo-web, xo-server/XOSTOR): changes before XOSTOR official release (#7568) 2024-04-29 10:29:20 +02:00
Florent BEAUCHAMP
90eccf02e5 fix(vmware-explorer): harden vmx parsing (#7583)
from https://xcp-ng.org/forum/topic/8864/cannot-create-property-ctkenabled-on-string-true-on-trying-to-import-from-esxi/9
2024-04-29 10:27:56 +02:00
Julien Fontanet
7b7a46902e chore(mixins/Tasks): only check clearLogOnSuccess for root tasks 2024-04-26 16:56:00 +02:00
Julien Fontanet
91429406a8 feat(xo-web/subscribeXoTasks): use REST API watch mode 2024-04-26 16:56:00 +02:00
Julien Fontanet
29d39a5764 fix(xo-cli rest): remove HTTP timeout
Default 5s timeout is problematic with new tasks collection watch mode.
2024-04-26 16:56:00 +02:00
Julien Fontanet
6c1a1307c8 feat(xo-server/rest-api): watch mode for tasks
`/rest/v0/tasks?ndjson&watch`:
```
["remove",{"id":"0lv13orww","href":"/rest/v0/tasks/0lv13orww"}]
["update",{"id":"0lv13otzz","properties":{"method":"acl.getCurrentPermissions","params":{},"name":"API call: acl.getCurrentPermissions","userId":"287d34e8-e5ca-48b3-bf32-8499fa167211","type":"api.call"},"start":1713194362080,"status":"pending","updatedAt":1713194362080,"href":"/rest/v0/tasks/0lv13otzz"}]
```
2024-04-26 16:56:00 +02:00
Pierre Donias
1fa9b31076 feat(xo-web): japanese translation (#7605)
See #7582
2024-04-26 16:12:10 +02:00
Pierre Donias
f72de22d44 docs(RPU): document restartHostTimeout config (#7606)
See https://xcp-ng.org/forum/topic/8842
2024-04-26 16:02:02 +02:00
Julien Fontanet
5b41fe0842 chore(xen-api/transports): use @vates/xml{,-rpc}
Fixes #7556
2024-04-26 16:01:28 +02:00
Julien Fontanet
f8fc4aa551 feat(xml-rpc): new lib to parse/format XML-RPC 2024-04-26 16:01:28 +02:00
Julien Fontanet
798049c20e feat(xml): new lib to parse/format XML 2024-04-26 16:01:28 +02:00
MlssFrncJrg
db3c51d55e feat: technical release (#7603) 2024-04-26 11:03:01 +02:00
MlssFrncJrg
2833885638 feat(xo-web/XOSTOR): add confirmation modal informing hosts toolstack may restart (#7570) 2024-04-26 10:35:01 +02:00
Julien Fontanet
dfd58cd2e8 fix(xo-web/vm/backups): handle xo:no-bak tags
Fixes #7527
2024-04-25 15:14:09 +02:00
Mathieu
170537bd16 feat(xo-web/XOSTOR): manage XOSTOR interfaces (#7547) 2024-04-25 13:53:14 +02:00
Mathieu
a15f2ec760 feat(xo-web, xo-server/SR): list resources in a XOSTOR tab (#7542) 2024-04-25 11:23:39 +02:00
MlssFrncJrg
6dc18164d5 fix(xo-web/VM/advanced): fix error when pool is not visible by user (#7580) 2024-04-25 10:12:51 +02:00
Thierry Goettelmann
b3ea140ac0 feat(web6): new default layout (#7591) 2024-04-24 17:04:43 +02:00
OlivierFL
e5b5714f5a feat(web-core): add new ObjectIcon component (#7564) 2024-04-24 17:02:00 +02:00
OlivierFL
2b7b385da6 feat(web-core): add new ComplexIcon component (#7555) 2024-04-24 17:01:25 +02:00
Thierry Goettelmann
8229769f0d feat(web-core): new layout system (#7589)
New layout system with a default `CoreLayout` component which handle header +
resizable sidebar + content header + content + right panel header/content.
2024-04-24 10:23:04 +02:00
Thierry Goettelmann
8eb4dbb683 feat(web-stack): add i18n + keyboard shortcuts (#7590)
- Move i18n configuration from Lite to Core
- Add keyboard shortcuts (toggle lang / theme) to XO 6
- Add locales to Core
- Import Core locales into Lite and XO 6
2024-04-23 16:41:54 +02:00
Thierry Goettelmann
ed128e9b4b feat(web-core/tooltip): update TooltipItem to match design system (#7588) 2024-04-23 15:25:04 +02:00
Thierry Goettelmann
a4f7711554 feat(web-core/if-else): accept array of functions (#7586)
`ifElse` now accepts an array of functions for `onTrue` and `onFalse`
2024-04-23 15:17:25 +02:00
Thierry Goettelmann
7801c61394 feat(web6): new LogoTextOnly component (#7584) 2024-04-23 15:12:18 +02:00
Thierry Goettelmann
694b0389f3 feat(web-core): add MaybeArray and toArray (#7585)
- Add `MaybeArray` utility type
- Add `toArray` utility function
2024-04-23 14:58:15 +02:00
Florent Beauchamp
78fc882c89 fix(xo-server): really stop vm when importing
introduced by acc7b3a5a0
2024-04-23 10:18:42 +02:00
Florent Beauchamp
5e7590852f fix(vmware-explorer): wait for power off to finish
the power off call return a task, this commit wait for this task to end
2024-04-23 10:18:42 +02:00
Florent Beauchamp
a1886b466a fix(xo-server): nfs remote mount while importing from vmware
use the currently mounted and enabled remote instead of mounting them
also this respect the mount point defined in config ( /run/xo-server/mount for xoa)
introduced by bb8c3c18e6
2024-04-23 10:18:42 +02:00
Dan Pollak
3736b699ff docs(airgap): fix deployement→ deployment (#7581)
deployement >> deployment

Signed-off-by: Dan Pollak <danpollak2@gmail.com>
2024-04-23 09:11:29 +02:00
Florent BEAUCHAMP
587da7b133 fix(proxy): xapi watch VM_guest_metrics (#7574)
From zammad#21282
Introduced by 231f09de12

Health check is dependent on the updates on guest metrics to ensure VM is correctly booted
2024-04-22 11:08:00 +02:00
Dan Pollak
7b084fe0fa docs(restapi): fix dislayed → displayed (#7577) 2024-04-20 21:26:23 +02:00
John Impallomeni
b154d09a9c docs(README): use HTTPS for vates.tech link (#7576) 2024-04-20 14:00:06 +02:00
Julien Fontanet
05d975a63a feat(xo-server-audit): expose records in REST API 2024-04-19 11:45:50 +02:00
Julien Fontanet
55b28fdb77 fix(CHANGELOG.unreleased): package order
Introduced by 66915ebc5
2024-04-19 11:29:57 +02:00
Julien Fontanet
6b76a5780b feat(gen-deps-list): better order message
New message says explicitely where the incorrect package should be.
2024-04-19 11:29:57 +02:00
Julien Fontanet
54446cad3f feat(ci): ensure pkgs order in CHANGELOG.unreleased.md 2024-04-19 11:29:28 +02:00
Florent BEAUCHAMP
cc049d336e feat(vmware-explorer): trim hostname (#7560) 2024-04-18 17:23:16 +02:00
Florent BEAUCHAMP
66915ebc54 fix(@vates/node-vsphere-soap): don't use default proxy (#7551) 2024-04-18 11:29:15 +02:00
Florent BEAUCHAMP
aa6b23c06c fix(backups): use the right settings in writers (#7567)
Fixes https://xcp-ng.org/forum/post/75762
Introduced by 42dc75e739

Fix error `Error: val is not a non-empty string or a valid number. val=undefined`
2024-04-18 10:21:44 +02:00
Florent Beauchamp
164985a753 fix(xo-server): use the right limit for vdi size during import 2024-04-17 15:31:37 +02:00
Florent Beauchamp
acc7b3a5a0 refactor(xo-server): extract vmware import method to its own mixin 2024-04-17 15:31:37 +02:00
Florent BEAUCHAMP
2de0a2b32a Update @xen-orchestra/vmware-explorer/esxi.mjs
Co-authored-by: Julien Fontanet <julien.fontanet@isonoe.net>
2024-04-17 15:15:57 +02:00
Florent Beauchamp
0a7ae633e1 fix yarn.lock 2024-04-17 15:15:57 +02:00
Florent BEAUCHAMP
14d1ba5996 Apply suggestions from code review
Co-authored-by: b-Nollet <150058367+b-Nollet@users.noreply.github.com>
2024-04-17 15:15:57 +02:00
Florent Beauchamp
39bbd1a058 feat(vmware-explorer): implement fetchProperty 2024-04-17 15:15:57 +02:00
b-Nollet
4326f50121 docs(load_balancing.md): adding paragraph on vCPU balancing 2024-04-17 14:37:58 +02:00
b-Nollet
15177ace5b fix(xo-server-load-balancer): correct values of CPU and memory thresholds (density plan)
`undefined` CPU and memory thresholds were used in density plan to decide if a host can receive a VM or not, which made the host always accept it.

Introduced by 5a825bd459
2024-04-17 14:37:58 +02:00
Florent BEAUCHAMP
42dc75e739 feat(backups): make health check timeout configurable (#7561) 2024-04-16 18:15:40 +02:00
Julien Fontanet
2b73482f9e docs(airgap): deploy/upgrade processes (#7550) 2024-04-16 14:51:42 +02:00
Florent BEAUCHAMP
d217c7ba61 fix(vmware-explorer): undefined deviceType (#7545)
Introduced by 60488e6f0c

From zammad#23798
2024-04-15 17:32:12 +02:00
Thierry Goettelmann
bd7e566193 feat(web6): add missing deps and config (#7548)
Add missing dependencies and PostCSS configuration
2024-04-15 09:19:47 +02:00
Julien Fontanet
54b473c7b1 feat(xo-proxy/api): log call errors as tasks
This gives more detailed information (start, end, errors) and also adds support for subtasks.

Before:

```
2024-04-14T13:50:16.749Z xo:proxy:api WARN call error {
  method: 'test.throw',
  params: { message: 'foo' },
  error: Error: foo
      at Api.addMethods.test.throw.params.message.type (file://<...>/@xen-orchestra/proxy/app/mixins/api.mjs:227:19)
      at m (file://<...>/@xen-orchestra/proxy/app/mixins/api.mjs:253:28)
      at Api._call (file://<...>/@xen-orchestra/proxy/app/mixins/api.mjs:310:12)
      at file://<...>/@xen-orchestra/proxy/app/mixins/api.mjs:90:44
      at Zone.run (<...>/node_modules/node-zone/index.js:80:23)
      at file://<...>/@xen-orchestra/proxy/app/mixins/api.mjs:90:29
      at processTicksAndRejections (node:internal/process/task_queues:95:5)
      at compressMiddleware (<...>/node_modules/koa-compress/lib/index.js:56:5)
}
```

After:

```
2024-04-14T13:49:17.102Z xo:proxy:api WARN call error {
  id: 'qxhdytrtmvk',
  properties: [Object: null prototype] {
    method: 'test.throw',
    params: { message: 'foo' }
  },
  start: 1713102557102,
  status: 'failure',
  end: 1713102557102,
  result: Error: foo
      at Api.addMethods.test.throw.params.message.type (file://<...>/@xen-orchestra/proxy/app/mixins/api.mjs:227:19)
      at file://<...>/@xen-orchestra/proxy/app/mixins/api.mjs:264:39
      at AsyncLocalStorage.run (node:async_hooks:346:14)
      at Task.runInside (<...>/@vates/task/index.js:175:41)
      at Task.run (<...>/@vates/task/index.js:158:31)
      at m (file://<...>/@xen-orchestra/proxy/app/mixins/api.mjs:264:29)
      at Api._call (file://<...>/@xen-orchestra/proxy/app/mixins/api.mjs:327:12)
      at file://<...>/@xen-orchestra/proxy/app/mixins/api.mjs:92:44
      at Zone.run (<...>/node_modules/node-zone/index.js:80:23)
      at file://<...>/@xen-orchestra/proxy/app/mixins/api.mjs:92:29
      at processTicksAndRejections (node:internal/process/task_queues:95:5)
      at compressMiddleware (<...>/node_modules/koa-compress/lib/index.js:56:5)
}
```
2024-04-14 15:55:50 +02:00
Julien Fontanet
5e94c5ad8d feat(proxy/api): add test.throw method 2024-04-14 15:55:50 +02:00
Julien Fontanet
9e2ccc6ea3 feat(task/Task.run): optional opts, context and args can be passed
The goal is to make subtasks creation as easy as possible.
2024-04-14 15:12:05 +02:00
mathieu
2f962dd2e0 feat(xo-web/xostor): possibility to set preferred interface at creation 2024-04-12 10:00:20 +02:00
mathieu
e3f31cc141 feat(xo-server/xostor): possibility to set preferred interface at creation 2024-04-12 10:00:20 +02:00
mathieu
bfbb758341 feat(xapi/xostor): implement network API 2024-04-12 10:00:20 +02:00
mathieu
5f103e631b fix(xo-web): fix Prettier formatting issues
Introduced by c96c253568, a4c775d4ef & 44f6d2f0e3
2024-04-11 11:34:54 +02:00
Thierry Goettelmann
c0eb26fdf0 feat(web-core/utils): new ifElse utility (#7546)
Small utility that mimics VueUse's `whenever` but watches a `boolean` and
accepts a second callback to be run whenever the source is `false`.
2024-04-10 16:53:45 +02:00
Julien Fontanet
8aa421a7a6 feat: release 5.93.1 2024-04-10 12:05:46 +02:00
Julien Fontanet
919e33a4e1 fix(xo-server/upgradeProxyAppliance): clear cache at the end
Previously the cache was not clear in case of quick API upgrade.
2024-04-10 09:43:19 +02:00
Julien Fontanet
5b85a01d83 docs: adapt logs access to new appliance 2024-04-09 12:50:44 +02:00
Julien Fontanet
f8a67744a3 feat(xo-web): 5.142.1 2024-04-08 15:16:42 +02:00
Julien Fontanet
501da8b176 feat(xo-server-perf-alert): 0.3.7 2024-04-08 15:16:21 +02:00
Julien Fontanet
07019d7117 feat(xo-server): 5.140.1 2024-04-08 15:11:12 +02:00
Julien Fontanet
02971173c9 feat(@xen-orchestra/vmware-explorer): 0.6.1 2024-04-08 15:02:03 +02:00
Julien Fontanet
53dadee014 feat(@xen-orchestra/proxy): 0.27.2 2024-04-08 15:00:01 +02:00
Julien Fontanet
9517cda78f feat(@xen-orchestra/immutable-backups): 1.0.4 2024-04-08 14:59:18 +02:00
Julien Fontanet
53626c2d88 feat(@xen-orchestra/backups-cli): 1.0.17 2024-04-08 14:58:01 +02:00
Julien Fontanet
122a7d6a34 feat(@xen-orchestra/backups): 0.47.0 2024-04-08 14:56:24 +02:00
Mathieu
a4c775d4ef feat(xo-web,xo-server/RPU): RPU disabled if XOSTOR in pool (#7540) 2024-04-08 14:38:43 +02:00
Olivier Lambert
45516f7b57 docs(SECURITY.md): update with a new email domain (#7541) 2024-04-08 11:56:22 +02:00
Julien Fontanet
009c0ea6b5 fix(xo-server/vm): expose if VTPM is needed
Introduced by 8834af65f7

Introduced by 2e002de774

Fixes https://github.com/vatesfr/xen-orchestra/pull/7436#discussion_r1534257272
2024-04-08 10:08:28 +02:00
Julien Fontanet
06e9bab0dc fix(CHANGELOG.unreleased): add missing xo-server-perf-alert
Introduced in bfb8d3b29
2024-04-08 09:27:55 +02:00
Julien Fontanet
f8db103074 fix(xo-web): don't ignore case matching tags 2024-04-08 09:25:02 +02:00
Thierry Goettelmann
8013fca7e8 refactor(web-core/collection): rename collection to tree (#7533) 2024-04-08 09:23:23 +02:00
Julien Fontanet
7d849650cf fix(CHANGELOG.unreleased): fix style 2024-04-08 09:21:13 +02:00
b-Nollet
6bf7ffe356 docs: correcting load balancer docs (#7537) 2024-04-08 08:20:41 +02:00
Florent Beauchamp
74fc4dcaca refactor(xo-server/importFromEsxi): don't duplicate code 2024-04-05 16:42:18 +02:00
Florent Beauchamp
ef72eccf3e fix(vmware-explorer): ignore VM without storage
intead of stopping the VM listing if even one VM is broken
2024-04-05 16:42:18 +02:00
Florent Beauchamp
b954e42bd9 fix(xo-server/import): handle VM running without snapshot 2024-04-05 16:42:18 +02:00
Florent Beauchamp
bb8c3c18e6 fix(xo-server/import): use nfs remote also for import multiple
nfs import was only plugged on simple import, used from cli
2024-04-05 16:42:18 +02:00
Mathieu
79c9ef0f09 fix(xo-web/host/advanced): handle getSmartctlHealth error (#7525)
Fixes https://xcp-ng.org/forum/post/74221
2024-04-03 15:32:04 +02:00
Julien Fontanet
3971a9813b feat(backups/worker): log duration/CPU/memory usage 2024-04-03 14:55:24 +02:00
Julien Fontanet
0794a63b51 fix(xo-server/vm.export): body does not have a headers prop
Introduced by bfb8d3b29

Fixes https://xcp-ng.org/forum/post/74554
2024-04-02 16:44:44 +02:00
Florent BEAUCHAMP
f9ca9e7c96 feat(lite): 0.2.1 (#7526) 2024-04-02 15:57:27 +02:00
Julien Fontanet
17ed63fd58 fix(xo-server/rest-api): fix host's logs URL
Introduced by 0815d546a
2024-04-02 14:03:22 +02:00
Julien Fontanet
0815d546a2 fix(xo-server/rest-api): getResource() returns a response not a stream
Introduced by bfb8d3b29

Fixes https://xcp-ng.org/forum/post/74499
2024-04-02 12:02:19 +02:00
Florent BEAUCHAMP
8b7e1b3d7c feat: release 5.93.0 (#7521) 2024-03-29 14:02:38 +01:00
Florent BEAUCHAMP
45d068e89d feat: technical release (#7520) 2024-03-28 14:32:56 +01:00
b-Nollet
a9692cd8bc feat(xo-web, xo-server): HA setup in pool advanced tab (#7503)
Fixes #4731
2024-03-28 13:48:06 +01:00
Florent Beauchamp
88c643f0ff fix(Replication/Healthcheck): use the right xapi to start healthcheck 2024-03-28 13:39:03 +01:00
Florent Beauchamp
be426a3a67 fix(Backup/Mirror): task has already ended when running a health check 2024-03-28 13:39:03 +01:00
Florent Beauchamp
da8e98dd52 fix(backup/healthcheck): handle the case where the baseVM is not in XO cache
this can happens when the xo-server is slow to update a faster XO
xapi.getObject throw a  " no object with UUID or opaque " error during healtcheck phase
2024-03-28 13:39:03 +01:00
Julien Fontanet
7c2735c410 feat(xo-server,xo-web): split XO Proxy upgrade and force upgrade workflow
The normal upgrade is using the API call, the force upgrade is using the reboot workflow.

Also, we should not fallback to the reboot workflow automatically on API call failure
because it can be normal due to xoa-updater and/or XO Proxy being rebooted and rebooting
the VM may break the current upgrade and leave npm in an broken state.
2024-03-28 12:06:10 +01:00
Julien Fontanet
701c51faab fix(xo-server/getProxyApplianceUpdaterState): don't ignore missing API method
This error should be log as well.

It does not break anything because it does prevent from fetching the state.

It should not happen a lot because the version of XO Proxy released alongside
this version of xo-server does provide this method.
2024-03-28 12:06:10 +01:00
Julien Fontanet
62cf60a858 fix(xo-server/getProxyApplianceUpdaterState): don't debounce failures
This permits retrying getting the state ASAP.
2024-03-28 12:06:10 +01:00
MlssFrncJrg
c96c253568 feat(xo-web/templates): allow bypassing blocked operation when deleting protected template (#7493)
See Zammad#21638
2024-03-28 11:13:58 +01:00
Florent BEAUCHAMP
f26cbf4c73 feat(xo-server): s3 and encryption at rest are production ready (#7515) 2024-03-28 10:47:08 +01:00
Mathieu
707f86bbe2 feat(xo-acl-resolver): implement ACLs for PCI and USB (#7478) 2024-03-28 10:40:15 +01:00
Florent BEAUCHAMP
68f5db5804 feat(vmware-explorer): log datastore used 2024-03-28 10:10:31 +01:00
Florent Beauchamp
a1a8b5aad1 fix(xo-server): dispose remotes correctly after VMWare migration, code cleanup 2024-03-28 10:10:31 +01:00
Florent Beauchamp
3939c4f021 feat(vmware-explorer): Use NFS datastore from XO Remote to bypass VMFS6 lock
- Migrate VM to NFS on VMWare side
- mount NFS in XO , named [VMWARE]{datastoreName}
- launch import and it will read through the direct NFS instead of using the soap access layer
2024-03-28 10:10:31 +01:00
Florent Beauchamp
599dc76edb feat(vmware-explorer): one pass XVA for raw and cold deltas
Instead of doing XVA import for raw and one VHD import per delta per disk
2024-03-28 10:10:31 +01:00
Florent Beauchamp
817ae46bc5 fix(vmware-explorer): disk alignment on delta of older ESXi 2024-03-28 10:10:31 +01:00
Florent BEAUCHAMP
5d1800a4ee fix(vhd-lib): clean stream destroying (#7518) 2024-03-28 10:00:12 +01:00
Florent BEAUCHAMP
a548a95e6d feat: technical release (#7517) 2024-03-27 15:35:03 +01:00
Julien Fontanet
88dd987e09 feat(lint-staged): varlidate packages order in CHANGELOG.unreleased.md 2024-03-27 13:38:07 +01:00
Samori Gorse
44f6d2f0e3 fix(xo-web/hub/recipes/kubernetes): remove -00 suffix on version (#7492)
### Description

To merge alongside https://git.vates.tech/vates/xoa/pulls/196

This is a change to remove the addition of `-00` that was used to reference packages installed via APT. 

1.  The [new apt repository](https://kubernetes.io/blog/2023/08/15/pkgs-k8s-io-introduction/) version number do not even match this convention anymore
2. We do not install Kubernetes packages with apt anymore, we install the binaries directly. The package versions number listed in GitHub are an exact match of the various binaries version we want to install
2024-03-27 11:39:15 +01:00
Julien Fontanet
7fb1682347 fix(xen-api): move HTTP timeout to undici dispatcher
This makes all transports respecting it.
2024-03-27 11:34:57 +01:00
OlivierFL
20f06f7ce0 feat(web-core): add UserLink component (#7513) 2024-03-27 11:28:29 +01:00
Julien Fontanet
65be1adadb fix(xo-server/vm.create): fix timeout when copying template
Fixes https://xcp-ng.org/forum/post/74162
2024-03-27 11:24:26 +01:00
MlssFrncJrg
68e99a27a0 feat(xo-web/VM/advanced): add warning when selected firmware is not supported (#7442) 2024-03-27 11:06:42 +01:00
Mathieu
1be7e2acbc fix(xo-server/xostor.create): restart toolstack after installing dependencies (#7437)
Related to zammad#21209
2024-03-27 10:58:17 +01:00
Julien Fontanet
61d167a432 feat(xo-web): add OTP requires validation (#7480)
This prevents users from forgetting to add OTP account in their application and
thus being locked out from XO.
2024-03-27 10:53:07 +01:00
MlssFrncJrg
776d21bd69 feat(xo-web/console): display zoom percentage (#7452)
Fixes zammad#22418

Display zoom percentage in an editable input.
2024-03-27 10:42:51 +01:00
OlivierFL
46d74ad6a0 feat(xo6/core): update tree-view ui (#7385)
- add vertical and horizontal lines between elements
- move dropdown menu components to `web-core`
- update tree-view VM power state icon
2024-03-27 10:29:04 +01:00
Florent BEAUCHAMP
2bc69b5ec7 fix(vwmare-explorer): handle raw cdrom (#7504)
Fixes zammad#23268
2024-03-27 10:25:22 +01:00
Florent BEAUCHAMP
ed4e080b04 fix(xo-server/warmMigration): feature is for sources and premium (#7514)
Introduced by #6549 

See https://team.vates.fr/vates/pl/745krdomtff99rf8951p65rkxh

In the feature matrix of XO, warm migration is for premium (and sources) users
2024-03-27 10:21:46 +01:00
Julien Fontanet
f68e58ad53 feat(xo-web): replace numeric dates by ISO 8601 (#7484)
- international standard intended to be unambiguous and universal
- more compact than previous implementation
- alphabetic order is the same as temporal order
- easier to compare lines in a table
- uncoupled from the language selection: English speaking users are not forced to use US format
2024-03-27 09:58:17 +01:00
OlivierFL
ae780c9bb5 feat(lite): disable navigation to WiP views via tabs (#7482) 2024-03-27 09:42:27 +01:00
OlivierFL
8614add711 feat(lite/web-core): update tab component (#7481)
Update Tab component to match design system:
- use new styles from design system
- move components into `web-core`
2024-03-27 09:17:01 +01:00
Julien Fontanet
1221b23edf fix(xo-server): USB_group has multiple PSUBs/VUSBs (#7483)
Multiple objects, the fields name should be plural.

Introduced by 73ad9c1e7
2024-03-26 14:58:58 +01:00
Julien Fontanet
5da9593ce0 fix(fs/local#getInfo): fix size for huge remote
Fixes zammad#23139

Implement own parsing instead of `@sindresorhus/df` which breaks when headers
and values are not correctly aligned (i.e. big sizes).

This simple parsing should be good enough.

See @sindresorhus/df#13
2024-03-26 11:18:27 +01:00
Julien Fontanet
583c728095 fix(xen-api/putResource): fix proxy and HTTPS support (#7508)
Fixes #7477 #7490 #7496 #7499 #7502

Introduced by 6c16055a1

`putResource()` is not using `undici` for the moment because it needs
work to make it work with the work-around for chunked encoding not
supported in XAPI.
2024-03-25 16:29:36 +01:00
Julien Fontanet
7564bdb402 feat(xo-web/user): show user auth tokens last use
More important than when a token has been created is when and by how it was used last.
2024-03-25 14:50:25 +01:00
Julien Fontanet
1267112272 feat(xo-server/authentication): save token last use info 2024-03-25 14:50:25 +01:00
Pierre Donias
2692a2d3f3 fix(lite/console): prevent duplicate consoles on error (#7505)
When a console connection fails, we wait before trying again. While waiting,
the user may open another console, which creates a new VNC Client, and renders
the console. Therefore, when we're done waiting, we must first check that
`vncClient` is `undefined` so that we don't create 2 instances of `VncClient`.
2024-03-25 14:10:57 +01:00
Julien Fontanet
2fc393b907 fix(xen-api/examples/export-vdi): proxy variable 2024-03-25 13:26:34 +01:00
Julien Fontanet
69060e8af9 feat(xen-api/examples/{ex,im}port-vdi): support HTTP proxy 2024-03-25 10:23:22 +01:00
Julien Fontanet
07a4f5a535 chore(xen-api): make examples deps dev deps 2024-03-25 10:23:22 +01:00
Thierry Goettelmann
a48fc72570 feat(web-core): enhance tooltip directive (#7491) 2024-03-25 10:22:13 +01:00
OlivierFL
7c73e80591 feat(lite/core): update UiButton component (#7450) 2024-03-25 10:14:40 +01:00
OlivierFL
7f2c84d88e feat(web-core): add new chip component (#7485) 2024-03-25 10:04:22 +01:00
OlivierFL
a7f56a125c feat(web-core): move UiStore into web-core (#7486) 2024-03-25 10:03:43 +01:00
OlivierFL
42e3067f7f feat(web-core): add new tag component (#7488) 2024-03-25 09:54:28 +01:00
OlivierFL
f4a1395581 feat(web-core): move menu components to web-core (#7489) 2024-03-25 09:54:02 +01:00
Mathieu
214b8ce19e feat(xo-web/license): ability to rebind licenses (#7390) 2024-03-22 10:02:00 +01:00
b-Nollet
1b5157e9a7 feat(xo-web): edit default SR in pool advanced tab (#7451)
Fixes #7414
2024-03-21 16:30:48 +01:00
Mathieu
0c4275df48 fix(xo-server/xostor): fix group-name for thick provisioning (#7494)
For thick provisioning, group-name must be `linstor_group`

Introduced by 2ff45c6
2024-03-21 15:41:34 +01:00
Florent BEAUCHAMP
98eb9aa8e8 feat(xo-web): implement manifest for XO5 (#7462) 2024-03-21 11:45:38 +01:00
b-Nollet
cf5db2de8f feat(xo-server): replug VIFs and PIFs when MTU is modified (#7443)
Unplug and replug VIFs and PIFs when network MTU is modified, to update their MTU value.

See https://xcp-ng.org/forum/post/72431
2024-03-21 10:02:16 +01:00
b-Nollet
b8177a7bad feat(xo-server-load-balancer): balance vCPUs option (#7333)
Adding an option for performance mode to balance VMs on hosts depending on their number of vCPUs and the number of CPUs of the host. See #5389
2024-03-20 17:11:36 +01:00
Julien Fontanet
a4465c389c fix(xo-server/deployProxy): let consumers remove XenStore entries
This will fix some issues, like xoa-updater registration when the
XO Proxy Appliance do not have Internet access on first boot.
2024-03-20 15:25:44 +01:00
Julien Fontanet
32836cb09e fix(xo-server/getProxyApplianceUpdaterState): ignore configure error
Log the error instead of throwing to keep things working as much as possible.
2024-03-20 10:48:20 +01:00
OlivierFL
e52b18f4e3 feat(lite/web-core): update UiCounter component (#7438)
- move component into `web-core`
- add size `large`
- add `suffix` prop to add text information after the value
2024-03-19 10:04:50 +01:00
OlivierFL
c0a576bc95 feat(lite): use redesigned typography (#7474) 2024-03-19 09:30:07 +01:00
Julien Fontanet
1d912bddab fix(xo-server): pass user IP to authenticateUser 2024-03-18 14:15:34 +01:00
Florent BEAUCHAMP
856961221f test(xo-vmdk-to-vhd): fix reference file path (#7402)
the xsd is not bundled in dist, the tests are run from the dist folder
2024-03-18 10:30:02 +01:00
Julien Fontanet
ac9461be21 fix(xo-server/getProxyApplianceUpdaterState): ignore missing appliance.updater.configure
Introduced by 215577b31
2024-03-18 09:22:03 +01:00
Julien Fontanet
e8c9e620ca fix(xo-server): HTTP proxy support for consoles
Introduced by 6c16055a1

Fixes #7476
2024-03-18 09:13:44 +01:00
Julien Fontanet
215577b313 feat(xo-server/upgradeProxyAppliance): try via API first
It's faster than rebooting the VM.

Attempting this method before falling back to the other one is more robust in
case one of the methods do not work.
2024-03-15 17:40:09 +01:00
Julien Fontanet
8e5d94dd31 fix(xo-web/proxies): can upgrade without vmUuid
Since 572359892
2024-03-15 17:38:15 +01:00
Julien Fontanet
92a3236d59 feat(xo-server/getProxyApplianceUpdaterState): set channel 2024-03-15 17:06:36 +01:00
Julien Fontanet
505aa9278a feat(proxy/api): new method appliance.updater.configure
Allows configuring the updater channel.
2024-03-15 17:06:36 +01:00
Dan Pollak
e8c6f5bad0 docs: add mirror backup to side menu (#7457)
Fixes #7416
2024-03-15 12:55:09 +01:00
Julien Fontanet
6c16055a18 fix(xen-api): various undici fixes (#7472)
* fix(xen-api): various undici fixes

Fixes #7465

Introduced by bfb8d3b29

- don't use single Client as it allows a single parallel request by default
- fix HTTP proxy support (for all methods but `putResource()`
- follow redirects
- `getResource` respect configured protocol
- properly throws on non 2xx responses
2024-03-15 11:06:24 +01:00
Julien Fontanet
c6451cfa35 feat(xo-cli): support OTP 2024-03-14 16:59:46 +01:00
Julien Fontanet
4b59ef5414 fix(xo-server/authenticateUser): check OTP
Fixes zammad#22688
2024-03-14 16:59:46 +01:00
Julien Fontanet
0ccfd4b681 fix(self-signed): do not log private key 2024-03-14 13:51:31 +01:00
MlssFrncJrg
66ee45f52a feat(xo-web/tag): show current tags in Advanced tag creation (#7434)
Fixes #7351
2024-03-14 11:22:29 +01:00
Dan Pollak
54dc3fe9bd fix(xo-web/log-alert-body): fix 'an error has occurred' (#7458) 2024-03-12 16:48:23 +01:00
b-Nollet
bfb8d3b29e chore(xen-api): http-request-plus → undici (except putResource) (#7177) 2024-03-12 11:22:12 +01:00
Thierry Goettelmann
51f95b3c85 feat(web-core): new ButtonIcon component (#7447) 2024-03-12 11:18:20 +01:00
Thierry Goettelmann
8381dba0f0 feat(web-core): new collection management (#7400)
New way to manage collections and sub-collections of items.
It handles different informations (id, label, depth, css classes etc.), status
(active, selected, expanded, etc.), filtering, actions (activate, select, select
children etc.), optional multi-select and generation of selection label (`Foo`,
`Foo, Bar, Baz`, `5 items selected`)
2024-03-12 11:02:25 +01:00
Thierry Goettelmann
a1def028f0 feat(web-core): new dropdown components (#7420)
New `DropdownList`, `DropdownTitle` and `DropdownItem` components, based on Design System.
2024-03-12 10:54:39 +01:00
Thierry Goettelmann
334bad8f27 feat(lite/stories): add web-core + enhancements (#7446)
- Rework story generator to include Web Core + better prop typing
- Replace existing icons with ones more suited to the project (Pool, Host, VM, etc.)
2024-03-12 10:51:07 +01:00
Thierry Goettelmann
acb890c779 docs(web-core): add CSS guidelines (#7454)
Add CSS guidelines for:
- Interactive elements
- Variants
2024-03-12 10:48:04 +01:00
Thierry Goettelmann
c10e3fd48f feat(web-core): redesigned typography (#7460) 2024-03-11 16:34:49 +01:00
Julien Fontanet
6848e34701 fix(CHANGELOG): add missing released packages 2024-03-11 14:54:00 +01:00
Julien Fontanet
58739d7fd2 feat(otp): ignore whitespaces
Some OTP applications (e.g. Authy) add them for nicer display.
2024-03-11 12:39:04 +01:00
Dan Pollak
7e66a4cb06 docs: xoa is default SSH account (#7456)
Fixes zammad#22547
2024-03-11 11:13:25 +01:00
Julien Fontanet
5a63b8dc78 chore: update dev deps 2024-03-11 11:05:06 +01:00
Thierry Goettelmann
6056a618c3 fix(web): add missing vue-router dependency (#7453) 2024-03-08 10:33:07 +01:00
Julien Fontanet
553605343c chore: update dev deps 2024-03-07 15:17:50 +01:00
Julien Fontanet
e14ce2215d docs: XOA default iface is now called enX0 (#7448) 2024-03-07 09:30:31 +01:00
Julien Fontanet
2e002de774 feat(xo-server/createVm): create VTPM if template requests it (#7436)
See https://team.vates.fr/vates/pl/d3mb7wb5fiy57pmp44wnusatce (private page)

Should fix https://www.youtube.com/watch?v=MqHuNu4hjJo
2024-03-06 11:52:51 +01:00
mathieuRA
1ae7b1d500 fix(xo-web/VM): SR no longer required if a migration network is selected 2024-03-06 11:23:50 +01:00
mathieuRA
6625d8f7af fix(xo-web/home/VM): do not migrate_send during VM migration if not needed
Fixes [Forum#8279](https://xcp-ng.org/forum/topic/8279/getting-errors-when-migrating-4-out-5-vmguest/18?_=1707234126297)
2024-03-06 11:23:50 +01:00
mathieuRA
7cfce7b1b6 fix(xo-server/xapi_migrateVm): use correct SR during VDI migration 2024-03-06 11:23:50 +01:00
Mathieu
e52a0bd3df fix(xo-web/SR): destination SRs are ISOs if we are migrating ISOs (#7431)
Fixes #7392
2024-03-06 11:05:55 +01:00
Julien Fontanet
48e6d582a7 feat: release 5.92.1 2024-03-06 10:18:55 +01:00
Mathieu
37c2cfd99e feat(xo-server/XOSTOR): add error case for 'LVM_ERROR(5) (#7428) 2024-03-05 17:50:39 +01:00
Julien Fontanet
50991582ef feat(xo-web): 5.140.0 2024-03-05 17:37:04 +01:00
Julien Fontanet
85a1d539d7 feat(xo-server): 5.138.1 2024-03-05 17:13:18 +01:00
Mathieu
0b00c1a654 fix(xo-server/xostore.create): remove linstor_group on failure (#7426)
Related to zammad#21209
2024-03-04 14:42:06 +01:00
Julien Fontanet
da51b1649c fix(xo-server/robots.txt): must not require authentication
Introduced by a2c36c083

This file is intended for search engines, which, by definition are not signed in.
2024-03-04 11:48:34 +01:00
Dan Pollak
8ad83f0e97 docs(backup): fix link to file level restore (#7421) 2024-03-04 11:15:31 +01:00
Mathieu
54f9be5b2c fix(xo-web/XOSTOR): move 'ignore file sytems' outside of advanced settings (#7429)
Move the toggle outside of advanced settings as its use is very common.
2024-03-04 10:45:53 +01:00
Mathieu
c8778fe2ab feat(xo-web/about): github links opens in a new tab (#7430)
Fixes #7427
2024-03-04 10:40:09 +01:00
Pierre Donias
dcdf2880aa fix(lite): missing color for logo (#7423)
Introduced by 5242affdc1
2024-03-01 11:39:49 +01:00
Julien Fontanet
6e4f79ce33 fix(xo-web/jobs): handle undefined refs.params
Fixes zammad#22196

Introduced by be452a5d6
2024-03-01 11:09:13 +01:00
Julien Fontanet
c2b4033ac3 feat: CONTRIBUTING.md
This file contains documentation to help people contributing to the project,
either by participating on the community forum, reporting issues, or creating
a PR on the documentation or the code.

Most of it was created by https://generator.contributing.md/
2024-03-01 09:45:47 +01:00
b-Nollet
25982cab61 feat: release 5.92.0 (#7425) 2024-02-29 15:50:22 +01:00
b-Nollet
2560b782c1 feat: technical release (#7424) 2024-02-29 14:33:12 +01:00
MlssFrncJrg
649c117461 feat(xo-web/SR): show suspend VDIs VMs (#7391) 2024-02-29 11:09:33 +01:00
Mathieu
aef6e02dc5 feat(xo-web/VUSB): ability to create VUSB (#7412)
See #7409
2024-02-29 11:07:28 +01:00
Pierre Donias
14e59c2d6e feat(lite): 0.2.0 (#7422) 2024-02-29 10:41:04 +01:00
OlivierFL
7cb2f2298d feat(xo6/core): use same-name shorthand syntax in templates (#7419) 2024-02-28 18:04:00 +01:00
MlssFrncJrg
9cb94010fe feat(xo-web/host/advanced): list PUSB devices (#7409) 2024-02-28 16:02:46 +01:00
b-Nollet
5def18902b feat: technical release (#7418) 2024-02-28 15:33:24 +01:00
Mathieu
71991d7172 feat(xo-server/resourceSet): add 'usage' property resourceSet (#7353)
See Zammad#20996

Show used resources even when they are unlimited
2024-02-28 14:40:37 +01:00
Pierre Donias
561e94fee0 fix(xo-web/Text): replace spaces with nbsp so that the text is always clickable (#7411)
See https://xcp-ng.org/forum/topic/8466
2024-02-28 11:39:34 +01:00
Mathieu
be9fd95761 fix(xo-server/sr.createSmb): fix 'SR_BACKEND_FAILURE_111' by correctly passing username (#7407)
Fixes #7356
Introduced by 06d4115
2024-02-28 11:04:41 +01:00
Florent Beauchamp
ccdd6e2b42 docs(backups/mirror): health check only applied on the last transferred 2024-02-28 10:47:44 +01:00
Florent Beauchamp
6f8b7b5051 fix(backups/MixinRemoteWriter): don't run healthcheck if nothing has been transferred 2024-02-28 10:47:44 +01:00
Florent Beauchamp
90ea05ae11 fix(backups/AbstractRemoteVmBackupRunner): correctly store settings 2024-02-28 10:47:44 +01:00
Florent BEAUCHAMP
8bdba77452 fix(vmware-explorer): correctly handle IDE disks (#7394)
Fixes zammad#21585

Previous implementation was only parsing the scsi part of the vm metadata file ( .vmx).

This commit also looks at the ide part and add them to the disk list to be handled ( transferred to XCP) ,while ignoring the cdrom
2024-02-28 10:33:45 +01:00
OlivierFL
493d072d77 feat(xo6/core): improve color context (#7398) 2024-02-28 09:56:49 +01:00
OlivierFL
8fd501c6a2 feat(xo6/core): custom scrollbars (#7364) 2024-02-28 09:54:15 +01:00
Florent BEAUCHAMP
cb843c4432 fix(xo-web/backup): typo (#7415)
Fixes #7413
2024-02-28 09:42:24 +01:00
OlivierFL
60c527ad3c feat(xo6/core): add UI tree-view components in web-core (#7339) 2024-02-28 09:41:29 +01:00
mathieuRA
b85797482f feat(xo-web/backup): add 'nRetriesVmBackupFailures' input 2024-02-27 17:49:40 +01:00
mathieuRA
73edf72ebd feat(@xen-orchestra/backups): retry if VM fails 2024-02-27 17:49:40 +01:00
b-Nollet
611cd81e49 feat(xo-server): minimum MTU value for network creation
Co-authored-by: Mathieu <70369997+MathieuRA@users.noreply.github.com>
2024-02-27 17:36:52 +01:00
b-Nollet
354dd98ec4 feat(xo-web,xo-server): edit MTU 2024-02-27 17:36:52 +01:00
b-Nollet
73ad9c1e73 feat(xo-server): implement VUSB API (#7399) 2024-02-27 16:25:49 +01:00
Mathieu
24a75babef fix(xo-web/SR): fix 'smbiso' SR creation (#7405)
Fixes #7355
See https://xcp-ng.org/forum/topic/8417
Introduced by 06d4115
2024-02-27 10:16:24 +01:00
Julien Fontanet
f722362fd6 fix(xo-server/backupNg.getLogs): fix after handling
Fixes zammad#22192
2024-02-26 16:14:04 +01:00
b-Nollet
a03d165a5f feat: technical release (#7408) 2024-02-26 16:10:52 +01:00
Julien Fontanet
c13b95ee8b feat(xo-server,xo-web): manage auto poweron at pool level (#7401)
Fixes zammad#21691
2024-02-26 11:39:23 +01:00
b-Nollet
b4c39d5b59 fix(backups/VmsRemote): avoid tasks for empty VM directories (#7340)
See zammad#15136

Prevents task creation for empty directories during mirror backup.
2024-02-26 11:27:39 +01:00
Julien Fontanet
41a8a7214f fix(backups/cleanVms): remove incorrect warning (#7406) 2024-02-23 17:09:20 +01:00
Julien Fontanet
5d82f2696e fix(xo-web/new-vm): handle both template_info.disks and VDIs
Related to 3be45c7f4
2024-02-23 16:35:32 +01:00
Julien Fontanet
1c43c9e258 fix(xo-web/new-vm): respect fast clone setting
Fixes zammad#21432
Introduced by 0d4733252
Revealed by 302f7fb85
2024-02-23 16:35:32 +01:00
Julien Fontanet
192326201f fix(xo-web/SelectVmTemplate): fix group by pool
Fixes https://xcp-ng.org/forum/post/72009

Introduced by 1718649e0
2024-02-23 14:42:06 +01:00
Mathieu
089704dbe8 feat(docs): add VM migration spec (#7378)
See #7360
2024-02-23 11:08:44 +01:00
mathieuRA
aefcce45ff feat(xo-server/pusb): implement methods for USB passthrough 2024-02-22 14:58:55 +01:00
mathieuRA
367fb4d8a6 feat(xo-server): implement PUSB in xapi-object-to-xo 2024-02-22 14:58:55 +01:00
Julien Fontanet
e54a0bfc80 fix(xo-web/iso-device): fix SR predicate
Introduced by 1718649e0
2024-02-22 10:58:11 +01:00
Julien Fontanet
9e5541703b fix(xo-web/host): only count memory of running VMs
Introduced by 1718649e0

FIxes https://xcp-ng.org/forum/post/71886
2024-02-22 10:31:06 +01:00
Mathieu
039d5687c0 fix(xo-server/host): fix false positives when restarting host after updates (#7366)
The previous implementation only considered version upgrades and did not take into account the installation of missing patches.

See zammad#21487
Introduced by 85ec261
2024-02-21 15:05:05 +01:00
Florent Beauchamp
b89195eb80 fix(backups/IncrementalRemote): ensure chaining is ok and mutualize code with IncrementalXapi 2024-02-21 10:27:56 +01:00
Florent Beauchamp
822cdc3fb8 refactor(backups/IncrementalRemoteWriter): reuse parent path from checkBaseVdis 2024-02-21 10:27:56 +01:00
Florent Beauchamp
c7b5b715a3 refactor(backups/checkBaseVdi): use uuid, don't check vhd multiple times 2024-02-21 10:27:56 +01:00
Florent Beauchamp
56b427c09c fix(vhd-lib/VhdSynthetic): compression type computation 2024-02-21 10:27:56 +01:00
Mathieu
0e45c52bbc feat(lite/xapi-stats): handle new format (#7383)
Similar to 757a8915d9

Starting from XAPI 23.31, stats are in valid JSON but numbers are encoded as strings.
2024-02-20 17:55:57 +01:00
Mathieu
4fd2b91fc4 feat(xo-web/SizeInput): added 'TiB' and 'PiB' units (#7382) 2024-02-20 17:43:21 +01:00
Florent BEAUCHAMP
7890320a7d fix(xo-server/import): error during import of last snapshot of running VM (#7370)
From zammad#21710

Introduced by 2d047c4fef
2024-02-20 17:39:39 +01:00
Julien Fontanet
1718649e0c feat(xo-server/vm.$container): points to host if VDI on local SR
Fixes https://xcp-ng.org/forum/post/71769
2024-02-20 16:49:53 +01:00
Julien Fontanet
7fc5d62ca9 feat(xo-server/rest-api): export hosts' SMT status
Fixes https://xcp-ng.org/forum/post/71374
2024-02-20 16:33:33 +01:00
Julien Fontanet
eedaca0195 feat(xo-server/remotes): detect, log and fix incorrect params (#7343) 2024-02-16 16:23:06 +01:00
Julien Fontanet
9ffa52cc01 docs(xoa): manual network config 2024-02-16 11:25:34 +01:00
Julien Fontanet
e9a23755b6 test(fs/path/normalizePath): test relative paths handling
Related to 5712f29a5
2024-02-15 10:10:44 +01:00
Julien Fontanet
5712f29a58 fix(vhd-lib/chainVhd): correctly handle relative paths 2024-02-15 09:14:32 +01:00
Julien Fontanet
509ebf900e fix(fs/path/relativeFromFile): correctly handle relative paths 2024-02-15 09:13:10 +01:00
Julien Fontanet
757a8915d9 feat(xo-server/xapi-stats): handle new format
Starting from XAPI 23.31, stats are in valid JSON but numbers are encoded as strings.
2024-02-14 16:14:43 +01:00
Thierry Goettelmann
35c660dbf6 feat(xo-stack): add @core alias to import Core from Web and Lite (#7375) 2024-02-14 14:43:23 +01:00
Julien Fontanet
f23fd69e7e fix(xapi/VIF_create): fetch power_state and MTU in parallel 2024-02-14 11:48:07 +01:00
Julien Fontanet
39c10a7197 fix(xapi/VIF_create): explicit error when no allowed devices
Related to #7380
2024-02-14 11:48:07 +01:00
Julien Fontanet
7a1bc16468 fix: respect logger method signature
This is a minor fix that should not have major impacts.

It's not necessary to release impacted packages.
2024-02-13 17:38:03 +01:00
Julien Fontanet
93dd1a63da docs(log): document method signature 2024-02-13 17:35:58 +01:00
Florent Beauchamp
b4e1064914 fix(backups): _isAlreadyTransferred is async
This leads to a retransfer and a EEXIST error while writing the metadata.

It can happen when a mirror transfer to multiple remotes, fails on one remote and is restarted/resumed.
2024-02-13 16:03:45 +01:00
Florent Beauchamp
810cdc1a77 fix(backups): really skip already transferred backups 2024-02-13 16:03:45 +01:00
Julien Fontanet
1023131828 chore: update dev deps 2024-02-12 20:47:05 +01:00
Smultar
e2d83324ac chore: add name and version to root package.json (#7372)
Fixes #7371
2024-02-12 16:59:50 +01:00
Julien Fontanet
7cea445c21 fix(xo-web/remotes): don't merge all properties into url
Related to #7343

Introduced by fb1bf6a1e7
2024-02-12 14:51:04 +01:00
Julien Fontanet
b5d9d9a9e1 fix(xo-server-audit): ignore tag.getAllConfigured
Introduced by 25e270edb4
2024-02-12 10:58:06 +01:00
Julien Fontanet
3a4e9b8f8e chore(xo-web/config): remove unused computeds
Introduced by 01302d7a60
2024-02-12 10:55:58 +01:00
Julien Fontanet
92efd28b33 fix(xo-web/config): sort backups from newest to oldest
Introduced by 01302d7a60
2024-02-12 10:55:26 +01:00
Julien Fontanet
a2c36c0832 feat(xo-server): add robots.txt
Fixes zammad#21489
2024-02-09 11:25:06 +01:00
Florent BEAUCHAMP
2eb49cfdf1 feat: release 5.91.2 (#7367) 2024-02-09 11:10:59 +01:00
Florent BEAUCHAMP
ba9d4d4bb5 feat: technical release (#7365) 2024-02-09 10:09:09 +01:00
b-Nollet
18dea2f2fe fix(xo-server-load-balancer): create simple plan as in config (#7358)
Previously, a density plan was created when simple plan was selected in load-balancer configuration.
2024-02-08 18:14:08 +01:00
Julien Fontanet
70c51227bf feat(xo-server/rest-api): expose messages
Fixes zammad#21415
2024-02-08 11:25:05 +01:00
Julien Fontanet
e162fd835b feat(xo-server/rest-api): add /groups/:id/users and /users/:id/groups collections
Fixes https://xcp-ng.org/forum/post/70500
2024-02-08 11:23:17 +01:00
Julien Fontanet
bcdcfbf20b feat(xo-server/rest-api): add groups collection
See https://xcp-ng.org/forum/post/70500
2024-02-08 11:23:17 +01:00
Julien Fontanet
a6e93c895c chore(xo-server/rest-api): unify collections handling 2024-02-08 11:23:17 +01:00
Julien Fontanet
5c4f907358 chore(xo-server/rest-api): move :object handling to the collection 2024-02-08 09:56:04 +01:00
Julien Fontanet
e19dbc06fe chore(xo-server/rest-api): uniformize collections creation 2024-02-08 09:06:53 +01:00
Julien Fontanet
287378f9c6 fix(xo-web): changing items per page should select page 1
Fixes #7350
2024-02-07 16:03:53 +01:00
b-Nollet
83a94eefd6 fix(xo-server-load-balancer): error during optimize (#7362)
Introduced by d949112

Fixes #7359
2024-02-07 15:48:10 +01:00
Julien Fontanet
92fc19e2e3 fix(xo-server/api): never log proxy.getApplianceUpdaterState
Due to xo-web's subscription, there can be a lot of errors in case of XO Proxy failures.
2024-02-07 11:42:21 +01:00
Julien Fontanet
521d31ac84 feat(xo-server/logs-cli): display number of deleted entries 2024-02-07 11:42:21 +01:00
Florent BEAUCHAMP
2b3ccb4b0e fix(xo-server/vm.importFromEsxi): userdevice is a string (#7361)
Introduced by 59cc418973

From zammad#82017 and other tickets
2024-02-07 10:24:50 +01:00
Julien Fontanet
2498a4f47c feat: release 5.91.1 2024-02-06 17:18:47 +01:00
Julien Fontanet
dd61feeaf3 feat(xo-server): 5.135.1 2024-02-06 16:41:06 +01:00
Julien Fontanet
7851f8c196 feat(@xen-orchestra/xva): 1.0.2 2024-02-06 16:41:05 +01:00
Julien Fontanet
404a764821 feat(@xen-orchestra/immutable-backups): 1.0.1 2024-02-06 16:40:52 +01:00
Florent Beauchamp
59cc418973 fix(xva): disk order import 2024-02-06 15:00:08 +01:00
Florent Beauchamp
bc00551cb3 fix(xva): off by one
if last block is not already written we must write it, not the next bloxk
2024-02-06 15:00:08 +01:00
Florent Beauchamp
4d24248ea2 fix(xva): missing await 2024-02-06 15:00:08 +01:00
Florent BEAUCHAMP
5c731fd56e fix(xva): align block size 2024-02-06 15:00:08 +01:00
Florent BEAUCHAMP
79abb97b1f fix(xva): last block path
the last block may be added by a different code path where the block counter wasn't padded, leading to trying to allocate a few Ettabytes
2024-02-06 15:00:08 +01:00
Florent BEAUCHAMP
3314ba6e08 fix(xva): write block from time to time to handle timeout
when the source VM is very sparse, a long time can pass between write to xapi, triggering a timeout
2024-02-06 15:00:08 +01:00
Florent Beauchamp
0fe8f8cac3 fix(xo-server/migrate-vms): use thin mode for vhdraw
when importing a snapshot, the parent (raw) does not need to go through a full read
to generate a thin BAT
2024-02-06 15:00:08 +01:00
Julien Fontanet
aaffe8c872 fix(xo-server/rest-api): fix incorrect object's tasks href
Introduced by f3c5e817a

`req.baseUrl` is already handled by `sendObjects`.
2024-02-05 13:38:14 +01:00
Julien Fontanet
cf0e820632 fix(xo-server/rest-api): fix empty object's tasks list
Introduced by 1da05e239

Since task data were moved into properties, the relation between an object and
its tasks was incorrectly checked which led to an abnormal empty tasks list.
2024-02-05 13:38:14 +01:00
Julien Fontanet
82fdfbd18b fix(xo-server/_createProxyVm): {,_}getOrWaitObject
Introduced by 48c3a65cc
2024-02-05 13:38:14 +01:00
OlivierFL
116f2ec47a fix(ISSUE_TEMPLATE/bug_report): verbatim error field (#7357) 2024-02-05 12:42:16 +01:00
Julien Fontanet
5d4723ec06 fix(xo-server/vm.import): fix fetching UUID from ref
Introduced by 70b09839c
Reported by @ydirson

This led to `UUID_INVALID(VM, OpaqueRef:...)` when importing from URL.
2024-02-02 16:47:55 +01:00
Julien Fontanet
092475d57f chore: update to tap@18 2024-02-02 12:52:11 +01:00
Julien Fontanet
e7a97fd175 test(audit-core,predicates,otp,xo-server): move from tap to test
Support of Mocha syntax is much easier than in latest versions of tap
2024-02-02 12:52:11 +01:00
Julien Fontanet
2262ce8814 chore(async-each): remove unused dev dep tap 2024-02-02 12:52:11 +01:00
Julien Fontanet
7ec64476a4 chore: remove unused script ci 2024-02-02 12:52:02 +01:00
Julien Fontanet
bbb43808dd fix(ci): run unit tests 2024-02-02 12:52:02 +01:00
Florent Beauchamp
02d7f0f20b fix(immutable-backups): handle index files too big 2024-02-02 11:28:28 +01:00
Florent Beauchamp
e226db708a fix(immutable-backups): since index is not immutable anymore we should consider an EPERM Error as relevantt 2024-02-02 11:28:28 +01:00
Florent Beauchamp
b7af74e27e fix(immutable-backups): fix variable name errors 2024-02-02 11:28:28 +01:00
Florent Beauchamp
70f2e50274 fix(immutable-backups): index files aren't immutable anymore 2024-02-02 11:28:28 +01:00
Florent Beauchamp
619b3f3c78 test(immutable-backups): add missing tests 2024-02-02 11:28:28 +01:00
Florent Beauchamp
ac182374d6 fix(immutable-backups): tests
introduced by ed7046c1ab
these tests need to be run by root in a linux system => move them to integ.mjs
2024-02-02 11:28:28 +01:00
Florent BEAUCHAMP
8461d68d40 fix(xva): use a buildless dependency for hashes (#7348)
Native dependencies can have some problems on closed systems

Introduced by 2d047c4fef
2024-02-01 16:30:57 +01:00
Julien Fontanet
838f9a42d1 feat: release 5.91.0 2024-01-31 17:59:34 +01:00
Julien Fontanet
a9dbc01b84 feat(xo-web): 5.136.0 2024-01-31 17:34:53 +01:00
Julien Fontanet
5daf269ab3 feat(xo-server): 5.135.0 2024-01-31 17:34:41 +01:00
Julien Fontanet
383677f4dd feat(xo-cli): 0.26.0 2024-01-31 17:33:13 +01:00
Julien Fontanet
28ad2af9b0 feat(@xen-orchestra/proxy): 0.26.45 2024-01-31 17:25:02 +01:00
Julien Fontanet
53b25508af feat(@xen-orchestra/immutable-backups): 1.0.0 2024-01-31 17:22:51 +01:00
Julien Fontanet
54836ec576 fix(immutable-backups): package should be public
Introduced by ed7046c1a
2024-01-31 17:22:04 +01:00
Julien Fontanet
c9897166e0 feat(@xen-orchestra/backups): 0.44.6 2024-01-31 17:18:52 +01:00
Julien Fontanet
1b35fddf3d feat(@xen-orchestra/fs): 4.1.4 2024-01-31 17:16:15 +01:00
MlssFrncJrg
fc2ca1f4d4 fix(xo-web/pool/advanced): added delete button in backup/migration network (#7349)
Introduced by 0f1f459
2024-01-31 17:00:45 +01:00
Florent BEAUCHAMP
ed7046c1ab feat: immutable backups (#6928) 2024-01-31 16:57:28 +01:00
Julien Fontanet
215579ff4d fix(fs/Local#readFile): fix flags handling 2024-01-31 16:50:29 +01:00
Julien Fontanet
4c79a78a05 fix(fs): remove unnecessary/incorrect readFile param 2024-01-31 16:47:33 +01:00
Julien Fontanet
7864c05ee1 fix: race condition between normalize-packages and usage-to-readme
The first was writting `package.json` at the same time the second one was reading it.

The file is now read only once by `normalize-packages`.
2024-01-31 16:22:07 +01:00
Julien Fontanet
1026d18e4b fix(usage-to-readme): remove another debug log
Introduced by a62433081
2024-01-31 16:10:42 +01:00
Julien Fontanet
d62acd3fe7 fix: format with Prettier 2024-01-31 15:54:43 +01:00
Julien Fontanet
cc1b4bc06c feat(xo-server/rest-api): add pool action create_vm
Fixes #6749
2024-01-31 15:07:01 +01:00
Julien Fontanet
d45f843308 feat(xo-cli/rest): dot syntax for deep properties
`foo.bar=baz` can be used instead of `foo=json:'{ "bar": "baz" }'`.
2024-01-31 15:04:34 +01:00
b-Nollet
3c7fa05c43 feat: technical release (#7347) 2024-01-31 13:56:02 +01:00
MlssFrncJrg
05df055552 feat(xo-web/xostor): expose ignoreFileSystems at creation (#7338) 2024-01-31 13:07:24 +01:00
Pierre Donias
755b206901 chore(web): use relative asset URLs (#7337) 2024-01-31 11:51:40 +01:00
Julien Fontanet
3360399b2a fix(usage-to-readme): remove debug logs
Introduced by a62433081
2024-01-31 10:15:37 +01:00
Florent BEAUCHAMP
091bc04ace fix(xo-server): import of @xen-orchestra/xva package (#7346)
Fix https://github.com/vatesfr/xen-orchestra/issues/7344
Introduced by 2d047c4fef

Cause: we did not run the normalize-package command after renaming
2024-01-31 09:58:34 +01:00
Florent Beauchamp
3ab2a8354b feat(xo-web/import): all the import are thin, remove toggle 2024-01-30 18:54:46 +01:00
Florent Beauchamp
2d047c4fef feat(vmware/import): use xva to load base disk 2024-01-30 18:54:46 +01:00
Florent Beauchamp
0f1dcda7db feat(vmware-explorer): don't read from parent when delta block is already complete 2024-01-30 18:54:46 +01:00
Florent Beauchamp
44760668a3 feat(vmware-explorer): batch reading for sesparse delta 2024-01-30 18:54:46 +01:00
Julien Fontanet
a4023dbc54 feat(ci): ensure yarn.lock is up-to-date 2024-01-30 18:33:25 +01:00
Julien Fontanet
3cad7e2467 fix(yarn.lock): refresh
Introduced by 2e6f7d35e
2024-01-30 17:49:46 +01:00
Julien Fontanet
ad5f37436a fix(CHANGELOG.unreleased): add xo-server@minor
Introduced by 06d411543
2024-01-30 17:35:46 +01:00
MlssFrncJrg
8c05eab720 feat(xo-web/pool/patches): disable rolling pool update button (#7294)
Fixes https://github.com/vatesfr/xen-orchestra/issues/6415
2024-01-30 17:30:36 +01:00
Florent BEAUCHAMP
4db605f14a fix(backups/formatVmBackup): handle snapshotless backups (#7342)
Introduced by b48d955c44
2024-01-30 17:25:59 +01:00
MlssFrncJrg
06d411543a feat(xo-web/SR): add possibility to create SMB shared SR (#7330)
Fixes #991
2024-01-30 17:24:31 +01:00
MlssFrncJrg
6084db22a9 fix(xo-web/import/disk): can't change file name when importing from URL (#7332)
Fixes [#7326](https://github.com/vatesfr/xen-orchestra/issues/7326)
2024-01-30 15:04:27 +01:00
Thierry Goettelmann
2e6f7d35ef feat(xo6): setup file based router (#7318) 2024-01-30 11:31:58 +01:00
MlssFrncJrg
0f1f45953c fix(xo-web/pool/advanced): show backup/migration network even when deleted (#7303) 2024-01-30 11:28:43 +01:00
b-Nollet
89a4de5b21 feat: technical release (#7341) 2024-01-30 09:51:24 +01:00
Julien Fontanet
32dd16114e fix(xo-web/backup): smart mode preview should ignore xo:no-bak tags (#7331)
Introduced by 87a9fbe23

Fixes https://xcp-ng.org/forum/post/69797
2024-01-29 15:56:43 +01:00
Julien Fontanet
f5a3cc0cdb fix(xo-server/rest-api): handle empty fields param
Introduced by c18373bb0
2024-01-29 11:57:47 +01:00
Julien Fontanet
5cabf9916a feat(xo-server/rest-api): expose actions' params schema 2024-01-29 11:08:38 +01:00
OlivierFL
8e65ef7dbc feat(xo-web/logs): transform objects UUIDs into clickable links (#7300)
In Settings/Logs modals : transform objects UUIDs into clickable links, leading
to the corresponding object page.
For objects that are not found, UUID can be copied to clipboard.
2024-01-26 17:28:30 +01:00
Mathieu
0c0251082d feat(xo-web/pool): ability to do a rolling pool reboot (#7243)
Fixes #6885
See #7242
2024-01-26 17:08:52 +01:00
Pierre Donias
c250cd9b89 feat(xo-web/VM): ability to add custom notes (#7322)
Fixes #5792
2024-01-26 14:59:32 +01:00
Florent BEAUCHAMP
d6abdb246b feat(xo-server): implement rolling pool reboot (#7242) 2024-01-25 17:50:34 +01:00
Pierre Donias
5769da3ebc feat(xo-web/tags): add tooltips on xo:no-bak and xo:notify-on-snapshot tags (#7335) 2024-01-25 10:27:42 +01:00
Julien Fontanet
4f383635ef feat(xo-server/rest-api): validate params 2024-01-24 11:41:22 +01:00
Julien Fontanet
8a7abc2e54 feat(xo-cli/rest): display error response body 2024-01-24 11:23:43 +01:00
Julien Fontanet
af1650bd14 chore: update dev deps 2024-01-24 10:54:02 +01:00
Julien Fontanet
c6fdef33c4 feat(xo-server): web signin with auth token in query string (#7314)
Potential issue: the token stays in the browser history.
2024-01-24 10:02:38 +01:00
Florent BEAUCHAMP
5f73f09f59 feat(fuse-vhd): implement cli (#7310) 2024-01-23 17:14:18 +01:00
Thierry Goettelmann
1b0fc62e2e feat(xo6): introducing @xen-orchestra/web (#7309)
Introduces `@xen-orchestra/web`, which will be the home for the new incoming
Xen Orchestra v6.

It uses `@xen-orchestra/web-core` as a foundation.

Upgraded common dependencies of Lite/Web/Core.
2024-01-23 11:25:18 +01:00
Julien Fontanet
aa2dc9206d chore: format with Prettier
Introduced by 85ec26194
2024-01-23 11:02:28 +01:00
Mathieu
2b1562da81 fix(xo-server/PIF): IPv4 reconfiguration only worked when mode was updated (#7324) 2024-01-23 10:55:37 +01:00
Mathieu
25e270edb4 feat(xo-web,xo-server/tag): add colored tag (#7262) 2024-01-23 09:46:06 +01:00
MlssFrncJrg
51c11c15a8 feat(xo-web/pool): disable Rolling Pool Update if pool has 1 host (#7286)
See #6415
2024-01-22 11:04:38 +01:00
Julien Fontanet
47922dee56 fix(xo-server/patching): fix typo
Introduced by 901f7b3fe

Fixes #7325
2024-01-20 09:35:48 +01:00
Julien Fontanet
3dda4dbaad chore: format with Prettier 2024-01-19 16:42:10 +01:00
Julien Fontanet
901f7b3fe2 chore(xo-server): remove object properties decorator syntax
This syntax is not supported by Prettier.
2024-01-19 16:42:10 +01:00
Julien Fontanet
774d66512e feat(decorate-with): decorateObject() 2024-01-19 16:42:10 +01:00
b-Nollet
ec1669a32e feat(xo-server-load-balancer): limit concurrent migrations (#7297)
Fixes #7084
2024-01-19 16:37:55 +01:00
Florent BEAUCHAMP
bbcd4184b0 feat(xo-web,backups): fix dynamic disks count with suspend_VDI (#7315)
`suspend_VDI` was counted as a dynamic VHD.

This commit ignores it in the computation, but add a tag if the backup is with memory.
2024-01-19 16:34:06 +01:00
Mathieu
85ec26194b feat(xo-web/host): ask for confirmation to reboot the updated slave host if the master is not (#7293)
Fixes #7059

In case a slave host requires a reboot to apply updates and the master is using
the same version as the slave host, a confirmation modal is triggered.
2024-01-19 11:18:40 +01:00
MlssFrncJrg
f0242380ca feat(xo-web/tab-advanced): allow to update VM creator (#7276)
Related to [forum#7313](https://xcp-ng.org/forum/topic/7313/change-created-by-and-date-information)
2024-01-19 10:40:08 +01:00
Julien Fontanet
a624330818 fix(usage-to-readme): fix multiple .USAGE.md changes 2024-01-19 10:23:52 +01:00
Julien Fontanet
3892efcca2 feat(xo-web/plugins): auto-load follow load/unload (#7317)
Loading, or unloading, will respectively enable, or disable, _Auto-load at server start_,
this should lead to least surprising behaviors.
2024-01-19 09:55:36 +01:00
Mathieu
c1c122d92c feat(xo-web/pool/host): add warning if hosts don't have the same version (#7280)
Fixes #7059
2024-01-18 17:13:57 +01:00
Julien Fontanet
b7a66e9f73 chore(web-core): add missing npmignore
Follow-up of d92d2efc7
2024-01-18 13:29:30 +01:00
Julien Fontanet
d92d2efc78 chore(web-core): normalize package.json 2024-01-18 12:39:39 +01:00
Julien Fontanet
c2cb51a470 feat(lint-staged): add .USAGE.md → README.md
So that it's not needed to manually runs from `normalize-packages.js`.
2024-01-18 12:34:23 +01:00
Thierry Goettelmann
5242affdc1 feat(lite): introducing @xen-orchestra/web-core (#7302)
This PR introduces `@xen-orchestra/web-core`, which will be the common base for
XO Lite and XO 6.

This package is not meant to be distributed and will be used as-is in other
packages thanks to Yarn Workspace. This mean that the files of XO Web Core will
not be built by themselves but by either the package which use it.

Styles have been moved from XO Lite to XO Web Core.

Colors variable have been renamed and updated according to the new Design
System. XO Lite has been updated accordingly.
- `extra-blue` → `purple`
- `green-infra` → `green`
- `orange-world` → `orange`
- `red-vates` → `red`
- `blue-scale` → `grey`

⚠️ A new intermediate shade has been introduced (`--color-grey-400`). So
`--color-blue-scale-400` is now `--color-grey-500` and `--color-blue-scale-500`
is now `--color-grey-600`.

PostCSS color function plugin is used to generate the shades of color like it is
done on the Figma mockup (with blending the base color with black or white at
different degrees).

PostCSS custom media are now loaded globally thanks to a plugin and no longer
require to import `_responsive.pcss` file manually in each file where a custom
media was needed.
2024-01-18 10:04:25 +01:00
Dom Del Nano
71f3be288b feat(xo-server): add xenStoreData to XO VM objects (#7316)
The initial support added in #7055 to support terraform resource support doesn't provide read access to a VM's state.

Since Tterraform's model requires read and write access to the resource it's managing, this PR implements the missing piece for terra-farm/terraform-provider-xenorchestra#261.
2024-01-17 10:24:08 +01:00
OlivierFL
58769815b0 fix(xo-web/modal): close modal when navigating to another url (#7301) 2024-01-16 20:47:21 +01:00
Florent BEAUCHAMP
c81c23c0d0 fix(fuse-vhd): potential race condition in mount/unmount (#7312)
The code was not properly waiting mount/unmount to be done.
2024-01-16 18:27:30 +01:00
Julien Fontanet
f06f89b5b4 feat(self-signed): readCert utility (#7282)
Expired certificates are not automatically detected, which is not a big deal for user certificates because they can still be used and it's their responsibility to update them.

But automatic certificates must be regenerated in that case which was not the case until now.

This commit unifies certificate/key reading, checking and generation for both xo-server and xo-proxy.
2024-01-16 16:58:15 +01:00
Julien Fontanet
fa748ed9de feat(xo-server): load plugins from mono-repo
Contrary to 3e3ce543a8, which was reverted,
this implentation properly handle duplicates.
2024-01-16 15:54:12 +01:00
Julien Fontanet
cd753acff7 feat(xo-server): move plugin lookup paths to config 2024-01-16 15:51:45 +01:00
Julien Fontanet
8ff861e2be feat(xo-server): find plugins sequentially
This provides a deterministic order.

In case of duplicate plugins (with the same name), the first found plugin takes precedence.
2024-01-16 15:31:03 +01:00
Julien Fontanet
95ccb2e0ae feat(gitignore): ignore .tap/ 2024-01-16 14:02:33 +01:00
John P. Cooper
b0e5846ad1 feat(lite): introduce PWA manifest (#7291)
This implements the initial PWA manifest for XO Lite. I requested this several
months to a year ago, so decided to do it myself in the end.
2024-01-16 11:19:10 +01:00
OlivierFL
19fd456ccf fix(xo-web/metadata-restore-modal): add check to hide pool select when restoring xo config backup (#7287)
See https://xcp-ng.org/forum/topic/8130/xo-configbackup-restore
2024-01-16 11:13:01 +01:00
Julien Fontanet
7946a7db68 feat(xo-server/signin): uniformize sign in buttons
Make sign in with password button the same as external providers.
2024-01-16 10:36:04 +01:00
Julien Fontanet
6127e30574 feat(xo-server/signin): remember me with external providers
It works the same as password signin.
2024-01-16 10:36:04 +01:00
Julien Fontanet
4aad9d8e32 fix(xo-server-backup-reports): require Node>=15
Introduced by 2af74008b

Due to using AggregateError.
2024-01-16 10:10:42 +01:00
Julien Fontanet
78d15ddf96 chore: update dev deps 2024-01-16 09:59:16 +01:00
Pierre Donias
302f7fb85e fix(xo-web/new-vm): isDiskTemplate → _isDiskTemplate (#7311) 2024-01-15 16:51:55 +01:00
Thierry Goettelmann
ea19b0851f feat(lite): upgrade deps + root eslint config (#7292) 2024-01-15 11:12:53 +01:00
Julien Fontanet
b0c37df8d7 fix(xo-server/rest-api): /backup/log/<id>
Introduced by 037e1c1df

Fixes https://xcp-ng.org/forum/post/69426
2024-01-11 11:05:00 +01:00
Julien Fontanet
beba6f7e8d chore: format with Prettier 2024-01-11 09:57:28 +01:00
Julien Fontanet
9388b5500c chore(xo-server/signin): remove empty div 2024-01-10 17:17:42 +01:00
Julien Fontanet
bae8ad25e9 feat(xo-web/tasks): hide /rrd_updates by default
After an internal discussion with @Darkbeldin and @olivierlambert.
2024-01-10 16:50:03 +01:00
Julien Fontanet
c96b29fe96 docs(troubleshooting): explicit sudo with xo-server-recover-account 2024-01-10 16:48:34 +01:00
Julien Fontanet
9888013aff feat(xo-server/rest-api): add pool action emergency_shutdown
Fixes #7277
2024-01-10 15:55:14 +01:00
Julien Fontanet
0bbb0c289d feat(xapi/pool_emergencyShutdown): new method
Related to #7277
2024-01-10 15:55:14 +01:00
Julien Fontanet
80097ea777 fix(backups/RestoreMetadataBackup): fix data path resolution
Introduced by ad46bde30

Fixes https://xcp-ng.org/forum/post/68999
2024-01-10 15:39:41 +01:00
Julien Fontanet
be452a5d63 fix(xo-web/jobs/new): reset params on method change
Fixes https://xcp-ng.org/forum/post/69299
2024-01-10 14:05:02 +01:00
Julien Fontanet
bcc0452646 feat(CODE_OF_CONDUCT): update to Contributor Covenant 2.1 2024-01-09 16:36:29 +01:00
Julien Fontanet
9d9691c5a3 fix(xen-api/setFieldEntry): avoid unnecessary MAP_DUPLICATE_KEY error
Fixes https://xcp-ng.org/forum/post/68761
2024-01-09 15:10:37 +01:00
Julien Fontanet
e56edc70d5 feat(xo-cli): 0.24.0 2024-01-09 14:29:24 +01:00
Julien Fontanet
d7f4d0f5e0 feat(xo-cli rest get): support NDJSON responses
Fixes https://xcp-ng.org/forum/post/69326
2024-01-09 14:24:48 +01:00
Julien Fontanet
8c24dd1732 fix(xapi/host_smartReboot): disable the host before fetching resident VMs
Otherwise it might leads to race condition where new VMs appear on the
host but are ignored by this method.
2024-01-08 17:11:21 +01:00
Julien Fontanet
575a423edf fix(xapi/host_smartReboot): resume VMs even if host was originally disabled
The host will always be enabled after this method anyway.
2024-01-08 17:09:53 +01:00
Julien Fontanet
e311860bb5 fix(xapi/host/waitAgentRestart): wait for enabled status 2024-01-08 17:05:30 +01:00
Julien Fontanet
e6289ebc16 docs(rest-api): update TOC 2024-01-08 16:15:32 +01:00
Julien Fontanet
013e20aa0f docs(rest-api): task monitoring 2024-01-08 16:14:20 +01:00
Julien Fontanet
45a0a83fa4 chore(CHANGELOG.unreleased): sort packages 2024-01-08 14:46:17 +01:00
Guillaume de Lafond
ae518399fa docs(configuration): useForwardedHeaders (#7289) 2024-01-08 11:35:24 +01:00
Ronan Abhamon
d949112921 fix(load-balancer): bad comparison to evaluate migration in perf plan (#7288)
Memory is compared to CPU usage to migrate VM in performance plan context.

This condition can cause unwanted migrations.
2024-01-08 11:25:40 +01:00
Manon Mercier
bb19afc45c Update backups.md (#7283)
This change follows a discussion with Marc Pezin and Yannick on Mattermost.

As Yannick pointed out, the doc refers to a remote while there is no such option in XO GUI.
2024-01-06 15:25:51 +01:00
Julien Fontanet
7780cb176a fix(backups/_MixinXapiWriter#healthCheck): add_tag → add_tags
Fixes https://xcp-ng.org/forum/post/69156

Introduced by a5acc7d26
2024-01-06 15:16:51 +01:00
Julien Fontanet
74ff64dfb4 fix(xo-server/collection/redis#_extract): properly ignore missing entries
Introduced by d8280087a

Fixes #7281
2024-01-05 13:53:46 +01:00
Julien Fontanet
9be3c40ead feat(xo-server/collection/redis#_get): return undefined if missing
Related to #7281
2024-01-05 13:52:45 +01:00
OlivierFL
0f00c7e393 fix(lite): typings errors when running yarn type-check (#7278) 2024-01-04 11:33:30 +01:00
OlivierFL
95492f6f89 fix(xo-web/menu): don't subscribe to proxies if not admin (#7249) 2024-01-04 11:05:53 +01:00
Olivier Floch
046fa7282b feat(xo-web): open github issue url with query params when clicking on bug report button 2024-01-04 11:04:27 +01:00
Olivier Floch
6cd99c39f4 feat(github): add github issue form template 2024-01-04 11:04:27 +01:00
Julien Fontanet
48c3a65cc6 fix(xo-server): VM_import() returns ref, not record
Introduced by 70b0983
2024-01-04 09:36:42 +01:00
OlivierFL
8b0b2d7c31 fix(xo-web/menu): don't subscribe to unhealthy vdi chains if not admin (#7265) 2024-01-03 18:11:34 +01:00
Julien Fontanet
d8280087a4 fix(xo-server/collection/redis#_extract): don't ignore empty records 2024-01-03 17:11:50 +01:00
Julien Fontanet
c14261a0bc fix(xo-cli): close connection on sign in error
Otherwise the CLI does not stop.
2024-01-03 17:06:29 +01:00
Julien Fontanet
3d6defca37 fix(xo-server/emergencyShutdownhost): disable host first 2024-01-03 16:26:07 +01:00
Julien Fontanet
d062a5175a chore(xo-server/emergencyShutdownhost): unnecessary var 2024-01-03 16:25:12 +01:00
Julien Fontanet
f218874c4b fix(xo-server/_createProxyVm): {this → _app}.getObject
Fixes zammad#20646

Introduced by 70b0983
2024-01-03 10:58:19 +01:00
Julien Fontanet
b1e879ca2f feat: release 5.90.0 2023-12-29 11:03:07 +01:00
Julien Fontanet
c5010c2caa feat(xo-web): 5.133.0 2023-12-29 10:48:02 +01:00
Julien Fontanet
2c40b99d8b feat(xo-web): scoped tags (#7270)
Based on #7258 developed by @fbeauchamp.

- use inline blocks to respect all paddings/margins
- main settings are in easily modifiable variables
- text color is either black or white based on the background color luminance
- make sure tags and surrounding action buttons are aligned
- always display value in black on white
- delete button use tag color if dark, otherwise black
- Tag component accept color param
2023-12-28 23:10:35 +01:00
Mathieu
0d127f2b92 fix(lite): fix changelog entry (#7269) 2023-12-28 15:56:21 +01:00
Mathieu
0464886e80 feat(lite): 0.1.7 (#7268) 2023-12-28 15:49:09 +01:00
Mathieu
d655a3e222 feat: technical release (#7266) 2023-12-27 16:07:51 +01:00
b-Nollet
579f0b91d5 feat(xo-web,xo-server): restart VM to change memory (#7244)
Fixes #7069

Add modal to restart VM to increase memory.
2023-12-26 23:46:43 +01:00
Florent BEAUCHAMP
72b1878254 fix(vhd-lib/createStreamNbd): skip original table offset before overwriting (#7264)
Introduced by fc1357db93
2023-12-26 22:29:24 +01:00
MlssFrncJrg
74dd4c8db7 feat(lite/nav): display VM count in host when menu is minimized (#7185) 2023-12-26 13:30:23 +01:00
mathieuRA
ef4ecce572 feat(xo-server/PIF): add XO tasks for PIF.reconfigureIp 2023-12-26 11:22:35 +01:00
mathieuRA
1becccffbc feat(xo-web/host/network): display and edit the IPv6 PIF field 2023-12-26 11:22:35 +01:00
mathieuRA
b95b1622b1 feat(xo-server/PIF): PIF.reconfigureIp handle IPv6 2023-12-26 11:22:35 +01:00
Manon Mercier
36d6e3779d docs: XenServer → XCP-ng/XenServer (#7255)
I would like to replace every "XenServer" I find in the doc by "XCP-ng/XenServer".

This follows an internal conversation we had with Olivier and Yann.
2023-12-26 11:21:16 +01:00
Pierre Donias
b0e000328d feat(lite): XOA quick deploy (#7245) 2023-12-22 15:58:54 +01:00
Pierre Donias
cc080ec681 feat: technical release (#7259) 2023-12-22 15:05:17 +01:00
Julien Fontanet
0d4cf48410 feat(xo-cli rest): explicit error if not registered
Fixes https://xcp-ng.org/forum/post/68698
2023-12-22 11:33:08 +01:00
OlivierFL
2ec164c560 feat(xo-web/menu): add warning icon in proxies menu (#7237)
See Zammad#19126

Add a warning icon in Proxies menu if unable to check proxy upgrade
2023-12-22 09:53:00 +01:00
b-Nollet
d38dce9302 feat(xo-server/vm.stop): add forceShutdownDelay (#7247) 2023-12-22 09:13:36 +01:00
Florent BEAUCHAMP
4c775f6b86 fix(xo-server): missing data in mirror backup job (#7254)
Mirror Backup jobs weren't storing all the data necessary for sending the report
2023-12-21 17:39:39 +01:00
b-Nollet
dd6c858737 fix(xo-server): replacing wrong param name (#7256)
Introduced by 1da05e239d

When the `Task` class is imported from `@vates/tasks`, `Task.run()` parameter uses `properties` key instead of `data` . This is corrected in this PR.
2023-12-21 17:38:58 +01:00
Julien Fontanet
194db8d0dd fix(xo-server/Redis#{add,update}): return complete record
Introduced by 32afd5c46

Fixes https://xcp-ng.org/forum/post/68664

The returned record should not be serialized and should contain the identifier.
2023-12-21 15:47:11 +01:00
Julien Fontanet
5b00cf3ecd chore(xo-server/PluginMetadata#merge): don't return record 2023-12-21 15:47:11 +01:00
Julien Fontanet
afa957b305 chore(xo-server/updateCloudConfig): don't return record 2023-12-21 15:47:11 +01:00
Julien Fontanet
ea1921625e chore(xo-server/create{Group,User}): simplify code 2023-12-21 15:47:11 +01:00
Julien Fontanet
65a154a1b3 chore(xo-server/updateJob): don't return record 2023-12-21 15:47:11 +01:00
Julien Fontanet
2249c90be9 chore(xo-server/subjects): update accept array 2023-12-21 15:47:11 +01:00
Julien Fontanet
1b55d5e2b4 chore(xo-server/scheduling): use builtin (un)serialize 2023-12-21 15:47:11 +01:00
Julien Fontanet
9f5be8029a chore(xo-server/remotes): update accept array 2023-12-21 15:47:11 +01:00
Julien Fontanet
16458b953f chore(xo-server/jobs): use builtin (un)serialize 2023-12-21 15:47:11 +01:00
Julien Fontanet
d63a567a1c chore(xo-server/CloudConfigs): remove useless method 2023-12-21 15:47:11 +01:00
Florent Beauchamp
d36e10e73f feat(xo-server/rest-api): expose NBD settings in VDI exports 2023-12-21 11:54:08 +01:00
Florent Beauchamp
5d80a58754 fix(vhd-lib/createStreamNbd): fix off by one block length computation 2023-12-21 11:54:08 +01:00
Florent Beauchamp
77b14a316f feat(xo-server/vdi.exportContent): expose NBD settings 2023-12-21 11:54:08 +01:00
Florent BEAUCHAMP
213eb6a56a feat(xo-web/sr): show coalescing status (#7241) 2023-12-21 11:29:32 +01:00
OlivierFL
2c298ef47a fix(lite): infinite loader when no stats on pool dashboard (#7236) 2023-12-21 11:27:06 +01:00
Pierre Donias
b7b7af8cff fix(CHANGELOG): more specific description for mirror backup report fix (#7253)
Introduced by #7235
See https://github.com/vatesfr/xen-orchestra/pull/7235#discussion_r1431612789
2023-12-21 11:21:06 +01:00
Pierre Donias
5cf5d14449 feat: technical release (#7252) 2023-12-20 16:39:27 +01:00
Julien Fontanet
e0bf9ee9d5 fix(proxy): wait the HTTP server to listen 2023-12-20 15:23:48 +01:00
Florent BEAUCHAMP
54808967f6 fix(backups): handle undefined isVhdDifferencing (#7248)
Introduced by e13d55bfa9

Fixes https://xcp-ng.org/forum/post/68600
2023-12-20 15:23:23 +01:00
Pierre Donias
c63d38dc0f chore(lite): release script (#7219) 2023-12-20 15:07:10 +01:00
Mathieu
41ed5625be fix(xo-server/RPU): correctly migrate VMs to their original host (#7238)
See zamma#19772
Introduced by bea771
2023-12-19 19:22:50 +01:00
Mathieu
e66bcf2a5c feat(xapi/VDI_exportContent): create XAPI task during NBD export (#7228)
See zammad#19003
2023-12-19 19:16:44 +01:00
b-Nollet
c40e71ed49 fix(xo-web/backup): fix reportWhen being reset to undefined (#7235)
See Zammad#17506

Preventing `reportWhen` value from becoming undefined (and resetting to the
default value _Failure_) when a mirror backup is edited without modifying this
field.
2023-12-19 17:08:19 +01:00
Florent BEAUCHAMP
439c721472 refactor(backups/cleanVm) use of merge parameter 2023-12-19 15:42:59 +01:00
Florent Beauchamp
99429edf23 test(backups/cleanVm): fix after changes 2023-12-19 15:42:59 +01:00
Florent Beauchamp
cec8237a47 feat(xo-web): show if an incremental backup is a delta or a full 2023-12-19 15:42:59 +01:00
Florent Beauchamp
e13d55bfa9 feat(backups): store if disks of incremental backups are differencing in metadata 2023-12-19 15:42:59 +01:00
Florent Beauchamp
141c141516 refactor(backups): differentialVhds to isVhdDifferencing 2023-12-19 15:42:59 +01:00
Florent Beauchamp
7a47d23191 feat(backups): show warning message if xva are truncated 2023-12-19 15:42:59 +01:00
Florent Beauchamp
7a8bf671fb feat(backups): put back warning message on truncated vhds 2023-12-19 15:42:59 +01:00
Florent Beauchamp
7f83a3e55e fix(backup, vhd-lib): merge now return the resulting size and merged size 2023-12-19 15:42:59 +01:00
Florent Beauchamp
7f8ab07692 fix(backup): transferred backup size for incremental backup 2023-12-19 15:42:59 +01:00
Julien Fontanet
2634008a6a docs(VM backups): fix settings link 2023-12-19 15:41:39 +01:00
Florent Beauchamp
4c652a457f fixup! refactor(nbd-client): remove unused method and default iterator 2023-12-19 15:28:32 +01:00
Florent Beauchamp
89dc40a1c5 fixup! feat(nbd-client,xapi): implement multiple connections NBD 2023-12-19 15:28:32 +01:00
Florent Beauchamp
04a7982801 test(nbd-client): add test for unaligned export size 2023-12-19 15:28:32 +01:00
Florent Beauchamp
df9b59f980 fix(nbd-client): better handling of multiple disconnection 2023-12-19 15:28:32 +01:00
Florent Beauchamp
fe215a53af feat(nbd-client): expose exportSize on multi nbd client 2023-12-19 15:28:32 +01:00
Florent Beauchamp
0559c843c4 fix(nbd-client): put back retry on block read 2023-12-19 15:28:32 +01:00
Florent Beauchamp
79967e0eec feat(nbd-client/multi): allow partial connexion 2023-12-19 15:28:32 +01:00
Florent Beauchamp
847ad63c09 feat(backups,xo-server,xo-web): make NBD concurrency configurable 2023-12-19 15:28:32 +01:00
Florent Beauchamp
fc1357db93 refactor(nbd-client): remove unused method and default iterator 2023-12-19 15:28:32 +01:00
Florent Beauchamp
b644cbe28d feat(nbd-client,xapi): implement multiple connections NBD 2023-12-19 15:28:32 +01:00
Florent Beauchamp
7ddfb2a684 fix(vhd-lib/createStreamNbd): create binary instead of object stream
This reduces memory consumption.
2023-12-19 15:28:32 +01:00
Julien Fontanet
5a0cfd86c7 fix(xo-server/remote#_unserialize): handle boolean enabled
Introduced by 32afd5c46

Fixes #7246
Fixes https://xcp-ng.org/forum/post/68575
2023-12-19 15:11:34 +01:00
Julien Fontanet
70e3ba17af fix(CHANGELOG.unreleased): metadata → mirror
Introduced by 2b973275c
2023-12-19 15:07:01 +01:00
Julien Fontanet
4784bbfb99 fix(xo-server/vm.migrate): dont hide original error 2023-12-18 15:02:51 +01:00
MlssFrncJrg
ceddddd7f2 fix(xo-server/PIF): call PIF.forget to delete PIF (#7221)
Fixes #7193

Calling `pif.destroy` generates PIF_IS_PHYSICAL error when the PIF has been
physically removed
2023-12-18 14:41:58 +01:00
Julien Fontanet
32afd5c463 feat(xo-server): save JSON records in Redis (#7113)
Better support of non-string properties without having to handle them one by one.

To avoid breaking compatibility with older versions, this should not be merged after reading JSON records has been supported for at least a month.
2023-12-18 14:26:51 +01:00
Julien Fontanet
ac391f6a0f docs(incremental_backups): fix image path
Introduced by a0b50b47e
2023-12-18 11:45:23 +01:00
Manon Mercier
a0b50b47ef docs(incremental_backups): explain NBD (#7240) 2023-12-18 11:41:20 +01:00
b-Nollet
e3618416bf fix(xo-server-transport-slack): slack-node → @slack/webhook (#7220)
Fixes #7130

Changing the package used for Slack webhooks, to ensure compatibility with slack-compatible services like Discord or Mattermost.
2023-12-18 10:56:54 +01:00
Julien Fontanet
37fd6d13db chore(xo-server-transport-email): dont use deprecated nodemailer-markdown
BREAKING CHANGE: now requires Node >=18.'

Permits the use of a more recent `marked`.
2023-12-17 11:56:18 +01:00
Julien Fontanet
eb56666f98 chore(xen-api,xo-server): update to proxy-agent@6.3.1 2023-12-16 16:41:10 +01:00
Julien Fontanet
b7daee81c0 feat(xo-server): http.useForwardedHeaders (#7233)
Fixes https://xcp-ng.org/forum/post/67625

This setting can be enabled when XO is behind a reverse proxy to
fetch clients IP addresses from `X-Forwarded-*` headers.
2023-12-16 12:34:58 +01:00
Julien Fontanet
bee0eb9091 chore: update dev deps 2023-12-15 14:09:18 +01:00
Julien Fontanet
59a9a63971 feat(xo-server/store): ensure leveldb only accessible to current user 2023-12-13 11:36:31 +01:00
Julien Fontanet
a2e8b999da feat(xo-server-auth-saml): forceAuthn setting (#7232)
Fixes https://xcp-ng.org/forum/post/67764
2023-12-13 11:25:16 +01:00
OlivierFL
489ad51b4d feat(lite): add new UiStatusPanel component (#7227) 2023-12-12 11:44:22 +01:00
Julien Fontanet
7db2516a38 chore: update dev deps 2023-12-12 10:30:11 +01:00
Julien Fontanet
1141ef524f fix(xapi/host_smartReboot): retries when HOST_STILL_BOOTING (#7231)
Fixes #7194
2023-12-11 16:04:43 +01:00
OlivierFL
f449258ed3 feat(lite): add indeterminate state on FormToggle component (#7230) 2023-12-11 14:48:24 +01:00
Julien Fontanet
bb3b83c690 fix(xo-server/rest-api): proper 404 in case of missing backup job 2023-12-08 15:19:48 +01:00
Julien Fontanet
2b973275c0 feat(xo-server/rest-api): expose metadata & mirror backup jobs 2023-12-08 15:17:51 +01:00
Julien Fontanet
037e1c1dfa feat(xo-server/rest-api): /backups → /backup 2023-12-08 15:14:06 +01:00
Julien Fontanet
f0da94081b feat(gen-deps-list): detect duplicate packages
Prevents a bug where a second entry would override the previous one and possibly
decrease the release type (e.g. `major + patch → patch`).
2023-12-07 17:15:09 +01:00
Julien Fontanet
cd44a6e28c feat(eslint): enable require-atomic-updates rule 2023-12-07 17:05:21 +01:00
Julien Fontanet
70b09839c7 chore(xo-server): use @xen-orchestra/xapi/VM_import when possible 2023-12-07 16:50:45 +01:00
OlivierFL
12140143d2 feat(lite): added tooltip on CPU provisioning warning icon (#7223) 2023-12-07 09:07:15 +01:00
b-Nollet
e68236c9f2 docs(installation): update Debian & Fedora packages (#7207)
Fixes #7095
2023-12-06 15:39:50 +01:00
Julien Fontanet
8a1a0d76f7 chore: update dev deps 2023-12-06 11:09:54 +01:00
Mathieu
4a5bc5dccc feat(lite): override host address with 'master' query param (#7187) 2023-12-04 11:31:35 +01:00
MlssFrncJrg
0ccdfbd6f4 feat(xo-web/SR): improve forget SR modal message (#7155) 2023-12-04 09:33:50 +01:00
Mathieu
75af7668b5 fix(lite/changelog): fix xolite changelog (#7215) 2023-12-01 10:48:22 +01:00
Thierry Goettelmann
0b454fa670 feat(lite/VM): ability to migrate a VM (#7164) 2023-12-01 10:38:55 +01:00
Pierre Donias
2dcb5cb7cd feat(lite): 0.1.6 (#7213) 2023-11-30 16:01:06 +01:00
Thierry Goettelmann
a5aeeceb7f chore(lite): upgrade dependencies (#7170)
1. Since the project is built-only, all deps have been moved to `devDependencies`
2. TypeScript has been upgraded from 4.9 to 5.2
3. `engines.node` requirement was set to `>=8.10`. It has been updated to `>=18` to be aligned with deps requirements
2023-11-30 15:13:36 +01:00
Florent BEAUCHAMP
b2f2c3cbc4 feat: release 5.89.0 (#7212) 2023-11-30 13:57:49 +01:00
Florent BEAUCHAMP
0f7ac004ad feat: technical release (#7211) 2023-11-30 10:42:54 +01:00
Florent Beauchamp
7faa82a9c8 feat(xo-web): add UX for differential backup 2023-11-30 10:12:20 +01:00
Florent Beauchamp
4b3f60b280 feat(backups): implement differential restore
When restoring a backup, try to reuse data from an existing snapshot.
We use this snasphot and apply a reverse differential of the changes
between the backup and the snapshot

Prerequisite : a uninterrupted delta chain from the backup being
restored to a backup that still have its snapshot on the host
2023-11-30 10:12:20 +01:00
Florent Beauchamp
b29d5ba95c feat(vhd-lib): implement a limit in VhdSynthetic.fromVhdChain 2023-11-30 10:12:20 +01:00
Florent Beauchamp
408fc5af84 feat(vhd-lib): implement VhdNegative
it's a virtual Vhd that contains all the changes to be applied
to reset a child to its parent value
2023-11-30 10:12:20 +01:00
Florent BEAUCHAMP
2748aea4e9 feat: technical release (#7210) 2023-11-29 15:39:25 +01:00
Florent Beauchamp
a5acc7d267 fix(backups,xo-server): don't backup VMs created by Health Check 2023-11-29 14:46:05 +01:00
Florent Beauchamp
87a9fbe237 feat(xo-server,xo-web): don't backup VMs with xo:no-bak tag 2023-11-29 14:46:05 +01:00
Julien Fontanet
9d0b7242f0 fix(xapi-explore-sr): use xen-api@2.0.0 2023-11-29 14:42:50 +01:00
Julien Fontanet
20ec44c3b3 fix(xo-server/registerHttpRequestHandler): match on path
Instead of full URL, so that handlers can manage query string.
2023-11-29 14:42:50 +01:00
Julien Fontanet
6f68456bae feat(xo-server/registerHttpRequestHandler): returns teardown function
`unregisterHttpRequestHandler` is no longer useful and has been removed.
2023-11-29 14:42:50 +01:00
Florent BEAUCHAMP
b856c1a6b4 feat(xo-server,xo-web): show link to the SR for the garbage collector (coalesce) task (#7189)
See https://github.com/vatesfr/xen-orchestra/issues/5379#issuecomment-1765170973
2023-11-29 09:07:05 +01:00
Julien Fontanet
61e1f83a9f feat(xo-server/rest-api): possibility to import a VM 2023-11-28 17:54:10 +01:00
Mathieu
5820e19731 feat(xo-web/VM): display task information on VDI import (#7197) 2023-11-28 15:41:10 +01:00
Pierre Donias
cdb51f8fe3 chore(lite/settings): use FormSelect instead of select (#7206) 2023-11-28 14:46:25 +01:00
Florent BEAUCHAMP
57940e0a52 fix(backups): import on non default SR (#7209) 2023-11-28 14:35:08 +01:00
Florent BEAUCHAMP
6cc95efe51 feat: technical release (#7208) 2023-11-28 09:30:32 +01:00
Pierre Donias
b0ff2342ab chore(netbox): remove null-indexed entries from keyed-by collections (#7156) 2023-11-27 16:26:53 +01:00
Mathieu
0f67692be4 feat(xo-server/xostor): add XO tasks (#7201) 2023-11-27 16:11:53 +01:00
Julien Fontanet
865461bfb9 feat(xo-server/api): backupNg.{,un}mountPartition (#7176)
Manual method to mount a backup partition on the XOA.
2023-11-24 09:47:23 +01:00
Julien Fontanet
e108cb0990 feat(xo-server/rest-api): possibility to import in an existing VDI (#7199) 2023-11-23 17:07:40 +01:00
Florent BEAUCHAMP
c4535c6bae fix(fs/s3): enable md5 if object lock status is unknown (#7195)
From https://xcp-ng.org/forum/topic/7939/unable-to-connect-to-backblaze-b2/7?_=1700572613725
Following 796e2ab674 

User report it fixes the issue https://xcp-ng.org/forum/post/67633
2023-11-23 16:43:25 +01:00
Julien Fontanet
ad8eaaa771 feat(xo-cli): support REST PUT method 2023-11-23 16:30:03 +01:00
Julien Fontanet
9419cade3d feat(xo-server/rest-api): tags property can be updated 2023-11-23 16:30:03 +01:00
Julien Fontanet
272e6422bd chore(xapi/VM_import): typo snapshots → snapshot 2023-11-23 16:28:30 +01:00
Julien Fontanet
547908a8f9 chore(xo-server/proxy.checkHealth): call checkProxyHealth 2023-11-23 16:28:29 +01:00
Mathieu
8abfaa0bd5 feat(lite/VM): ability to export a VM (#7190) 2023-11-23 11:00:38 +01:00
MlssFrncJrg
a9fbcf3962 feat(xo-web/new VM): always show ISO selector (#7166)
Fixes #3464
2023-11-22 11:04:30 +01:00
Michael Bennett
887b49ebbf docs(installation): Fedora & CentOS wrong package libvhd-utils (#7200)
Under Packages the installation of package `libvhdi-utils` is incorrect for Fedora/CentOS. This should be replaced by `libvhdi-tools` instead.
2023-11-21 17:46:17 +01:00
Florent BEAUCHAMP
858ecbc217 fix(xapi/VDI_importContent): other_config entries must be strings (#7198)
Introduced byffd523679de80b36b2eacd30cc98de3c588a2b77
2023-11-21 16:55:53 +01:00
Florent BEAUCHAMP
ffd523679d feat(backups): update VDI importing status its name_label 2023-11-21 14:38:49 +01:00
Florent BEAUCHAMP
bd9db437f1 feat(xapi/VDI_importContent): store task UUID and stream length into other_config 2023-11-21 14:38:49 +01:00
Florent BEAUCHAMP
0365bacfbb feat(backups): show more detail on restored VM (#7186) 2023-11-21 12:28:53 +01:00
MlssFrncJrg
f3e0227c55 feat(xo-web/console): add disabled console message (#7161)
Fixes #6319
2023-11-21 10:39:35 +01:00
Florent BEAUCHAMP
4504141cbf refactor(backups/importIncrementalVm): move base detection to callers (#7165) 2023-11-20 14:52:59 +01:00
b-Nollet
ecbbf878d0 chore(xen-api): convert to ESM (#7181) 2023-11-20 14:32:44 +01:00
MlssFrncJrg
c1faaa3107 fix(xo-server/resource-set): fix error when changing VM resource set (#7144) 2023-11-20 14:19:27 +01:00
Julien Fontanet
59f04b4a6b chore: format with Prettier 2023-11-20 12:34:30 +01:00
Julien Fontanet
781b070e74 fix(xen-api/examples/import-vdi): params handling 2023-11-20 11:45:45 +01:00
Julien Fontanet
1911386aba chore: refresh yarn.lock 2023-11-20 09:55:07 +01:00
MlssFrncJrg
5b0339315f docs(Support): remove Partner Program (#7099) 2023-11-20 09:42:21 +01:00
b-Nollet
5fe53dfa99 refactor(xapi-explore-sr): convert to EM (#7191) 2023-11-17 16:55:11 +01:00
b-Nollet
06068cdcc6 refactor(cr-seed-cli): convert to ESM (#7192) 2023-11-17 16:46:36 +01:00
Julien Fontanet
c88cc2b020 chore(xo-server/token.create): allow 60s for expiresIn
It makes more sense for the min accepted value to be 60s than 60,001ms.
2023-11-17 10:57:48 +01:00
Pierre Donias
03de8ad481 docs(netbox): update steps and screenshots with latest version (#7182) 2023-11-16 16:06:01 +01:00
Julien Fontanet
08ba7e7253 chore: refresh yarn.lock 2023-11-16 10:21:17 +01:00
Florent BEAUCHAMP
9ca3f3df26 fix(xo-vmdk-to-vhd): improve compatibilty of ova with disk bigger than 8.2GB (#7183)
following #7047, from https://xcp-ng.org/forum/topic/7946/ova-export-not-functional?_=1700051758755

ova exported from xo with more than 8.2G data per disk can't be imported in virtual box 

tar-stream@3 pack and entry are now streams
2023-11-15 16:23:33 +01:00
Mathieu
511908bb7d feat(lite/pool/VMs): ability to export selected VMs (#7174) 2023-11-15 15:29:25 +01:00
Thierry Goettelmann
4351aad312 feat(lite): new FormByteSize component (#6741) 2023-11-15 15:28:46 +01:00
Florent BEAUCHAMP
af7aa29c91 feat(nbd-client): various fixes (#6964) 2023-11-15 10:04:09 +01:00
Thierry Goettelmann
315d626055 fix(lite/story): code highlight modal path (#7180) 2023-11-15 09:58:15 +01:00
Pierre Donias
7af0899800 feat(netbox): sync XO users as Netbox tenants (#7158)
See Zammad#11356
See Zammad#17364
See Zammad#18409
2023-11-14 15:25:56 +01:00
Florent BEAUCHAMP
46ec2dfd56 fix(vmware-explorer): better handling of VM import without any storage (#7168) 2023-11-14 15:14:13 +01:00
Thierry Goettelmann
b2348474c3 fix(lite/pool): host patches list is broken if changelog property is empty (#7169) 2023-11-14 15:08:56 +01:00
Julien Fontanet
836300755a feat: release 5.88.2 2023-11-13 15:07:43 +01:00
Julien Fontanet
55c8c8a6e9 feat(xo-server): 5.126.0 2023-11-13 11:41:08 +01:00
Julien Fontanet
38e32cd24c chore: update dev deps 2023-11-13 09:48:54 +01:00
Julien Fontanet
5ceacfaf5a fix(xo-server/redis): fix searching with multiple indexes
Introduced by 36b94f745
2023-11-12 22:18:19 +01:00
Thierry Goettelmann
1ee6b106b9 feat(lite/ui): compact layout (#7159) 2023-11-10 16:26:20 +01:00
Julien Fontanet
eaef4f22d2 fix(xo-web/settings/logs): use template when reporting
Related to #7142
2023-11-10 11:33:01 +01:00
Julien Fontanet
96025df12f feat(xo-server): only create a single token per web client (and user)
Related to e07e2d3cc

Similar to 581b42fa9
2023-11-09 17:13:10 +01:00
Mathieu
a8aac295eb fix(lite/login): correctly handle login from slave (#7110) 2023-11-09 15:00:29 +01:00
Mathieu
83141989f0 feat(xolite/modals): add onClose event (#7167) 2023-11-09 10:57:24 +01:00
Julien Fontanet
9dea52281d docs(installation): explicit Redis should be started 2023-11-07 17:10:35 +01:00
Julien Fontanet
2164c72034 fix(xo-server): log redis errors
Avoid unhandled error events.
2023-11-07 16:08:41 +01:00
Julien Fontanet
0d0c38f3b5 fix(backups): create suspend VDI on correct SR
Introduced by a958fe86d
2023-11-07 15:55:14 +01:00
Pierre Donias
e5be21a590 feat(lite): 0.1.5 (#7162) 2023-11-07 15:49:12 +01:00
Julien Fontanet
bc1a8be862 chore: fix formatting 2023-11-07 14:33:16 +01:00
Mathieu
3df4dbaae7 feat: release 5.88.1 (#7163) 2023-11-07 14:30:53 +01:00
Julien Fontanet
8f2cfebda6 feat(xo-server/rest-api): add users collection 2023-11-07 12:51:12 +01:00
Julien Fontanet
0d00c1c45f chore: update dev deps 2023-11-07 12:32:38 +01:00
Mathieu
9886e06d6a feat: technical release (#7160) 2023-11-07 10:18:09 +01:00
Thierry Goettelmann
478dbdfe41 feat(lite): new modal management (#7134) 2023-11-07 09:49:02 +01:00
Florent BEAUCHAMP
2bfdb60dda fix(fs): handle object storage server not implementing Object lock (#7157) 2023-11-06 17:18:00 +01:00
Pierre Donias
cabd04470d feat(xo-server-netbox): use Netbox version instead of Netbox API version (#7138)
Netbox version is more precise (X.Y.Z instead of X.Y)
2023-11-06 17:10:10 +01:00
Florent BEAUCHAMP
f6819b23f9 fix(xo-web/dashboard): empty VDIs shouldn't be flagged as orphan (#7102)
Fixes zammad#15524
2023-11-06 13:57:44 +01:00
Julien Fontanet
c9dbcf1384 fix(proxy/backup.importVmBackup): only dispose resources at the end (#7152)
Fixes #7052

Fixes zammad#17383

When a stream is returned, the handler immediately returned a stream which disposed the resource.

Due to the disposable having a 5 mins debounce delay, the problem was only apparent after 5 mins.
2023-11-06 10:30:34 +01:00
Pierre Donias
457fec0bc8 fix(xo-server-netbox): properly delete all interfaces that don't have a UUID (#7153)
Fixes zammad#18812

Introduced by 3b1bcc67ae

The first step of synchronizing VIFs with Netbox interfaces is to clean up any interface attached to the Netbox VM that isn't found on the XO VM, *based on their UUID*, including the interfaces that don't have a UUID at all (`uuid` is `null`).

But by looping over the keyed-by-UUID collection, we could only ever delete at most *one* null-UUID interface, the other ones being dropped by `keyBy`.

Using the flat-array collection instead makes sure all the interfaces are handled.
2023-11-06 10:28:43 +01:00
Pierre Donias
db99a22244 fix(xo-web/New network): only hide bond-PIFs when creating a bonded network (#7151)
Fixes #7150
See https://xcp-ng.org/forum/topic/7918
Introduced by dbdc5f3e3b
2023-11-03 11:22:10 +01:00
Pierre Donias
89d8adc6c6 feat(netbox): expose raw HTTP body if it cannot be JSON-parsed (#7146) 2023-11-02 14:28:06 +01:00
Pierre Donias
a3ea70c61c fix(xo-server-netbox): fix site property null/undefined cases (#7145)
Introduced by 1d7559ded2
2023-10-31 16:16:38 +01:00
Mathieu
ae0f3b4fe0 feat: release 5.88.0 (#7143) 2023-10-31 14:58:50 +01:00
Mathieu
2552ef37d2 feat: technical release (#7141) 2023-10-31 10:09:35 +01:00
Pierre Donias
9803e8c6cb feat(xo-web/patches): warning about updating pool master first (#7140) 2023-10-31 09:51:17 +01:00
Florent BEAUCHAMP
3410cbc3b9 fix(backups): use VDI virtual_size instead of physical_size
`physical_size` appears to be broken
2023-10-30 15:55:30 +01:00
Florent BEAUCHAMP
93fce0d4bf fix(backups): pass type to Xapi#getRecord
Fixes #7131

Introduced by 37b211376
2023-10-30 15:55:30 +01:00
MlssFrncJrg
dbdc5f3e3b feat(xo-web/New network): don't show PIFs that belong to a bond (#7136) 2023-10-30 15:47:38 +01:00
Julien Fontanet
581b42fa9d feat(xo-cli): only create a single token per instance (and user) 2023-10-30 15:47:17 +01:00
Julien Fontanet
e07e2d3ccd feat(xo-server/token): client info support 2023-10-30 15:47:17 +01:00
Mathieu
ad928ec23d fix(xo-web/licenses/XOSTOR): various fixes on XOSTOR licenses (#7137)
Introduced by #6983
2023-10-30 14:55:11 +01:00
Pierre Donias
1d7559ded2 fix(xo-server-netbox/VM): explicitly assign site (#7124)
See Zammad#17766
See https://xcp-ng.org/forum/topic/7887
2023-10-30 11:32:12 +01:00
Mathieu
9099b58557 feat: technical release (#7132) 2023-10-27 16:13:04 +02:00
Julien Fontanet
9e70397240 fix(xo-server/redis): fix indexes handling
Introduced by 225a67ae3
2023-10-27 11:27:25 +02:00
Thierry Goettelmann
5f69b0e9a0 feat(lite/console): new console toolbar (#7088) 2023-10-27 10:27:51 +02:00
Julien Fontanet
2a9bff1607 chore(xo-server/importConfig): don't use deptree 2023-10-27 10:14:02 +02:00
Pierre Donias
9e621d7de8 feat(lite/header): replace logo with "XO LITE" (#7118) 2023-10-27 09:16:28 +02:00
Mathieu
3e5c73528d feat(xo-server,xo-web/XOSTOR): XOSTOR implementation (#6983)
See https://xcp-ng.org/forum/topic/5361
2023-10-26 16:58:59 +02:00
Pierre Donias
397b5cd56d fix(xo-server/snapshot): allow self user that is member of a group to snapshot (#7129)
Introduced by a88798cc22
See Zammad#18478
2023-10-26 16:08:43 +02:00
Julien Fontanet
55cb6042e8 chore(yarn.lock): update dev deps 2023-10-26 11:00:14 +02:00
Pierre Donias
339d920b78 feat(xo-web/proxy): ability to open support tunnel on XO Proxy (#7127)
Requires #7126
2023-10-25 17:26:06 +02:00
Julien Fontanet
f14f716f3d feat(xo-server/api): proxy.openSupportTunnel (#7126)
The goal is to provide an easier way for the support team to open a tunnel on a proxy appliance.

This is the server side of this feature.
2023-10-25 17:12:17 +02:00
Julien Fontanet
fb83d1fc98 feat(xo-server/api): ignorable parameters (#7125) 2023-10-25 15:49:41 +02:00
Julien Fontanet
62208e7847 fix(xo-server-transport-xmpp): fix loading (#7082)
Fixes https://xcp-ng.org/forum/post/66402

Introduced by d6fc86b6b
2023-10-25 14:36:40 +02:00
Julien Fontanet
df91772f5c chore(xo-server/server): use builtin (un)serialize 2023-10-25 11:48:53 +02:00
Julien Fontanet
cf8a9d40be chore(xo-server/remote): use builtin (un)serialize 2023-10-25 11:48:53 +02:00
Julien Fontanet
93d1c6c3fc chore(xo-server/plugin-metadata): use builtin (un)serialize 2023-10-25 11:48:53 +02:00
Julien Fontanet
f1fa811e5c chore(xo-server/user): use builtin (un)serialize 2023-10-25 11:48:53 +02:00
Julien Fontanet
5a9812c492 chore(xo-server/group): use builtin (un)serialize 2023-10-25 11:48:53 +02:00
Julien Fontanet
b53d613a64 chore(xo-server/token): use builtin unserialize 2023-10-25 11:48:53 +02:00
Julien Fontanet
225a67ae3b chore(xo-server/redis): proper (un)serialization support 2023-10-25 11:48:53 +02:00
Mathieu
c7eb7db463 feat(xo-web/about): display if XO from source is up to date (#7091)
Fixes #5934
2023-10-24 17:14:01 +02:00
Pierre Donias
edfa729672 chore(lite/assets): remove darkreader properties in SVG files (#7121) 2023-10-24 16:40:37 +02:00
Mathieu
77d9798319 fix(xo-web/vtpm): fix various an error has occured (#7122)
Introduced by 8834af65f7
Introduced by 1a1dd0531d

Fix `an error has occurred` in the VM advanced tab and on the VM creation form
if the user does not have pool permission.
2023-10-24 16:26:36 +02:00
Pierre Donias
680f1e2f07 chore(lite): serve Poppins font internally (#7117) 2023-10-24 15:19:54 +02:00
Julien Fontanet
7c009b0fc0 feat(xo-server): support reading JSON records in Redis
This allows forward compatibility with future versions which will use JSON records in the future.
2023-10-23 15:13:28 +02:00
Pierre Donias
eb7de4f2dd feat(xo-web/self): show # of VMs that belong to each Resource Set (#7114)
See Zammad#17568
2023-10-23 15:03:30 +02:00
Olivier Lambert
2378399981 docs: update project's README (#7116) 2023-10-23 14:25:03 +02:00
Florent BEAUCHAMP
37b2113763 feat(fs/s3): compute sensible chunk size for uploads 2023-10-23 10:23:50 +02:00
Florent BEAUCHAMP
5048485a85 feat(fs/s3): object lock mode need content md5
and the middleware consume addiitionnal memory
2023-10-23 10:23:50 +02:00
Florent BEAUCHAMP
9e667533e9 fix(fs/s3): throw error if upload >50GB 2023-10-23 10:23:50 +02:00
MlssFrncJrg
1fac7922b4 feat(xo-web/dashboard/health): VDIs to coalesce warning contains the number (#7111)
Fixes Zammad#17577
2023-10-20 15:53:24 +02:00
Julien Fontanet
1a0e5eb6fc chore: format with Prettier 2023-10-20 15:52:10 +02:00
Pierre Donias
321e322492 feat(xo-server/clearHost): pass optional batch size arg (#7107)
Fixes #7105
See https://github.com/xapi-project/xen-api/issues/5202
See https://github.com/xapi-project/xen-api/pull/5203

`host.evacuate`: try passing optional batch size argument.
If not supported: remove it and try again.
2023-10-19 17:03:14 +02:00
Mathieu
8834af65f7 feat(xo-server/xo-web/VM/new): VTPM creation (#7077)
See #7066
See #6802
See #7085
2023-10-19 16:48:56 +02:00
Mathieu
1a1dd0531d feat(xo-web/VM/advanced): VTPM management (#7085)
See #7066
See #6802
See #7074
2023-10-19 15:46:03 +02:00
Pierre Donias
8752487280 docs(installation): add nfs-common dependency for Debian/Ubuntu (#7108) 2023-10-18 22:50:29 +02:00
Pierre Donias
4b12a6d31d fix(xo-server-usage-report): handle null and nested stats (#7092)
Introduced by 083483645e

Fixes Zammad#18120
Fixes Zammad#18266

- Always assume that data can be `null`
- Handle edge cases where all values are `null`
- Properly handle nested RRD collections: collections have different depths (`memory`: 1, `cpus[0]`: 2, `pifs.rx[0]`: 3, ...). This PR replaces `getLastDays` which wouldn't handle those depths properly, with `getDeepLastValues` which is run on the whole stat object and doesn't assume the depth of the collections. It finds any Array at any depth and slices it to only keep the last N values.
2023-10-18 22:50:08 +02:00
Julien Fontanet
2924f82754 fix(xo-web): don't sign out on connection error (#7103)
May fix zammad#17717

Introduced by 005ab47d9
2023-10-18 18:07:16 +02:00
Pierre Donias
9b236a6191 fix(netbox/test): test custom fields first (#7104)
More atomic and it makes more sense for users to check that the Netbox
configuration is correct before doing any write operations
2023-10-18 11:56:10 +02:00
Julien Fontanet
a3b8553cec fix(xo-server,xo-web): fix total number of VDIs to coalesce (#7098)
Fixes #7016

Summing all chains does take not common chains into account, the total must be computed on the server side.
2023-10-18 11:52:43 +02:00
Pierre Donias
00a1778a6d feat(lite): set color-scheme CSS property to "dark" in dark mode (#7101) 2023-10-17 16:50:13 +02:00
MlssFrncJrg
3b6bc629bc fix(xo-web/home): fix misaligned descriptions (#7090) 2023-10-16 15:53:35 +02:00
Pierre Donias
04dfd9a02c fix(xo-server-usage-report): use @xen-orchestra/log to log errors (#7096)
Fixes Zammad#14579
Fixes Zammad#18183

Better handles error objects with a circular structure and avoids "Converting
circular structure to JSON" error on stringify
2023-10-16 10:07:57 +02:00
Pierre Donias
fb52868074 fix(xo-server/patching): always check that XS credentials are configured on XS (#7093)
Introduced by a30d962b1d
2023-10-13 16:49:04 +02:00
Pierre Donias
77d53d2abf fix(xo-server/patching): always pass xsCredentials to installPatches on XS (#7089)
Fixes Zammad#18284

Introduced by a30d962b1d
2023-10-13 11:45:17 +02:00
Julien Fontanet
6afb87def1 feat(xo-server/vm.set): support xenStoreData
Fixes #7055
2023-10-13 11:26:48 +02:00
Mathieu
8bfe293414 feat(lite/VM): add copy, snapshot single action (#7087) 2023-10-12 11:09:11 +02:00
Mathieu
2e634a9d1c feat(xapi/VTPM): ability to create, destroy VTPM (#7074) 2023-10-12 09:19:38 +02:00
Pierre Donias
bea771ca90 fix(xo-server/RPU): do not migrate VM back if already on host (#7071)
See https://xcp-ng.org/forum/topic/7802
2023-10-11 16:16:44 +02:00
Pierre Donias
99e3622f31 feat(xo-web/SelectPif): show network name (#7081)
See Zammad#17381
2023-10-10 15:59:24 +02:00
Pizzosaure
a16522241e docs(netbox): remove extra backtick (#7083)
Introduced by 3b3f927e4b
2023-10-10 14:14:15 +02:00
Julien Fontanet
b86cb12649 chore(yarn.lock): update dev deps 2023-10-09 17:06:54 +02:00
Julien Fontanet
2af74008b2 feat(xo-server-backup-reports): errors are logged as XO tasks 2023-10-09 09:35:24 +02:00
Julien Fontanet
2e689592f1 feat(xo-server-backup-reports): error when transports not enabled 2023-10-09 09:35:24 +02:00
Julien Fontanet
3f8436b58b fix(xo-server/authenticateUser): use clearLogOnSuccess
This fixes success logs not deleted due to race conditions.
2023-10-09 09:35:24 +02:00
Julien Fontanet
e3dd59d684 feat(mixins/Tasks#create): clearLogOnSuccess option 2023-10-09 09:35:24 +02:00
mathieuRA
549d9b70a9 feat(xo-web/host): allow to force smartReboot 2023-10-06 16:52:26 +02:00
mathieuRA
3bf6aae103 feat(xapi/host_smartReboot): ability to bypass blocked operations 2023-10-06 16:52:26 +02:00
Julien Fontanet
afb110c473 fix(fs/rmtree): fix huge memory usage (#7073)
Fixes zammad#15258

This adds a sane concurrency limit of 2 per depth level.

Co-authored-by: Florent BEAUCHAMP <florent.beauchamp@vates.fr>
2023-10-06 09:52:11 +02:00
3256 changed files with 250637 additions and 53334 deletions

View File

@@ -15,9 +15,10 @@ module.exports = {
overrides: [
{
files: ['cli.{,c,m}js', '*-cli.{,c,m}js', '**/*cli*/**/*.{,c,m}js'],
files: ['cli.{,c,m}js', '*-cli.{,c,m}js', '**/*cli*/**/*.{,c,m}js', '**/scripts/**.{,c,m}js'],
rules: {
'n/no-process-exit': 'off',
'n/shebang': 'off',
'no-console': 'off',
},
},
@@ -38,6 +39,12 @@ module.exports = {
version: '>=16',
},
],
'n/no-unsupported-features/es-builtins': [
'error',
{
version: '>=16',
},
],
'n/no-unsupported-features/es-syntax': [
'error',
{
@@ -46,8 +53,258 @@ module.exports = {
],
},
},
{
files: ['@xen-orchestra/{web-core,lite,web}/**/*.{vue,ts}'],
parser: 'vue-eslint-parser',
parserOptions: {
sourceType: 'module',
parser: '@typescript-eslint/parser',
},
plugins: ['import'],
extends: [
'plugin:import/recommended',
'plugin:import/typescript',
'plugin:@typescript-eslint/recommended',
'plugin:vue/vue3-essential',
],
settings: {
'import/resolver': {
typescript: true,
'eslint-import-resolver-custom-alias': {
alias: {
'@core': '../web-core/lib',
'@': './src',
},
extensions: ['.ts'],
packages: ['@xen-orchestra/lite', '@xen-orchestra/web'],
},
},
},
globals: {
XO_LITE_VERSION: true,
XO_LITE_GIT_HEAD: true,
},
rules: {
'import/order': [
'error',
{
groups: ['builtin', 'object', 'internal', ['type', 'external']],
alphabetize: {
order: 'asc',
caseInsensitive: true,
},
pathGroups: [
{
pattern: '@/**',
group: 'internal',
},
{
pattern: '@core/**',
group: 'internal',
},
],
},
],
'no-useless-constructor': 'off',
'@typescript-eslint/no-useless-constructor': 'error',
'no-void': ['error', { allowAsStatement: true }],
'n/no-missing-import': 'off', // using 'import' plugin instead, to support TS aliases
'no-redeclare': 'off', // automatically checked by the TypeScript compiler
'no-dupe-class-members': 'off', // automatically checked by the TypeScript compiler
'no-undef': 'off', // automatically checked by the TypeScript compiler
'no-use-before-define': 'off', // replaced with the rule below
'@typescript-eslint/no-use-before-define': ['error', { functions: false }],
'@typescript-eslint/no-explicit-any': 'off',
'vue/multi-word-component-names': 'off',
// Vue 3 - Strongly Recommended
'vue/attribute-hyphenation': 'error',
'vue/component-definition-name-casing': 'error',
'vue/first-attribute-linebreak': 'error',
'vue/html-closing-bracket-newline': 'off', // Conflicts with Prettier
'vue/html-closing-bracket-spacing': 'error',
'vue/html-end-tags': 'error',
'vue/html-indent': 'off', // Conflicts with Prettier
'vue/html-quotes': 'error',
'vue/html-self-closing': ['error', { html: { void: 'always', normal: 'always', component: 'always' } }],
'vue/max-attributes-per-line': 'off', // Conflicts with Prettier
'vue/multiline-html-element-content-newline': 'error',
'vue/mustache-interpolation-spacing': 'error',
'vue/no-multi-spaces': 'error',
'vue/no-spaces-around-equal-signs-in-attribute': 'error',
'vue/no-template-shadow': 'error',
'vue/prop-name-casing': 'error',
'vue/require-default-prop': 'off', // https://github.com/vuejs/eslint-plugin-vue/issues/2051
'vue/require-explicit-emits': 'error',
'vue/require-prop-types': 'error',
'vue/singleline-html-element-content-newline': 'off',
'vue/v-bind-style': 'error',
'vue/v-on-event-hyphenation': ['error', 'always', { autofix: true }],
'vue/v-on-style': 'error',
'vue/v-slot-style': 'error',
// Vue 3 - Recommended
'vue/attributes-order': 'error',
'vue/no-lone-template': 'error',
'vue/no-multiple-slot-args': 'error',
'vue/no-v-html': 'error',
'vue/this-in-template': 'error',
// Vue 3 - Uncategorized
'vue/block-lang': ['error', { script: { lang: 'ts' }, style: { lang: 'postcss' } }],
'vue/block-order': ['error', { order: ['template', 'script', 'style'] }],
'vue/block-tag-newline': ['error', { singleline: 'consistent', multiline: 'always', maxEmptyLines: 0 }],
'vue/component-api-style': ['error', ['script-setup']],
'vue/component-name-in-template-casing': ['error', 'PascalCase', { registeredComponentsOnly: false }],
'vue/custom-event-name-casing': ['error', 'camelCase'],
'vue/define-emits-declaration': ['error', 'type-literal'],
'vue/define-macros-order': [
'error',
{
order: ['defineOptions', 'defineProps', 'defineEmits', 'defineModel', 'defineSlots'],
defineExposeLast: true,
},
],
'vue/define-props-declaration': ['error', 'type-based'],
'vue/enforce-style-attribute': ['error', { allow: ['scoped', 'module'] }],
'vue/html-button-has-type': 'error',
'vue/html-comment-content-newline': ['error', { singleline: 'never', multiline: 'always' }],
'vue/html-comment-content-spacing': ['error', 'always'],
'vue/no-duplicate-attr-inheritance': 'error',
'vue/no-empty-component-block': 'error',
'vue/no-multiple-objects-in-class': 'error',
'vue/no-ref-object-reactivity-loss': 'error',
'vue/no-static-inline-styles': 'error',
'vue/no-template-target-blank': 'error',
'vue/no-undef-components': ['error', { ignorePatterns: ['RouterLink', 'RouterView', 'I18nT'] }],
'vue/no-undef-properties': 'error',
'vue/no-unused-refs': 'error',
'vue/no-use-v-else-with-v-for': 'error',
'vue/no-useless-mustaches': 'error',
'vue/no-useless-v-bind': 'error',
'vue/no-v-text': 'error',
'vue/padding-line-between-blocks': 'error',
'vue/prefer-define-options': 'error',
'vue/prefer-separate-static-class': 'error',
'vue/prefer-true-attribute-shorthand': 'error',
'vue/require-macro-variable-name': 'error',
'vue/valid-define-options': 'error',
},
},
// Specific rules for XO i18n-related files
{
files: [
'@xen-orchestra/lite/**/*.{vue,ts}',
'@xen-orchestra/web/**/*.{vue,ts}',
'@xen-orchestra/web-core/**/*.{vue,ts,json}',
],
extends: ['plugin:@intlify/vue-i18n/base'],
settings: {
'vue-i18n': {
localeDir: ['@xen-orchestra/web-core/lib/locales/*.json'],
messageSyntaxVersion: '^9.9.0',
},
},
rules: {
strict: 'off',
'no-irregular-whitespace': 'off',
'@intlify/vue-i18n/no-deprecated-i18n-component': 'error',
'@intlify/vue-i18n/no-deprecated-i18n-place-attr': 'error',
'@intlify/vue-i18n/no-deprecated-i18n-places-prop': 'error',
'@intlify/vue-i18n/no-deprecated-modulo-syntax': 'error',
'@intlify/vue-i18n/no-deprecated-tc': 'error',
'@intlify/vue-i18n/no-html-messages': 'error',
'@intlify/vue-i18n/no-i18n-t-path-prop': 'error',
'@intlify/vue-i18n/no-missing-keys': 'error',
'@intlify/vue-i18n/no-raw-text': [
'error',
{
ignoreText: [
'Xen Orchestra Lite',
'Xen Orchestra',
'Xen Orchestra Appliance',
'XO Lite',
'XCP-ng',
'XO 5',
'404',
'⚠️',
],
},
],
'@intlify/vue-i18n/no-v-html': 'error',
'@intlify/vue-i18n/valid-message-syntax': 'error',
'@intlify/vue-i18n/no-duplicate-keys-in-locale': 'error',
'@intlify/vue-i18n/no-missing-keys-in-other-locales': [
'error',
{
ignoreLocales: [
'de',
'fa',
'cs',
'es',
'sv',
'it',
'ru',
'uk',
'nl',
'pt-BR',
'da',
'ko',
'nb-NO',
'ja',
'fi',
'pl',
'zh-Hans',
'sk',
'pt',
],
},
],
},
},
// Specific rules for XO dev-related files
{
files: [
'@xen-orchestra/lite/src/stories/**/*',
'@xen-orchestra/lite/src/components/component-story/**/*',
'@xen-orchestra/web/src/pages/dev/**/*',
'@xen-orchestra/lite/src/views/story/**/*',
],
rules: {
'@intlify/vue-i18n/no-raw-text': 'off',
},
},
{
files: ['@xen-orchestra/{web-core,lite,web}/src/pages/**/*.vue'],
parserOptions: {
sourceType: 'module',
},
rules: {
'vue/multi-word-component-names': 'off',
},
},
{
files: ['@xen-orchestra/{web-core,lite,web}/src/route-map.d.ts'],
parserOptions: {
sourceType: 'module',
},
rules: {
'eslint-comments/disable-enable-pair': 'off',
'eslint-comments/no-unlimited-disable': 'off',
},
},
{
files: ['*.d.ts'],
parser: '@typescript-eslint/parser',
parserOptions: {
sourceType: 'module',
},
rules: {
'n/no-unsupported-features/es-syntax': 'off',
'no-unused-vars': 'off',
},
},
],
ignorePatterns: ['@vates/fatfs/'],
parserOptions: {
ecmaVersion: 13,
sourceType: 'script',
@@ -68,6 +325,11 @@ module.exports = {
'no-console': ['error', { allow: ['warn', 'error'] }],
// this rule can prevent race condition bugs like parallel `a += await foo()`
//
// as it has a lots of false positive, it is only enabled as a warning for now
'require-atomic-updates': ['warn', { allowProperties: true }],
strict: 'error',
},
}

View File

@@ -1,48 +0,0 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: 'status: triaging :triangular_flag_on_post:, type: bug :bug:'
assignees: ''
---
1. ⚠️ **If you don't follow this template, the issue will be closed**.
2. ⚠️ **If your issue can't be easily reproduced, please report it [on the forum first](https://xcp-ng.org/forum/category/12/xen-orchestra)**.
Are you using XOA or XO from the sources?
If XOA:
- which release channel? (`stable` vs `latest`)
- please consider creating a support ticket in [your dedicated support area](https://xen-orchestra.com/#!/member/support)
If XO from the sources:
- Provide **your commit number**. If it's older than a week, we won't investigate
- Don't forget to [read this first](https://xen-orchestra.com/docs/community.html)
- As well as follow [this guide](https://xen-orchestra.com/docs/community.html#report-a-bug)
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Environment (please provide the following information):**
- Node: [e.g. 16.12.1]
- hypervisor: [e.g. XCP-ng 8.2.0]
**Additional context**
Add any other context about the problem here.

119
.github/ISSUE_TEMPLATE/bug_report.yml vendored Normal file
View File

@@ -0,0 +1,119 @@
name: Bug Report
description: Create a report to help us improve
labels: ['type: bug :bug:', 'status: triaging :triangular_flag_on_post:']
body:
- type: markdown
attributes:
value: |
1. ⚠️ **If you don't follow this template, the issue will be closed**.
2. ⚠️ **If your issue can't be easily reproduced, please report it [on the forum first](https://xcp-ng.org/forum/category/12/xen-orchestra)**.
- type: markdown
attributes:
value: '## Are you using XOA or XO from the sources?'
- type: dropdown
id: xo-origin
attributes:
label: Are you using XOA or XO from the sources?
options:
- XOA
- XO from the sources
- both
validations:
required: false
- type: markdown
attributes:
value: '### If XOA:'
- type: dropdown
id: xoa-channel
attributes:
label: Which release channel?
description: please consider creating a support ticket in [your dedicated support area](https://xen-orchestra.com/#!/member/support)
options:
- stable
- latest
- both
validations:
required: false
- type: markdown
attributes:
value: '### If XO from the sources:'
- type: markdown
attributes:
value: |
- Don't forget to [read this first](https://docs.xen-orchestra.com/community)
- As well as follow [this guide](https://docs.xen-orchestra.com/community#report-a-bug)
- type: input
id: xo-sources-commit-number
attributes:
label: Provide your commit number
description: If it's older than a week, we won't investigate
placeholder: e.g. 579f0
validations:
required: false
- type: markdown
attributes:
value: '## Bug description:'
- type: textarea
id: bug-description
attributes:
label: Describe the bug
description: A clear and concise description of what the bug is
validations:
required: true
- type: textarea
id: error-message
attributes:
label: Error message
render: Text
validations:
required: false
- type: textarea
id: steps
attributes:
label: To reproduce
description: 'Steps to reproduce the behavior:'
value: |
1. Go to '...'
2. Click on '...'
3. Scroll down to '...'
4. See error
validations:
required: false
- type: textarea
id: expected-behavior
attributes:
label: Expected behavior
description: A clear and concise description of what you expected to happen
validations:
required: false
- type: textarea
id: screenshots
attributes:
label: Screenshots
description: If applicable, add screenshots to help explain your problem
validations:
required: false
- type: markdown
attributes:
value: '## Environment (please provide the following information):'
- type: input
id: node-version
attributes:
label: Node
placeholder: e.g. 16.12.1
validations:
required: true
- type: input
id: hypervisor-version
attributes:
label: Hypervisor
placeholder: e.g. XCP-ng 8.2.0
validations:
required: true
- type: textarea
id: additional-context
attributes:
label: Additional context
description: Add any other context about the problem here
validations:
required: false

View File

@@ -1,32 +1,50 @@
name: Continous Integration
name: Continuous Integration
on: push
jobs:
CI:
runs-on: ubuntu-latest
steps:
# https://github.com/actions/checkout
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Install packages
run: |
sudo apt-get update
sudo apt-get install -y curl qemu-utils python3-vmdkstream git libxml2-utils libfuse2 nbdkit
# https://turbo.build/repo/docs/guides/ci-vendors/github-actions#caching-with-github-actionscache
- name: Cache Turbo
# https://github.com/actions/cache
uses: actions/cache@v3
uses: actions/cache@v4
with:
path: '**/node_modules/.cache/turbo'
key: ${{ runner.os }}-turbo-cache
path: '.turbo'
key: ${{ runner.os }}-turbo-${{ github.sha }}
restore-keys: |
${{ runner.os }}-turbo-
# https://github.com/actions/setup-node
- name: Setup Node environment
# https://github.com/actions/setup-node
uses: actions/setup-node@v3
uses: actions/setup-node@v4
with:
node-version: '18'
node-version: '>=22.12'
cache: 'yarn'
- name: Install project dependencies
run: yarn
- name: Ensure packages are sorted in CHANGELOG.unreleased.md
run: ./scripts/gen-deps-list.js --check-order > /dev/null
- name: Ensure yarn.lock is up-to-date
run: git diff --exit-code yarn.lock
- name: Build the project
run: yarn build
- name: Unit tests
run: yarn test-unit
- name: Lint tests
run: yarn test-lint
- name: Integration tests
run: sudo yarn test-integration

6
.gitignore vendored
View File

@@ -7,6 +7,8 @@
/@vates/*/node_modules/
/@xen-orchestra/*/dist/
/@xen-orchestra/*/node_modules/
/@xen-orchestra/rest-api/open-api/spec/swagger.json
/@xen-orchestra/rest-api/src/open-api/routes/routes.ts
/packages/*/dist/
/packages/*/node_modules/
@@ -30,8 +32,12 @@ pnpm-debug.log.*
yarn-error.log
yarn-error.log.*
.env
*.tsbuildinfo
# code coverage
.nyc_output/
coverage/
.turbo/
# https://node-tap.org/dot-tap-folder/
.tap/

6
.prettierignore Normal file
View File

@@ -0,0 +1,6 @@
# Ignore Handlebars files because partials are not currently supported
# https://github.com/prettier/prettier/issues/11834
**/*.hbs
# Generated files
/@xen-orchestra/web/typed-router.d.ts

View File

@@ -16,7 +16,7 @@ Returns a promise wich rejects as soon as a call to `iteratee` throws or a promi
- `concurrency`: a number which indicates the maximum number of parallel call to `iteratee`, defaults to `10`. The value `0` means no concurrency limit.
- `signal`: an abort signal to stop the iteration
- `stopOnError`: wether to stop iteration of first error, or wait for all calls to finish and throw an `AggregateError`, defaults to `true`
- `stopOnError`: whether to stop iteration of first error, or wait for all calls to finish and throw an `AggregateError`, defaults to `true`
```js
import { asyncEach } from '@vates/async-each'

View File

@@ -34,7 +34,7 @@ Returns a promise wich rejects as soon as a call to `iteratee` throws or a promi
- `concurrency`: a number which indicates the maximum number of parallel call to `iteratee`, defaults to `10`. The value `0` means no concurrency limit.
- `signal`: an abort signal to stop the iteration
- `stopOnError`: wether to stop iteration of first error, or wait for all calls to finish and throw an `AggregateError`, defaults to `true`
- `stopOnError`: whether to stop iteration of first error, or wait for all calls to finish and throw an `AggregateError`, defaults to `true`
```js
import { asyncEach } from '@vates/async-each'

5
@vates/async-each/index.d.ts vendored Normal file
View File

@@ -0,0 +1,5 @@
export function asyncEach<Item>(
iterable: Iterable<Item> | AsyncIterable<Item>,
iteratee: (item: Item, index: number, iterable: Iterable<Item> | AsyncIterable<Item>) => Promise<void>,
opts?: { concurrency?: number; signal?: AbortSignal; stopOnError?: boolean }
): Promise<void>

View File

@@ -11,8 +11,8 @@ class AggregateError extends Error {
/**
* @template Item
* @param {Iterable<Item>} iterable
* @param {(item: Item, index: number, iterable: Iterable<Item>) => Promise<void>} iteratee
* @param {Iterable<Item>|AsyncIterable<Item>} iterable
* @param {(item: Item, index: number, iterable: Iterable<Item>|AsyncIterable<Item>) => Promise<void>} iteratee
* @returns {Promise<void>}
*/
exports.asyncEach = function asyncEach(iterable, iteratee, { concurrency = 10, signal, stopOnError = true } = {}) {
@@ -73,20 +73,20 @@ exports.asyncEach = function asyncEach(iterable, iteratee, { concurrency = 10, s
}
nextIsRunning = true
if (running < concurrency) {
const cursor = await it.next()
if (cursor.done) {
next = () => {
if (running === 0) {
if (errors.length === 0) {
resolve()
} else {
reject(new AggregateError(errors))
try {
const cursor = await it.next()
if (cursor.done) {
next = () => {
if (running === 0) {
if (errors.length === 0) {
resolve()
} else {
reject(new AggregateError(errors))
}
}
}
}
} else {
++running
try {
} else {
++running
const result = iteratee.call(this, cursor.value, index++, iterable)
let then
if (result != null && typeof result === 'object' && typeof (then = result.then) === 'function') {
@@ -94,9 +94,9 @@ exports.asyncEach = function asyncEach(iterable, iteratee, { concurrency = 10, s
} else {
onFulfilled(result)
}
} catch (error) {
onRejected(error)
}
} catch (error) {
onRejected(error)
}
nextIsRunning = false
return next()

View File

@@ -1,6 +1,6 @@
'use strict'
const { describe, it, beforeEach } = require('test')
const { describe, it, beforeEach } = require('node:test')
const assert = require('assert').strict
const { spy } = require('sinon')
@@ -67,20 +67,17 @@ describe('asyncEach', () => {
})
it('stops on first error when stopOnError is true', async () => {
const tracker = new assert.CallTracker()
const error = new Error()
const iteratee = tracker.calls((_, i) => {
const iteratee = spy((_, i) => {
if (i === 1) {
throw error
}
}, 2)
})
assert.deepStrictEqual(
await rejectionOf(asyncEach(iterable, iteratee, { concurrency: 1, stopOnError: true })),
error
)
tracker.verify()
assert.deepStrictEqual(iteratee.callCount, 2)
})
it('rejects AggregateError when stopOnError is false', async () => {
@@ -100,19 +97,30 @@ describe('asyncEach', () => {
})
it('can be interrupted with an AbortSignal', async () => {
const tracker = new assert.CallTracker()
const ac = new AbortController()
const iteratee = tracker.calls((_, i) => {
const iteratee = spy((_, i) => {
if (i === 1) {
ac.abort()
}
}, 2)
})
await assert.rejects(asyncEach(iterable, iteratee, { concurrency: 1, signal: ac.signal }), {
message: 'asyncEach aborted',
})
assert.deepStrictEqual(iteratee.callCount, 2)
})
tracker.verify()
it('handle error on iterable', async () => {
const iteratee = spy(async () => {})
const iterable = async function* () {
for (const value of [1, 2, 3]) {
if (value === 2) {
throw new Error('iterator error')
}
await randomDelay()
yield value
}
}
await assert.rejects(() => asyncEach(iterable(), iteratee, { concurrency: 1 }), { message: 'iterator error' })
})
})
)

View File

@@ -24,17 +24,16 @@
"url": "https://vates.fr"
},
"license": "ISC",
"version": "1.0.0",
"types": "index.d.ts",
"version": "1.0.3",
"engines": {
"node": ">=8.10"
},
"scripts": {
"postversion": "npm publish --access public",
"test": "node--test"
"test": "node --test"
},
"devDependencies": {
"sinon": "^16.0.0",
"tap": "^16.3.0",
"test": "^3.2.1"
"sinon": "^18.0.0"
}
}

View File

@@ -1,6 +1,6 @@
'use strict'
const { describe, it } = require('test')
const { describe, it } = require('node:test')
const assert = require('assert')
const { coalesceCalls } = require('./')

View File

@@ -31,9 +31,6 @@
},
"scripts": {
"postversion": "npm publish --access public",
"test": "node--test"
},
"devDependencies": {
"test": "^3.2.1"
"test": "node --test"
}
}

View File

@@ -1,6 +1,6 @@
'use strict'
const { describe, it } = require('test')
const { describe, it } = require('node:test')
const assert = require('node:assert').strict
const { compose } = require('./')

View File

@@ -20,9 +20,6 @@
},
"scripts": {
"postversion": "npm publish --access public",
"test": "node--test"
},
"devDependencies": {
"test": "^3.2.1"
"test": "node --test"
}
}

View File

@@ -62,6 +62,42 @@ decorateClass(Foo, {
})
```
### `decorateObject(object, map)`
Decorates an object the same way `decorateClass()` decorates a class:
```js
import { decorateObject } from '@vates/decorate-with'
const object = {
get bar() {
// body
},
set bar(value) {
// body
},
baz() {
// body
},
}
decorateObject(object, {
// getter and/or setter
bar: {
// without arguments
get: lodash.memoize,
// with arguments
set: [lodash.debounce, 150],
},
// method (with or without arguments)
baz: lodash.curry,
})
```
### `perInstance(fn, ...args)`
Helper to decorate the method by instance instead of for the whole class.

View File

@@ -80,6 +80,42 @@ decorateClass(Foo, {
})
```
### `decorateObject(object, map)`
Decorates an object the same way `decorateClass()` decorates a class:
```js
import { decorateObject } from '@vates/decorate-with'
const object = {
get bar() {
// body
},
set bar(value) {
// body
},
baz() {
// body
},
}
decorateObject(object, {
// getter and/or setter
bar: {
// without arguments
get: lodash.memoize,
// with arguments
set: [lodash.debounce, 150],
},
// method (with or without arguments)
baz: lodash.curry,
})
```
### `perInstance(fn, ...args)`
Helper to decorate the method by instance instead of for the whole class.

View File

@@ -14,10 +14,13 @@ function applyDecorator(decorator, value) {
}
exports.decorateClass = exports.decorateMethodsWith = function decorateClass(klass, map) {
const { prototype } = klass
return decorateObject(klass.prototype, map)
}
function decorateObject(object, map) {
for (const name of Object.keys(map)) {
const decorator = map[name]
const descriptor = getOwnPropertyDescriptor(prototype, name)
const descriptor = getOwnPropertyDescriptor(object, name)
if (typeof decorator === 'function' || Array.isArray(decorator)) {
descriptor.value = applyDecorator(decorator, descriptor.value)
} else {
@@ -30,10 +33,11 @@ exports.decorateClass = exports.decorateMethodsWith = function decorateClass(kla
}
}
defineProperty(prototype, name, descriptor)
defineProperty(object, name, descriptor)
}
return klass
return object
}
exports.decorateObject = decorateObject
exports.perInstance = function perInstance(fn, decorator, ...args) {
const map = new WeakMap()

View File

@@ -1,7 +1,7 @@
'use strict'
const assert = require('assert')
const { describe, it } = require('test')
const { describe, it } = require('node:test')
const { decorateClass, decorateWith, decorateMethodsWith, perInstance } = require('./')

View File

@@ -20,15 +20,12 @@
"url": "https://vates.fr"
},
"license": "ISC",
"version": "2.0.0",
"version": "2.1.0",
"engines": {
"node": ">=8.10"
},
"scripts": {
"postversion": "npm publish --access public",
"test": "node--test"
},
"devDependencies": {
"test": "^3.2.1"
"test": "node --test"
}
}

View File

@@ -7,7 +7,7 @@
* @param {Array|Buffer|string} data1 - The first data array or buffer to compare.
* @param {T} data2 - The second data array or buffer to compare.
* @param {(index: number, diff: T) => void} [cb] - The callback function to invoke for each difference. If not provided, an array of differences will be returned.
* @returns {Array<number|T>|undefined} - An array of differences if no callback is provided, otherwise undefined.
* @returns {Array<number|T>|undefined} - An array of differences if no callback is provided; otherwise, undefined.
*/
module.exports = function diff(data1, data2, cb) {
let result

View File

@@ -1,7 +1,7 @@
'use strict'
const assert = require('node:assert/strict')
const test = require('test')
const test = require('node:test')
const diff = require('./index.js')

View File

@@ -28,9 +28,6 @@
},
"scripts": {
"postversion": "npm publish --access public",
"test": "node--test"
},
"devDependencies": {
"test": "^3.3.0"
"test": "node --test"
}
}

View File

@@ -14,7 +14,7 @@ import { deduped } from '@vates/disposable/deduped'
// the connection with the passed host will be established once at the first call, then, it will be shared with the next calls
const getConnection = deduped(async function (host)) {
const connection = new Connection(host)
return new Disposabe(connection, () => connection.close())
return new Disposable(connection, () => connection.close())
}, host => [host])
```

View File

@@ -32,7 +32,7 @@ import { deduped } from '@vates/disposable/deduped'
// the connection with the passed host will be established once at the first call, then, it will be shared with the next calls
const getConnection = deduped(async function (host)) {
const connection = new Connection(host)
return new Disposabe(connection, () => connection.close())
return new Disposable(connection, () => connection.close())
}, host => [host])
```

View File

@@ -1,6 +1,6 @@
'use strict'
const { describe, it } = require('test')
const { describe, it } = require('node:test')
const { useFakeTimers, spy, assert } = require('sinon')
const { createDebounceResource } = require('./debounceResource')

View File

@@ -1,6 +1,6 @@
'use strict'
const { describe, it } = require('test')
const { describe, it } = require('node:test')
const { spy, assert } = require('sinon')
const { deduped } = require('./deduped')

View File

@@ -14,22 +14,21 @@
"url": "https://vates.fr"
},
"license": "ISC",
"version": "0.1.4",
"version": "0.1.6",
"engines": {
"node": ">=8.10"
},
"scripts": {
"postversion": "npm publish --access public",
"test": "node--test"
"test": "node --test"
},
"dependencies": {
"@vates/multi-key-map": "^0.1.0",
"@xen-orchestra/async-map": "^0.1.2",
"@xen-orchestra/log": "^0.6.0",
"@vates/multi-key-map": "^0.2.0",
"@xen-orchestra/async-map": "^0.1.3",
"@xen-orchestra/log": "^0.7.2",
"ensure-array": "^1.0.0"
},
"devDependencies": {
"sinon": "^16.0.0",
"test": "^3.2.1"
"sinon": "^18.0.0"
}
}

View File

@@ -20,6 +20,9 @@ function assertListeners(t, event, listeners) {
}
t.beforeEach(function (t) {
// work around https://github.com/tapjs/tapjs/issues/998
t.context = {}
t.context.ee = new EventEmitter()
t.context.em = new EventListenersManager(t.context.ee)
})

View File

@@ -38,9 +38,9 @@
"version": "1.0.1",
"scripts": {
"postversion": "npm publish --access public",
"test": "tap --branches=72"
"test": "tap --allow-incomplete-coverage"
},
"devDependencies": {
"tap": "^16.2.0"
"tap": "^18.7.0"
}
}

127
@vates/fatfs/README.md Normal file
View File

@@ -0,0 +1,127 @@
# @vates/fatfs
This is a fork of the original library [natevw/fatfs](https://github.com/natevw/fatfs).
## Why?
This fork was created to add a missing feature in the original library: the ability to create labels (createLabel).
The original library did not support this functionality, which was required to make Cloudbase-Init work on windows VMs.
See: https://github.com/natevw/fatfs/issues/30, https://github.com/natevw/fatfs/pull/31
A standalone FAT16/FAT32 implementation that takes in a block-access interface and exposes something quite similar to `require('fs')` (i.e. the node.js built-in [Filesystem API](http://nodejs.org/api/fs.html)).
## Installation
`npm install fatfs`
## Example
```js
var fatfs = require('fatfs'),
fs = fatfs.createFileSystem(exampleDriver) // see below
fs.stat('autoexec.bat', function (e, stats) {
if (e) console.error(e)
else console.log(stats)
})
// TODO: open a file and write to it or something…
```
## API
- `fs = fatfs.createFileSystem(vol, [opts], [cb])` — Simply pass in a block driver (see below) mapped to a FAT partition somewhere, and get back an instance of an [`fs`](http://nodejs.org/api/fs.html). An options dictionary can be provided, details are in the next section. You may also optionally provide a callback `cb(err)` which will be automatically registered for the on `'ready'` or `'error'` event.
- `'ready'` event — fired on `fs` when initial volume information has been determined and the API is ready to use. It is safe to call other `fs` methods before this fires **only if** you are sure the first sector will be readable and represents a valid FAT volume.
- `'error'` event — fired if initialization fails for whatever reason.
### Filesystem options
The `opts` dictionary you pass to `fatfs.createFileSystem` can contain any of the following options:
- `ro` — Enables readonly mode if `true`. It defaults to `false`, but if your volume driver does not provide a `writeSectors` method it will be overridden to `true`.
- `noatime` — The FAT filesystem can track the last access time (just a date, actually) but this means every read operation would also incur some write overhead. Defaults to `true`, meaning by default access times will **not** be updated on reads. Set this to `false` to track access times.
- `modmode` — chooses how `fs.chmod` (and the mode field from `fs.stat`–family calls) should map FAT attributes to POSIX permissions. Set to the number `0111` to map the readonly flag to the user's write bit being unset, and the archive/system/hidden flags to the user/group/other executable bits respectively. Set to the number `07000` to map the readonly flag to _all_ write bits being unset, and the archive/system/hidden flags to the sticky/setgid/setuid bits respectively. Set to `null` for readonly mapping. Defaults to `0111`.
- `umask` — any bits _set_ in this octal number will be _unset_ in the 'mode' field from `fs.stat`–family calls. It does not affect anything else. Defaults to `process.umask()`, or `0022` if that is unavailable.
- `uid` — This value will be returned as the 'uid' stat field. It does not affect anything else. Defaults to `process.getuid()`, or `0` if that is unavailable.
- `gid` — This value will be returned as the 'gid' stat field. It does not affect anything else. Defaults to `process.getgid()`, or `0` if that is unavailable.
(Note that these are similar to the options you could use with a POSIX `mount` operation.)
And that's it! The [rest of the API](http://nodejs.org/api/fs.html) (`fs.readdir`, `fs.open`, `fs.createReadStream`, `fs.appendFile`, etc.) is as documented by the node.js project.
Well, sort of…
## Caveats
### Temporary
- **BETA** **BETA** **BETA**. Seriously, this is a _brand new_, _from scratch_, _completely unproven_ filesystem implementation. It does not have full automated test coverage, and it has not been manually tested very much either. Please, please, please, **make sure you have a backup** of any important drive/image/card you unleash this upon.
- A few methods are not quite implemented, either: `fs.rename`, `fs.unlink` and `fs.rmdir`, as well as `fs.watchFile`/`fs.unwatchFile` and `fs.watch`. These are Coming Soon™.
- There are several internal housekeeping items (redundant FAT tables, extra FAT32 information, etc.) that are not done. These do not seem to affect interop, but you may see warnings when repairing a filesystem written by this module.
- Oh, and not to scare you, but if an IO error happens while writing, the library usually just bails — bubbling an error up to your callback as if it were a hot potato. Although some attempt has been made to do separate writes in the safest order (e.g. allocating an additional file cluster, then appending data into it, and then finally updating the file's size), but this behavior has not been thoroughly audited for all operations. There's certainly no attempt to retry/cleanup/rollback if a multi-step change runs into trouble partway through.
### As-planned
Some of the differences between `fatfs` and the node.js `fs` module are "by design" for architectural simplicity and/or due to underlying FAT limitations.
- There are no `fs.*Sync` methods. (The volume driver is async, not to mention that supporting a separate \*Sync codepath would be an enormous duplication of effort of dubious value.)
- This module does [almost] no read/write caching. This should be done in your volume driver, but see notes below.
- You'll need multiple `createFileSystem` instances for multiple volumes; paths are relative to each, and don't share a namespace.
- The FAT filesystem has no concept of symlinks, and hardlinks are not really an intentional feature. You will get an ENOSYS-like error when trying to create either type of link.
## "Volume driver" API
To use 'fatfs', you must provide a driver object with the following properties/methods:
- `driver.sectorSize` — number of bytes per sector on this device
- `driver.numSectors` — count of sectors available on this media
- `driver.readSectors(i, dest, cb)` — Fill `dest` with data starting at the `i`th sector and notify `cb(e)` when finished. You may assume `dest.length` is a multiple of `driver.sectorSize`.
- `driver.writeSectors(i, data, cb)` — (optional) Write `data` starting at the `i`th sector and notify `cb(e)` when finished. You may assume `data.length` is a multiple of `driver.sectorSize`.
If you do not provide a `writeSectors` method, then `fatfs` will work in readonly mode. Pretty simple, eh? And the 'fatfs' module makes a good effort to check the parameters passed to your driver methods!
**TBD:** to facilitate proper cache handling, this module might add an optional `driver.flush(cb)` method at some point in the future.
Here's an example taken from code used to run this module's own tests:
```js
// NOTE: this assumes image at `path` has no partition table.
// If it did, you'd need to translate positions, natch…
var fs = require('fs')
exports.createDriverSync = function (path, opts) {
opts || (opts = {})
var secSize = 512,
ro = opts.readOnly || false,
fd = fs.openSync(path, ro ? 'r' : 'r+'),
s = fs.fstatSync(fd)
return {
sectorSize: secSize,
numSectors: s.size / secSize,
readSectors: function (i, dest, cb) {
if (dest.length % secSize) throw Error('Unexpected buffer length!')
fs.read(fd, dest, 0, dest.length, i * secSize, function (e, n, d) {
cb(e, d)
})
},
writeSectors: ro
? null
: function (i, data, cb) {
if (data.length % secSize) throw Error('Unexpected buffer length!')
fs.write(fd, data, 0, data.length, i * secSize, function (e) {
cb(e)
})
},
}
}
```
## License
© 2014 Nathan Vander Wilt.
Funding for this work was provided by Technical Machine, Inc.
Reuse under your choice of:
- [BSD-2-Clause](http://opensource.org/licenses/BSD-2-Clause)
- [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.html)

60
@vates/fatfs/cache.js Normal file
View File

@@ -0,0 +1,60 @@
var _ = require("./helpers.js");
exports.wrapDriver = function (volume, opts) {
opts = _.extend({
maxSectors: 2048
}, opts);
var cache = {},
advice = 'NORMAL',
secSize = volume.sectorSize;
function _freezeBuffer(b) {
var f = _.allocBuffer(b.length);
b.copy(f);
return f;
}
function addToCache(i, data) {
if (advice === 'SEQUENTIAL' || advice === 'NOREUSE') return;
data = _freezeBuffer(data);
cache[i] = data;
//if (data.length > secSize) addToCache(i+1, data.slice(secSize));
while (data.length > secSize) {
data = data.slice(secSize);
cache[++i] = data;
}
// simple highest-sectors-lose eviction policy for now
Object.keys(cache).sort().slice(opts.maxSectors).forEach(function (x) {
delete cache[x];
});
_.log(_.log.DBG, "Cache now contains:", Object.keys(cache).join(','));
}
return {
sectorSize: volume.sectorSize,
numSectors: volume.numSectors,
advice: function (val) {
if (!arguments.length) return advice;
else advice = val;
if (advice === 'SEQUENTIAL' || advice === 'NOREUSE') cache = {};
return this;
},
readSectors: function (i, dest, cb) {
// TODO: handle having partial parts of dest!
if (i in cache && dest.length === secSize) {
cache[i].copy(dest);
setImmediate(cb);
} else volume.readSectors(i, dest, function (e) {
if (e) cb(e);
else addToCache(i, dest), cb();
});
},
writeSectors: (!volume.writeSectors) ? null : function (i, data, cb) {
volume.writeSectors(i, data, function (e) {
if (e) cb(e);
else addToCache(i, data), cb();
});
}
};
};

287
@vates/fatfs/chains.js Normal file
View File

@@ -0,0 +1,287 @@
var S = require("./structs.js"),
_ = require("./helpers.js");
function _baseChain(vol) {
var chain = {};
chain.sectorSize = vol._sectorSize;
function posFromOffset(off) {
var secSize = chain.sectorSize,
offset = off % secSize,
sector = (off - offset) / secSize;
return {sector:sector, offset:offset};
}
var sectorCache = vol._makeCache();
Object.defineProperty(chain, 'cacheAdvice', {
enumerable: true,
get: function () { return sectorCache.advice(); },
set: function (v) { sectorCache.advice(v); }
});
chain._vol_readSectors = vol._readSectors.bind(vol, sectorCache);
chain._vol_writeSectors = vol._writeSectors.bind(vol, sectorCache);
// cb(error, bytesRead, buffer)
chain.readFromPosition = function (targetPos, buffer, cb) {
if (typeof targetPos === 'number') targetPos = posFromOffset(targetPos);
if (typeof buffer === 'number') buffer = _.allocBuffer(buffer);
/* NOTE: to keep our contract with the volume driver, we need to read on _full_ sector boundaries!
So we divide the read into [up to] three parts: {preface, main, trailer}
This is kind of unfortunate, but in practice should often still be reasonably efficient. */
if (targetPos.offset) chain.readSectors(targetPos.sector, _.allocBuffer(chain.sectorSize), function (e,d) {
if (e || !d) cb(e, 0, buffer);
else { // copy preface into `buffer`
var dBeg = targetPos.offset,
dEnd = dBeg + buffer.length;
d.copy(buffer, 0, dBeg, dEnd);
if (dEnd > d.length) readMain();
else cb(null, buffer.length, buffer);
}
}); else readMain();
function readMain() {
var prefaceLen = targetPos.offset && (chain.sectorSize - targetPos.offset),
trailerLen = (buffer.length - prefaceLen) % chain.sectorSize,
mainSector = (prefaceLen) ? targetPos.sector + 1 : targetPos.sector,
mainBuffer = (trailerLen) ? buffer.slice(prefaceLen, -trailerLen) : buffer.slice(prefaceLen);
if (mainBuffer.length) chain.readSectors(mainSector, mainBuffer, function (e,d) {
if (e || !d) cb(e, prefaceLen, buffer);
else if (!trailerLen) cb(null, buffer.length, buffer);
else readTrailer();
}); else readTrailer();
function readTrailer() {
var trailerSector = mainSector + (mainBuffer.length / chain.sectorSize);
chain.readSectors(trailerSector, _.allocBuffer(chain.sectorSize), function (e,d) {
if (e || !d) cb(e, buffer.length-trailerLen, buffer);
else {
d.copy(buffer, buffer.length-trailerLen, 0, trailerLen);
cb(null, buffer.length, buffer);
}
});
}
}
};
// cb(error)
chain.writeToPosition = function (targetPos, data, cb) {
_.log(_.log.DBG, "WRITING", data.length, "bytes at", targetPos, "in", this.toJSON(), data);
if (typeof targetPos === 'number') targetPos = posFromOffset(targetPos);
var prefaceBuffer = (targetPos.offset) ? data.slice(0, chain.sectorSize-targetPos.offset) : null;
if (prefaceBuffer) _modifySector(targetPos.sector, targetPos.offset, prefaceBuffer, function (e) {
if (e) cb(e);
else if (prefaceBuffer.length < data.length) writeMain();
else cb();
}); else writeMain();
function writeMain() {
var prefaceLen = (prefaceBuffer) ? prefaceBuffer.length : 0,
trailerLen = (data.length - prefaceLen) % chain.sectorSize,
mainSector = (prefaceLen) ? targetPos.sector + 1 : targetPos.sector,
mainBuffer = (trailerLen) ? data.slice(prefaceLen, -trailerLen) : data.slice(prefaceLen);
if (mainBuffer.length) chain.writeSectors(mainSector, mainBuffer, function (e) {
if (e) cb(e);
else if (!trailerLen) cb();
else writeTrailer();
}); else writeTrailer();
function writeTrailer() {
var trailerSector = mainSector + (mainBuffer.length / chain.sectorSize),
trailerBuffer = data.slice(data.length-trailerLen); // WORKAROUND: https://github.com/tessel/runtime/issues/721
_modifySector(trailerSector, 0, trailerBuffer, cb);
}
}
function _modifySector(sec, off, data, cb) {
chain.readSectors(sec, _.allocBuffer(chain.sectorSize), function (e, orig) {
if (e) return cb(e);
orig || (orig = _.allocBuffer(chain.sectorSize, 0));
data.copy(orig, off);
chain.writeSectors(sec, orig, cb);
});
}
};
return chain;
};
exports.clusterChain = function (vol, firstCluster, _parent) {
var chain = _baseChain(vol),
cache = [firstCluster];
chain.firstCluster = firstCluster;
function _cacheIsComplete() {
return cache[cache.length-1] === 'eof';
}
function extendCacheToInclude(i, cb) { // NOTE: may `cb()` before returning!
if (i < cache.length) cb(null, cache[i]);
else if (_cacheIsComplete()) cb(null, 'eof');
else vol.fetchFromFAT(cache[cache.length-1], function (e,d) {
if (e) cb(e);
else if (typeof d === 'string' && d !== 'eof') cb(S.err.IO());
else {
cache.push(d);
extendCacheToInclude(i, cb);
}
});
}
function expandChainToLength(clusterCount, cb) {
if (!_cacheIsComplete()) throw Error("Must be called only when cache is complete!");
else cache.pop(); // remove 'eof' entry until finished
function addCluster(clustersNeeded, lastCluster) {
if (!clustersNeeded) cache.push('eof'), cb();
else vol.allocateInFAT(lastCluster, function (e, newCluster) {
if (e) cb(e);
else vol.storeToFAT(lastCluster, newCluster, function (e) {
if (e) return cb(e);
cache.push(newCluster);
addCluster(clustersNeeded-1, newCluster);
});
});
}
addCluster(clusterCount - cache.length, cache[cache.length - 1]);
}
function shrinkChainToLength(clusterCount, cb) {
if (!_cacheIsComplete()) throw Error("Must be called only when cache is complete!");
else cache.pop(); // remove 'eof' entry until finished
function removeClusters(count, cb) {
if (!count) cache.push('eof'), cb();
else vol.storeToFAT(cache.pop(), 'free', function (e) {
if (e) cb(e);
else removeClusters(count - 1, cb);
});
}
// NOTE: for now, we don't remove the firstCluster ourselves; we should though!
if (clusterCount) removeClusters(cache.length - clusterCount, cb);
else removeClusters(cache.length - 1, cb);
}
// [{firstSector,numSectors},{firstSector,numSectors},…]
function determineSectorGroups(sectorIdx, numSectors, alloc, cb) {
var sectorOffset = sectorIdx % vol._sectorsPerCluster,
clusterIdx = (sectorIdx - sectorOffset) / vol._sectorsPerCluster,
numClusters = Math.ceil((numSectors + sectorOffset) / vol._sectorsPerCluster),
chainLength = clusterIdx + numClusters;
extendCacheToInclude(chainLength-1, function (e,c) {
if (e) cb(e);
else if (c === 'eof' && alloc) expandChainToLength(chainLength, function (e) {
if (e) cb(e);
else _determineSectorGroups();
});
else _determineSectorGroups();
});
function _determineSectorGroups() {
// …now we have a complete cache
var groups = [],
_group = null;
for (var i = clusterIdx; i < chainLength; ++i) {
var c = (i < cache.length) ? cache[i] : 'eof';
if (c === 'eof') break;
else if (_group && c !== _group._nextCluster) {
groups.push(_group);
_group = null;
}
if (!_group) _group = {
_nextCluster: c+1,
firstSector: vol._firstSectorOfCluster(c) + sectorOffset,
numSectors: vol._sectorsPerCluster - sectorOffset
}; else {
_group._nextCluster += 1;
_group.numSectors += vol._sectorsPerCluster;
}
sectorOffset = 0; // only first group is offset
}
if (_group) groups.push(_group);
cb(null, groups, i === chainLength);
}
}
chain.readSectors = function (i, dest, cb) {
var groupOffset = 0, groupsPending;
determineSectorGroups(i, dest.length / chain.sectorSize, false, function (e, groups, complete) {
if (e) cb(e);
else if (!complete) groupsPending = -1, _pastEOF(cb);
else if ((groupsPending = groups.length)) groups.forEach(function (group) {
var groupLength = group.numSectors * chain.sectorSize,
groupBuffer = dest.slice(groupOffset, groupOffset += groupLength);
chain._vol_readSectors(group.firstSector, groupBuffer, function (e,d) {
if (e && groupsPending !== -1) groupsPending = -1, cb(e);
else if (--groupsPending === 0) cb(null, dest);
});
});
else cb(null, dest); // 0-length destination case
});
};
// TODO: does this handle NOSPC condition?
chain.writeSectors = function (i, data, cb) {
var groupOffset = 0, groupsPending;
determineSectorGroups(i, data.length / chain.sectorSize, true, function (e, groups) {
if (e) cb(e);
else if ((groupsPending = groups.length)) groups.forEach(function (group) {
var groupLength = group.numSectors * chain.sectorSize,
groupBuffer = data.slice(groupOffset, groupOffset += groupLength);
chain._vol_writeSectors(group.firstSector, groupBuffer, function (e) {
if (e && groupsPending !== -1) groupsPending = -1, cb(e);
else if (--groupsPending === 0) cb();
});
});
else cb(); // 0-length data case
});
};
chain.truncate = function (numSectors, cb) {
extendCacheToInclude(Infinity, function (e,c) {
if (e) return cb(e);
var currentLength = cache.length-1,
clustersNeeded = Math.ceil(numSectors / vol._sectorsPerCluster);
if (clustersNeeded < currentLength) shrinkChainToLength(clustersNeeded, cb);
else if (clustersNeeded > currentLength) expandChainToLength(clustersNeeded, cb);
else cb();
});
};
chain.toJSON = function () {
return {firstCluster:firstCluster};
};
return chain;
};
exports.sectorChain = function (vol, firstSector, numSectors) {
var chain = _baseChain(vol);
chain.firstSector = firstSector;
chain.numSectors = numSectors;
chain.readSectors = function (i, dest, cb) {
if (i < numSectors) chain._vol_readSectors(firstSector+i, dest, cb);
else _pastEOF(cb);
};
chain.writeSectors = function (i, data, cb) {
if (i < numSectors) chain._vol_writeSectors(firstSector+i, data, cb);
else _.delayedCall(cb, S.err.NOSPC());
};
chain.truncate = function (i, cb) {
_.delayedCall(cb, S.err.INVAL());
};
chain.toJSON = function () {
return {firstSector:firstSector, numSectors:numSectors};
};
return chain;
};
// NOTE: used with mixed feelings, broken out to mark uses
function _pastEOF(cb) { _.delayedCall(cb, null, null); }

372
@vates/fatfs/dir.js Normal file
View File

@@ -0,0 +1,372 @@
var S = require("./structs.js"),
_ = require("./helpers.js");
var dir = exports;
dir.iterator = function (dirChain, opts) {
opts || (opts = {});
var cache = {buffer:null, n: null};
function getSectorBuffer(n, cb) {
if (cache.n === n) cb(null, cache.buffer);
else cache.n = cache.buffer = null, dirChain.readSectors(n, _.allocBuffer(dirChain.sectorSize), function (e,d) {
if (e) cb(e);
else if (!d) return cb(null, null);
else {
cache.n = n;
cache.buffer = d;
getSectorBuffer(n, cb);
}
});
}
var secIdx = 0,
off = {bytes:0},
long = null;
function getNextEntry(cb) {
if (off.bytes >= dirChain.sectorSize) {
secIdx += 1;
off.bytes -= dirChain.sectorSize;
}
var entryPos = {chain:dirChain, sector:secIdx, offset:off.bytes};
getSectorBuffer(secIdx, function (e, buf) {
if (e) return cb(S.err.IO());
else if (!buf) return cb(null, null, entryPos);
var entryIdx = off.bytes,
signalByte = buf[entryIdx];
if (signalByte === S.entryDoneFlag) return cb(null, null, entryPos);
else if (signalByte === S.entryFreeFlag) {
off.bytes += S.dirEntry.size;
long = null;
if (opts.includeFree) return cb(null, {_free:true,_pos:entryPos}, entryPos);
else return getNextEntry(cb); // usually just skip these
}
var attrByte = buf[entryIdx+S.dirEntry.fields.Attr.offset],
entryType = (attrByte === S.longDirFlag) ? S.longDirEntry : S.dirEntry_simple;
var entry = entryType.valueFromBytes(buf, off);
entry._pos = entryPos;
_.log(_.log.DBG, "entry:", entry, secIdx, entryIdx);
if (entryType === S.longDirEntry) {
var firstEntry;
if (entry.Ord & S.lastLongFlag) {
firstEntry = true;
entry.Ord &= ~S.lastLongFlag;
long = {
name: -1,
sum: entry.Chksum,
_rem: entry.Ord-1,
_arr: []
}
}
if (firstEntry || long && entry.Chksum === long.sum && entry.Ord === long._rem--) {
var S_lde_f = S.longDirEntry.fields,
namepart = entry.Name1;
if (entry.Name1.length === S_lde_f.Name1.size/2) {
namepart += entry.Name2;
if (entry.Name2.length === S_lde_f.Name2.size/2) {
namepart += entry.Name3;
}
}
long._arr.push(namepart);
if (!long._rem) {
long.name = long._arr.reverse().join('');
delete long._arr;
delete long._rem;
}
} else long = null;
} else if ((attrByte & 0x08) === 0) { // NOTE: checks `!entry.Attr.volume_id`
var bestName = null;
if (long && long.name) {
var pos = entryIdx + S.dirEntry.fields['Name'].offset,
sum = _.checksumName(buf, pos);
if (sum === long.sum) bestName = long.name;
}
if (!bestName) {
if (signalByte === S.entryIsE5Flag) entry.Name.filename = '\u00E5'+entry.Name.filename.slice(1);
var nam = entry.Name.filename.replace(/ +$/, ''),
ext = entry.Name.extension.replace(/ +$/, '');
// TODO: lowercase bits http://en.wikipedia.org/wiki/8.3_filename#Compatibility
// via NTRes, bits 0x08 and 0x10 http://www.fdos.org/kernel/fatplus.txt.1
bestName = (ext) ? nam+'.'+ext : nam;
}
entry._name = bestName;
// OPTIMIZATION: avoid processing any fields for non-matching entries
// TODO: we could make this automatic via getters, but…?
var _entryBuffer = buf.slice(off.bytes-S.dirEntry.size, off.bytes);
entry._full = function () {
var _entry = S.dirEntry.valueFromBytes(_entryBuffer);
_.extend(entry, _entry);
entry._size = entry.FileSize;
entry._firstCluster = (entry.FstClusHI << 16) + entry.FstClusLO;
return entry;
};
long = null;
return cb(null, entry, entryPos);
} else long = null;
getNextEntry(cb);
});
}
function iter(cb) {
getNextEntry(cb);
return iter; // TODO: previous value can't be re-used, so why make caller re-assign?
}
return iter;
};
function _updateEntry(vol, entry, newStats) {
if ('size' in newStats) entry._size = entry.FileSize = newStats.size;
if ('_touch' in newStats) newStats.archive = newStats.atime = newStats.mtime = true;
if ('archive' in newStats) entry.Attr.archive = true; // TODO: also via newStats.mode?
var _now;
function applyDate(d, prefix, timeToo, tenthToo) {
if (d === true) d = _now || (_now = new Date());
entry[prefix+'Date'] = {year:d.getFullYear()-1980, month:d.getMonth()+1, day:d.getDate()};
if (timeToo) {
entry[prefix+'Time'] = {hours:d.getHours(), minutes:d.getMinutes(), seconds_2:d.getSeconds()>>>1};
if (tenthToo) {
var msec = (d.getSeconds() % 2)*1000 + d.getMilliseconds();
entry[prefix+'TimeTenth'] = Math.floor(msec / 100);
}
}
}
if ('ctime' in newStats) applyDate(newStats.ctime, 'Crt', true, true);
if ('mtime' in newStats) applyDate(newStats.mtime, 'Wrt', true);
if ('atime' in newStats) applyDate(newStats.atime, 'LstAcc');
if ('mode' in newStats) {
entry.Attr.directory = (newStats.mode & S._I.FDIR) ? true : false;
entry.Attr.volume_id = (newStats.mode & S._I.FREG) ? false : true;
if (vol.opts.modmode === 0111) {
entry.Attr.archive = (newStats.mode & S._I.XUSR) ? true : false;
entry.Attr.system = (newStats.mode & S._I.XGRP) ? true : false;
entry.Attr.hidden = (newStats.mode & S._I.XOTH) ? true : false;
entry.Attr.readonly = (newStats.mode & S._I.WUSR) ? false : true;
} else if (vol.opts.modmode === 07000) {
entry.Attr.archive = (newStats.mode & S._I.SVTX) ? true : false;
entry.Attr.system = (newStats.mode & S._I.SGID) ? true : false;
entry.Attr.hidden = (newStats.mode & S._I.SUID) ? true : false;
entry.Attr.readonly = (
newStats.mode & S._I.WUSR ||
newStats.mode & S._I.WGRP ||
newStats.mode & S._I.WOTH
) ? false : true;
}
}
if ('firstCluster' in newStats) {
entry.FstClusLO = newStats.firstCluster & 0xFFFF;
entry.FstClusHI = newStats.firstCluster >>> 16;
entry._firstCluster = newStats.firstCluster;
}
return entry;
}
dir.makeStat = function (vol, entry) {
var stats = {}; // TODO: return an actual `instanceof fs.Stat` somehow?
stats.isFile = function () {
return (!entry.Attr.volume_id && !entry.Attr.directory);
};
stats.isDirectory = function () {
return entry.Attr.directory;
};
stats.isBlockDevice = function () { return false; }
stats.isCharacterDevice = function () { return false; }
stats.isSymbolicLink = function () { return false; }
stats.isFIFO = function () { return false; }
stats.isSocket = function () { return false; }
stats.size = entry.FileSize;
stats.blksize = vol._sectorsPerCluster*vol._sectorSize;
stats.blocks = Math.ceil(stats.size / stats.blksize) || 1;
stats.nlink = 1;
stats.mode = S._I.RUSR | S._I.RGRP | S._I.ROTH;
if (!entry.Attr.readonly) stats.mode |= S._I.WUSR | S._I.WGRP | S._I.WOTH;
if (entry.Attr.directory) stats.mode |= S._I.FDIR;
else if (!entry.Attr.volume_id) stats.mode |= S._I.FREG;
// NOTE: discussion at https://github.com/natevw/fatfs/issues/7
if (vol.opts.modmode === 0111) {
// expose using executable bits, like Samba
if (entry.Attr.archive) stats.mode |= S._I.XUSR;
if (entry.Attr.system) stats.mode |= S._I.XGRP;
if (entry.Attr.hidden) stats.mode |= S._I.XOTH;
} else if (vol.opts.modmode === 07000) {
// expose using setXid/sticky bits, like MKS
if (entry.Attr.archive) stats.mode |= S._I.SVTX;
if (entry.Attr.system) stats.mode |= S._I.SGID;
if (entry.Attr.hidden) stats.mode |= S._I.SUID;
}
stats.mode &= ~vol.opts.umask;
stats.uid = vol.opts.uid;
stats.gid = vol.opts.gid;
function extractDate(prefix) {
var date = entry[prefix+'Date'],
time = entry[prefix+'Time'] || {hours:0, minutes:0, seconds_2:0},
secs = time.seconds_2 * 2,
sect = entry[prefix+'TimeTenth'] || 0;
if (sect > 100) {
secs += 1;
sect -= 100;
}
return new Date(date.year+1980, date.month-1, date.day, time.hours, time.minutes, secs, sect*100);
}
stats.atime = extractDate('LstAcc');
stats.mtime = extractDate('Wrt');
stats.ctime = extractDate('Crt');
entry = { // keep immutable copy (with only the fields we need)
Attr: _.extend({},entry.Attr),
};
return stats;
};
dir.init = function (vol, dirInfo, cb) {
var dirChain = dirInfo.chain,
isRootDir = ('numSectors' in dirChain), // HACK: all others would be a clusterChain
initialCluster = _.allocBuffer(dirChain.sectorSize*vol._sectorsPerCluster),
entriesOffset = {bytes:0};
initialCluster.fill(0);
function writeEntry(name, clusterNum) {
while (name.length < 8) name += " ";
S.dirEntry.bytesFromValue(_updateEntry(vol, {
Name: {filename:name, extension:" "},
Attr: {directory:true}
}, {firstCluster:clusterNum, _touch:true,ctime:true}), initialCluster, entriesOffset);
}
if (!isRootDir) {
writeEntry(".", dirChain.firstCluster);
writeEntry("..", dirInfo.parent.chain.firstCluster);
};
dirChain.writeToPosition(0, initialCluster, cb);
};
dir.addFile = function (vol, dirChain, entryInfo, opts, cb) {
if (typeof opts === 'function') {
cb = opts;
opts = {};
}
var name = entryInfo.name,
entries = [], mainEntry;
entries.push(mainEntry = {
Name: _.shortname(name),
Attr: {directory:opts.dir||false},
_name: name
});
if (1 || mainEntry.Name._lossy) { // HACK: always write long names until `._lossy` is more useful!
var workaroundTessel427 = ('\uFFFF'.length !== 1);
if (workaroundTessel427) throw Error("Your JS runtime does not have proper Unicode string support. (If Tessel, is your firmware up-to-date?)");
// name entries should be 0x0000-terminated and 0xFFFF-filled
var S_lde_f = S.longDirEntry.fields,
ENTRY_CHUNK_LEN = (S_lde_f.Name1.size + S_lde_f.Name2.size + S_lde_f.Name3.size)/2,
partialLen = name.length % ENTRY_CHUNK_LEN,
paddingNeeded = partialLen && (ENTRY_CHUNK_LEN - partialLen);
if (paddingNeeded--) name += '\u0000';
while (paddingNeeded-- > 0) name += '\uFFFF';
// now fill in as many entries as it takes
var off = 0,
ord = 1;
while (off < name.length) entries.push({
Ord: ord++,
Name1: name.slice(off, off+=S_lde_f.Name1.size/2),
Attr_raw: S.longDirFlag,
Chksum: null,
Name2: name.slice(off, off+=S_lde_f.Name2.size/2),
Name3: name.slice(off, off+=S_lde_f.Name3.size/2)
});
entries[entries.length - 1].Ord |= S.lastLongFlag;
}
if (entryInfo.tail) {
var name = mainEntry.Name.filename,
suffix = '~'+entryInfo.tail,
endIdx = name.indexOf(' '),
sufIdx = (~endIdx) ? Math.min(endIdx, name.length-suffix.length) : name.length-suffix.length;
if (sufIdx < 0) return cb(S.err.NAMETOOLONG()); // TODO: would EXIST be more correct?
mainEntry.Name.filename = name.slice(0,sufIdx)+suffix+name.slice(sufIdx+suffix.length);
_.log(_.log.DBG, "Shortname amended to:", mainEntry.Name);
}
vol.allocateInFAT(dirChain.firstCluster || 2, function (e,fileCluster) {
if (e) return cb(e);
var nameBuf = S.dirEntry.fields['Name'].bytesFromValue(mainEntry.Name),
nameSum = _.checksumName(nameBuf);
// TODO: finalize initial properties… (via `opts.mode` instead?)
_updateEntry(vol, mainEntry, {firstCluster:fileCluster, size:0, ctime:true,_touch:true});
mainEntry._pos = _.adjustedPos(vol, entryInfo.target, S.dirEntry.size*(entries.length-1));
entries.slice(1).forEach(function (entry) {
entry.Chksum = nameSum;
});
entries.reverse();
if (entryInfo.lastEntry) entries.push({});
var entriesData = _.allocBuffer(S.dirEntry.size*entries.length),
dataOffset = {bytes:0};
entries.forEach(function (entry) {
var entryType = ('Ord' in entry) ? S.longDirEntry : S.dirEntry;
entryType.bytesFromValue(entry, entriesData, dataOffset);
});
_.log(_.log.DBG, "Writing", entriesData.length, "byte directory entry", mainEntry, "into", dirChain.toJSON(), "at", entryInfo.target);
dirChain.writeToPosition(entryInfo.target, entriesData, function (e) {
// TODO: if we get error, what/should we clean up?
if (e) cb(e);
else cb(null, mainEntry, vol.chainForCluster(fileCluster, dirChain));
});
});
};
dir.findInDirectory = function (vol, dirChain, name, opts, cb) {
var matchName = name.toUpperCase(),
tailName = (opts.prepareForCreate) ? _.shortname(name) : null,
maxTail = 0;
function processNext(next) {
next = next(function (e, d, entryPos) {
if (e) cb(e);
else if (!d) cb(S.err.NOENT(), {tail:maxTail, target:entryPos, lastEntry:true});
else if (d._free) processNext(next); // TODO: look for long enough reusable run
else if (d._name.toUpperCase() === matchName) return cb(null, d._full());
else if (!opts.prepareForCreate) processNext(next);
else {
var dNum = 1,
dName = d.Name.filename,
dTail = dName.match(/(.*)~(\d+)/);
if (dTail) {
dNum = +dTail[2];
dName = dTail[1];
}
if (tailName.extension === d.Name.extension &&
tailName.filename.indexOf(dName) === 0)
{
maxTail = Math.max(dNum+1, maxTail);
}
processNext(next);
}
});
}
processNext(dir.iterator(dirChain, {includeFree:(0 && opts.prepareForCreate)}));
};
dir.updateEntry = function (vol, entry, newStats, cb) {
if (!entry._pos || !entry._pos.chain) throw Error("Entry source unknown!");
var entryPos = entry._pos,
newEntry = _updateEntry(vol, entry, newStats),
data = S.dirEntry.bytesFromValue(newEntry);
_.log(_.log.DBG, "UPDATING ENTRY", newStats, newEntry, entryPos, data);
// TODO: if write fails, then entry becomes corrupt!
entryPos.chain.writeToPosition(entryPos, data, cb);
};

206
@vates/fatfs/helpers.js Normal file
View File

@@ -0,0 +1,206 @@
var S = require("./structs.js"),
_xok = require('xok');
// ponyfills for older node.js
exports.allocBuffer = Buffer.alloc || function (len, val) {
var b = Buffer(len);
if (arguments.length > 1) b.fill(val);
return b;
};
exports.bufferFrom = Buffer.from || function (arg0, arg1) {
return (arguments.length > 1) ? Buffer(arg0, arg1) : Buffer(arg0);
};
// flag for WORKAROUND: https://github.com/tessel/beta/issues/380
exports.workaroundTessel380 = !Buffer.from && function () {
var b = Buffer([0]),
s = b.slice(0);
return ((s[0] = 0xFF) !== b[0]);
}();
// WORKAROUND: https://github.com/tessel/beta/issues/433
var oldslice;
if (!Buffer.alloc && Buffer(5).slice(10).length < 0) oldslice = Buffer.prototype.slice, Buffer.prototype.slice = function (s, e) {
if (s > this.length) s = this.length;
// ~WORKAROUND: https://github.com/tessel/beta/issues/434
return (arguments.length > 1) ? oldslice.call(this, s, e) : oldslice.call(this, s);
}
exports.absoluteSteps = function (path) {
var steps = [];
path.split('/').forEach(function (str) {
// NOTE: these should actually be fine, just wasteful…
if (str === '..') steps.pop();
else if (str && str !== '.') steps.push(str);
});
return steps.map(exports.longname);
};
exports.absolutePath = function (path) {
return '/'+exports.absoluteSteps(path).join('/');
};
exports.parseFlags = function (flags) {
// read, write, append, create, truncate, exclusive
var info, _dir; // NOTE: there might be more clever ways to "parse", but…
if (flags[0] === '\\') {
// internal flag used internally to `fs.open` directories without `S.err.ISDIR()`
flags = flags.slice(1);
_dir = true;
}
switch (flags) {
case 'r': info = {read:true, write:false, create:false}; break;
case 'r+': info = {read:true, write:true, create:false}; break;
case 'rs': info = {read:true, write:false, create:false, sync:true}; break;
case 'rs+': info = {read:true, write:true, create:false, sync:true}; break;
case 'w': info = {read:false, write:true, create:true, truncate:true}; break;
case 'wx': info = {read:false, write:true, create:true, exclusive:true}; break;
case 'w+': info = {read:true, write:true, create:true, truncate:true}; break;
case 'wx+': info = {read:true, write:true, create:true, exclusive:true}; break;
case 'a': info = {read:false, write:true, create:true, append:true}; break;
case 'ax': info = {read:false, write:true, create:true, append:true, exclusive:true}; break;
case 'a+': info = {read:true, write:true, create:true, append:true}; break;
case 'ax+': info = {read:true, write:true, create:true, append:true, exclusive:true}; break;
default: throw Error("Unknown mode: "+flags); // TODO: throw as `S.err.INVAL`
}
if (info.sync) throw Error("Mode not implemented."); // TODO: what would this require of us?
if (_dir) info._openDir = true;
return info;
};
// TODO: these are great candidates for special test coverage!
var _snInvalid = /[^A-Z0-9$%'-_@~`!(){}^#&.]/g; // NOTE: '.' is not valid but we split it away
exports.shortname = function (name) {
var lossy = false;
// TODO: support preservation of case for otherwise non-lossy name!
name = name.toUpperCase().replace(/ /g, '').replace(/^\.+/, '');
name = name.replace(_snInvalid, function () {
lossy = true;
return '_';
});
var parts = name.split('.'),
basis3 = parts.pop(),
basis8 = parts.join('');
if (!parts.length) {
basis8 = basis3;
basis3 = ' ';
}
if (basis8.length > 8) {
basis8 = basis8.slice(0,8);
// NOTE: technically, spec's "lossy conversion" flag is NOT set by excess length.
// But since lossy conversion and truncated names both need a numeric tail…
lossy = true;
} else while (basis8.length < 8) basis8 += ' ';
if (basis3.length > 3) {
basis3 = basis3.slice(0,3);
lossy = true;
} else while (basis3.length < 3) basis3 += ' ';
return {filename:basis8, extension:basis3, _lossy:lossy};
return {basis:[basis8,basis3], lossy:lossy};
};
//shortname("autoexec.bat") => {basis:['AUTOEXEC','BAT'],lossy:false}
//shortname("autoexecutable.batch") => {basis:['AUTOEXEC','BAT'],lossy:true}
// TODO: OS X stores `shortname("._.Trashes")` as ['~1', 'TRA'] — should we?
var _lnInvalid = /[^a-zA-Z0-9$%'-_@~`!(){}^#&.+,;=[\] ]/g;
exports.longname = function (name) {
name = name.trim().replace(/\.+$/, '').replace(_lnInvalid, function (c) {
if (c.length > 1) throw Error("Internal problem: unexpected match length!");
if (c.charCodeAt(0) > 127) return c;
else throw Error("Invalid character "+JSON.stringify(c)+" in name.");
lossy = true;
return '_';
});
if (name.length > 255) throw Error("Name is too long.");
return name;
};
function nameChkSum(sum, c) {
return ((sum & 1) ? 0x80 : 0) + (sum >>> 1) + c & 0xFF;
}
// WORKAROUND: https://github.com/tessel/beta/issues/335
function reduceBuffer(buf, start, end, fn, res) {
// NOTE: does not handle missing `res` like Array.prototype.reduce would
for (var i = start; i < end; ++i) {
res = fn(res, buf[i]);
}
return res;
}
exports.checksumName = function (buf,off) {
off || (off = 0);
var len = S.dirEntry.fields['Name'].size;
return reduceBuffer(buf, off, off+len, nameChkSum, 0);
};
/* comparing C rounding trick from FAT spec with Math.ceil
function tryBoth(d) {
var a = ((D.RootEntCnt * 32) + (D.BytsPerSec - 1)) / D.BytsPerSec >>> 0,
b = Math.ceil((D.RootEntCnt * 32) / D.BytsPerSec);
if (b !== a) console.log("try", b, a, (b === a) ? '' : '*');
return (b === a);
}
// BytsPerSec — "may take on only the following values: 512, 1024, 2048 or 4096"
[512, 1024, 2048, 4096].forEach(function (bps) {
// RootEntCnt — "a count that when multiplied by 32 results in an even multiple of BPB_BytsPerSec"
for (var evenMultiplier = 0; evenMultiplier < 1024*1024*16; evenMultiplier += 2) {
var rec = (bps * evenMultiplier) / 32;
tryBoth({RootEntCnt:rec, BytsPerSec:bps});
}
});
*/
exports.fmtHex = function (n, ff) {
return (1+ff+n).toString(16).slice(1);
};
exports.delayedCall = function (fn) {
if (!fn) throw Error("No function provided!"); // debug aid
var ctx = this,
args = Array.prototype.slice.call(arguments, 1);
setImmediate(function () {
fn.apply(ctx, args);
});
};
exports.adjustedPos = function (vol, pos, bytes) {
var _pos = {
chain: pos.chain,
sector: pos.sector,
offset: pos.offset + bytes
}, secSize = vol._sectorSize;
while (_pos.offset >= secSize) {
_pos.sector += 1;
_pos.offset -= secSize;
}
return _pos;
};
exports.extend = _xok;
var _prevDbg = Date.now(),
_thresh = 50;
function log(level) {
if (level < log.level) return;
var now = Date.now(),
diff = now - _prevDbg;
arguments[0] = ((diff < _thresh) ? " " : '') + diff.toFixed(0) + "ms";
console.log.apply(console, arguments);
_prevDbg = now;
}
log.DBG = -4;
log.INFO = -3;
log.WARN = -2;
log.ERR = -1;
log.level = log.WARN;
exports.log = log;

View File

@@ -0,0 +1,25 @@
var fs = require('fs');
exports.createDriverSync = function (path, opts) {
opts || (opts = {});
var secSize = 512,
ro = opts.readOnly || false,
fd = fs.openSync(path, (ro) ? 'r' : 'r+'),
s = fs.fstatSync(fd);
return {
sectorSize: secSize,
numSectors: s.size / secSize,
readSectors: function (i, dest, cb) {
fs.read(fd, dest, 0, dest.length, i*secSize, function (e,n,d) {
cb(e,d);
});
},
writeSectors: (ro) ? null : function (i, data, cb) {
fs.write(fd, data, 0, data.length, i*secSize, function (e) {
cb(e);
});
}
};
};

771
@vates/fatfs/index.js Normal file
View File

@@ -0,0 +1,771 @@
var events = require('events'),
streams = require('stream'),
fifolock = require('fifolock'),
S = require('./structs.js'),
_ = require('./helpers.js')
//_.log.level = _.log.DBG;
exports.createFileSystem = function (volume, opts, cb) {
if (typeof opts === 'function') {
cb = opts
opts = null
}
opts = _.extend(
{
// c.f. https://www.kernel.org/doc/Documentation/filesystems/vfat.txt
ro: false,
noatime: true,
modmode: 0111, // or `07000`
umask: 'umask' in process ? process.umask() : 0022,
uid: 'getuid' in process ? process.getuid() : 0,
gid: 'getgid' in process ? process.getgid() : 0,
},
opts
)
if (!volume.writeSectors) opts.ro = true
if (opts.ro) opts.noatime = true // natch
var fs = new events.EventEmitter(),
vol = null,
dir = require('./dir.js'),
c = require('./chains.js'),
q = fifolock()
var GROUP =
_.log.level < _.log.INFO
? q.TRANSACTION_WRAPPER.bind({
postAcquire: function (proceed) {
_.log(_.log.DBG, '=== Starting GROUP ===')
proceed()
},
preRelease: function (finish) {
_.log(_.log.DBG, '=== Finishing GROUP ===')
finish()
},
})
: q.TRANSACTION_WRAPPER
q.acquire(function (unlock) {
// because of this, callers can start before 'ready'
var d = _.allocBuffer(volume.sectorSize)
volume.readSectors(0, d, function (e) {
if (e) fs.emit('error', e)
else {
try {
init(d)
} catch (e) {
fs.emit('error', e)
unlock()
return
}
fs.emit('ready')
}
unlock()
})
})
if (cb) fs.on('error', cb).on('ready', cb.bind(null, null))
function init(bootSector) {
vol = require('./vol.js').init(volume, opts, bootSector)
fs._dirIterator = dir.iterator.bind(dir)
var entryInfoByPath = {},
baseEntry = {
_refs: 0,
_record: function () {
entryInfoByPath[this.path] = this
if (this.parent) this.parent.retain()
return this
},
retain: function () {
if (!this._refs) this._record()
this._refs += 1
return this
},
release: function () {
this._refs -= 1
if (!this._refs) this._rescind()
},
_rescind: function () {
if (this.parent) this.parent.release()
delete entryInfoByPath[this.path]
},
}
fs._createSharedEntry = function (path, entry, chain, parent) {
return _.extend(Object.create(baseEntry), {
_refs: 0, // WORKAROUND: https://github.com/tessel/beta/issues/455
path: path,
entry: entry,
chain: chain,
parent: parent,
}).retain()
}
fs._createSharedEntry('/', { Attr: { directory: true } }, vol.rootDirectoryChain)
fs._sharedEntryForSteps = function (steps, opts, cb) {
// NOTE: may `cb` before returning!
var path = steps.join('/') || '/',
name = steps.pop(), // n.b.
info = entryInfoByPath[path]
if (info) cb(null, info.retain())
else
fs._sharedEntryForSteps(steps, {}, function (e, parentInfo) {
// n.b. `steps` don't include `name`
if (e) cb(e)
else if (!parentInfo.entry.Attr.directory) cb(S.err.NOTDIR())
else
dir.findInDirectory(vol, parentInfo.chain, name, opts, function (e, entry) {
if (e && !opts.prepareForCreate) cb(e)
else if (e) cb(e, { missingChild: _.extend(entry, { name: name }), parent: parentInfo })
else cb(null, fs._createSharedEntry(path, entry, vol.chainForCluster(entry._firstCluster), parentInfo))
})
})
}
fs._updateEntry = dir.updateEntry.bind(dir, vol)
fs._makeStat = dir.makeStat.bind(dir, vol)
fs._addFile = dir.addFile.bind(dir, vol)
fs._initDir = dir.init.bind(dir, vol)
}
/**** ---- CORE API ---- ****/
// NOTE: we really don't share namespace, but avoid first three anyway…
var fileDescriptors = [null, null, null]
fs.open = function (path, flags, mode, cb, _n_) {
if (typeof mode === 'function') {
_n_ = cb
cb = mode
mode = 0666
}
cb = GROUP(
cb,
function () {
var _fd = { flags: null, entry: null, chain: null, pos: 0 },
f = _.parseFlags(flags)
if (vol.opts.ro && (f.write || f.create || f.truncate)) return _.delayedCall(cb, S.err.ROFS())
else _fd.flags = f
fs._sharedEntryForSteps(_.absoluteSteps(path), { prepareForCreate: f.create }, function (e, info) {
if (e && !(e.code === 'NOENT' && f.create && info)) cb(e)
else if (e)
fs._addFile(info.parent.chain, info.missingChild, { dir: f._openDir }, function (e, newEntry, newChain) {
if (e) cb(e)
else finish(fs._createSharedEntry(_.absolutePath(path), newEntry, newChain, info.parent))
})
else if (info && f.exclusive) cb(S.err.EXIST())
else if (info.entry.Attr.directory && !f._openDir) cb(S.err.ISDIR())
else if (f.write && info.entry.Attr.readonly) cb(S.err.ACCES())
else finish(info)
function finish(fileInfo) {
var fd = fileDescriptors.push(_fd) - 1
_fd.info = fileInfo
_fd.entry = fileInfo.entry
_fd.chain = fileInfo.chain
if (f.append) _fd.pos = _fd.entry._size
if (f._openDir) _fd.chain.cacheAdvice = 'WILLNEED'
if (f.truncate && _fd.entry._size)
fs.ftruncate(
fd,
0,
function (e) {
cb(e, fd)
},
'_nested_'
)
else _.delayedCall(cb, null, fd) // (delay in case fs._sharedEntryForSteps all cached!)
}
})
},
_n_ === '_nested_'
)
}
fs.fstat = function (fd, cb, _n_) {
cb = GROUP(
cb,
function () {
var _fd = fileDescriptors[fd]
if (!_fd || !_fd.flags.read) _.delayedCall(cb, S.err.BADF())
else _.delayedCall(cb, null, fs._makeStat(_fd.entry))
},
_n_ === '_nested_'
)
}
fs.futimes = function (fd, atime, mtime, cb, _n_) {
cb = GROUP(
cb,
function () {
var _fd = fileDescriptors[fd]
if (!_fd || !_fd.flags.write) _.delayedCall(cb, S.err.BADF())
// NOTE: ctime would get touched on POSIX; but we map that to create time!
else fs._updateEntry(_fd.entry, { atime: atime || true, mtime: mtime || true }, cb)
},
_n_ === '_nested_'
)
}
fs.fchmod = function (fd, mode, cb, _n_) {
cb = GROUP(
cb,
function () {
var _fd = fileDescriptors[fd]
if (!_fd || !_fd.flags.write) _.delayedCall(cb, S.err.BADF())
else {
mode &= S._I._chmoddable
if (_fd.entry.Attr.directory) mode |= S._I.FDIR
else if (!_fd.entry.Attr.volume_id) mode |= S._I.FREG
fs._updateEntry(_fd.entry, { mode: mode }, cb)
}
},
_n_ === '_nested_'
)
}
fs.read = function (fd, buf, off, len, pos, cb, _n_) {
cb = GROUP(
cb,
function () {
var _fd = fileDescriptors[fd]
if (!_fd || !_fd.flags.read) return _.delayedCall(cb, S.err.BADF())
var _pos = pos === null ? _fd.pos : pos,
_len = Math.min(len, _fd.entry._size - _pos),
_buf = buf.slice(off, off + _len)
_fd.chain.readFromPosition(_pos, _buf, function (e, bytes, slice) {
if (_.workaroundTessel380) _buf.copy(buf, off) // WORKAROUND: https://github.com/tessel/beta/issues/380
_fd.pos = _pos + bytes
if (e || vol.opts.noatime) finish(e)
else fs._updateEntry(_fd.entry, { atime: true }, finish)
function finish(e) {
cb(e, bytes, buf)
}
})
},
_n_ === '_nested_'
)
}
fs._readdir = function (fd, cb, _n_) {
cb = GROUP(
cb,
function () {
var _fd = fileDescriptors[fd]
if (!_fd || !_fd.flags.read) return _.delayedCall(cb, S.err.BADF())
var entryNames = [],
getNextEntry = fs._dirIterator(_fd.chain)
function processNext() {
getNextEntry(function (e, d) {
if (e) cb(e)
else if (!d && !entryNames.length)
cb(null, entryNames) // WORKAROUND: https://github.com/tessel/beta/issues/435
else if (!d)
cb(null, entryNames.sort()) // NOTE: sort not required, but… [simplifies tests for starters!]
else {
if (d._name !== '.' && d._name !== '..') entryNames.push(d._name)
processNext()
}
})
}
processNext()
},
_n_ === '_nested_'
)
}
fs._mkdir = function (fd, cb, _n_) {
cb = GROUP(
cb,
function () {
var _fd = fileDescriptors[fd]
if (!_fd || !_fd.flags.write) _.delayedCall(cb, S.err.BADF())
else fs._initDir(_fd.info, cb)
},
_n_ === '_nested_'
)
}
fs.write = function (fd, buf, off, len, pos, cb, _n_) {
cb = GROUP(
cb,
function () {
var _fd = fileDescriptors[fd]
if (!_fd || !_fd.flags.write) return _.delayedCall(cb, S.err.BADF())
var _pos = pos === null || _fd.flags.append ? _fd.pos : pos,
_buf = buf.slice(off, off + len)
if (_pos > _fd.entry._size) {
// TODO: handle huge jumps by zeroing clusters individually?
var padLen = _pos - _fd.entry._size,
padBuf = _.allocBuffer(padLen + _buf.length)
padBuf.fill(0x00, 0, padLen)
_buf.copy(padBuf, padLen)
_pos = _fd.entry._size
_buf = padBuf
}
_fd.chain.writeToPosition(_pos, _buf, function (e) {
_fd.pos = _pos + len
var newSize = Math.max(_fd.entry._size, _fd.pos),
newInfo = { size: newSize, _touch: true }
fs._updateEntry(_fd.entry, newInfo, function (ee) {
cb(e || ee, len, buf)
})
})
},
_n_ === '_nested_'
)
}
fs.ftruncate = function (fd, len, cb, _n_) {
cb = GROUP(
cb,
function () {
var _fd = fileDescriptors[fd]
if (!_fd || !_fd.flags.write) return _.delayedCall(cb, S.err.BADF())
var newStats = { size: len, _touch: true }
// NOTE: we order operations for best state in case of only partial success
if (len === _fd.entry._size) _.delayedCall(cb)
else if (len < _fd.entry._size)
fs._updateEntry(_fd.entry, newStats, function (e) {
if (e) cb(e)
else _fd.chain.truncate(Math.ceil(len / _fd.chain.sectorSize), cb)
})
// TODO: handle huge file expansions without as much memory pressure
else
_fd.chain.writeToPosition(_fd.entry._size, _.allocBuffer(len - _fd.entry._size, 0x00), function (e) {
if (e) cb(e)
else fs._updateEntry(_fd.entry, newStats, cb)
})
},
_n_ === '_nested_'
)
}
// 'NORMAL', 'SEQUENTIAL', 'RANDOM', 'WILLNEED', 'DONTNEED', 'NOREUSE'
fs._fadviseSync = function (fd, off, len, advice) {
if (off !== 0 || len !== 0) throw Error('Cache advise can currently be given only for whole file!')
var _fd = fileDescriptors[fd]
if (!_fd) throw S.err.BADF()
else _fd.chain.cacheAdvice = advice
}
fs.fsync = function (fd, cb) {
// NOTE: we'll need to flush write cache here once we have one…
var _fd = fileDescriptors[fd]
if (!_fd) _.delayedCall(cb, S.err.BADF())
else _.delayedCall(cb)
}
fs.close = function (fd, cb) {
var _fd = fileDescriptors[fd]
if (!_fd) _.delayedCall(cb, S.err.BADF())
else setTimeout(_fd.info.release.bind(_fd.info), 500), _.delayedCall(cb, (fileDescriptors[fd] = null))
}
/* STREAM WRAPPERS */
var workaroundTessel436
try {
new require('stream').Readable({ encoding: 'utf8' })
new streams.Readable({ encoding: 'utf8' })
} catch (e) {
workaroundTessel436 = true
}
function _createStream(StreamType, path, opts) {
// [NOT REALLY A] WORKAROUND: https://github.com/tessel/beta/issues/436
if (workaroundTessel436 && 'encoding' in opts) {
console.warn('Tessel does not currently support encoding option for Readable streams, discarding!')
delete opts.encoding
}
var fd = opts.fd !== null ? opts.fd : '_opening_',
pos = opts.start,
stream = new StreamType(opts)
if (fd === '_opening_')
fs.open(path, opts.flags, opts.mode, function (e, _fd) {
if (e) {
fd = '_open_error_'
stream.emit('error', e)
} else {
fd = _fd
fs._fadviseSync(fd, 0, 0, 'SEQUENTIAL')
stream.emit('open', fd)
}
})
function autoClose(tombstone) {
// NOTE: assumes caller will clear `fd`
if (opts.autoClose)
fs.close(fd, function (e) {
if (e) stream.emit('error', e)
else stream.emit('close')
})
fd = tombstone
}
if (StreamType === streams.Readable) {
stream._read = function (n) {
var buf
// TODO: optimize to fetch at least a full sector regardless of `n`…
n = Math.min(n, opts.end - pos)
if (fd === '_opening_')
stream.once('open', function () {
stream._read(n)
})
else if (pos > opts.end) stream.push(null)
else if (n > 0)
(buf = _.allocBuffer(n)),
fs.read(fd, buf, 0, n, pos, function (e, n, d) {
if (e) {
autoClose('_read_error_')
stream.emit('error', e)
} else stream.push(n ? d.slice(0, n) : null)
}),
(pos += n)
else stream.push(null)
}
stream.once('end', function () {
autoClose('_ended_')
})
} else if (StreamType === streams.Writable) {
stream.bytesWritten = 0
stream._write = function (data, _enc, cb) {
if (fd === '_opening_')
stream.once('open', function () {
stream._write(data, null, cb)
})
else
fs.write(fd, data, 0, data.length, pos, function (e, n) {
if (e) {
autoClose('_write_error_')
cb(e)
} else {
stream.bytesWritten += n
cb()
}
}),
(pos += data.length)
}
stream.once('finish', function () {
autoClose('_finished_')
})
}
return stream
}
fs.createReadStream = function (path, opts) {
return _createStream(
streams.Readable,
path,
_.extend(
{
start: 0,
end: Infinity,
flags: 'r',
mode: 0666,
encoding: null,
fd: null, // ??? see https://github.com/joyent/node/issues/7708
autoClose: true,
},
opts
)
)
}
fs.createWriteStream = function (path, opts) {
return _createStream(
streams.Writable,
path,
_.extend(
{
start: 0,
flags: 'w',
mode: 0666,
//encoding: null, // see https://github.com/joyent/node/issues/7710
fd: null, // ??? see https://github.com/joyent/node/issues/7708
autoClose: true,
},
opts,
{ decodeStrings: true, objectMode: false }
)
)
}
/* PATH WRAPPERS (albeit the only public interface for some folder operations) */
function _fdOperation(path, opts, fn, cb) {
cb = GROUP(cb, function () {
opts.advice || (opts.advice = 'NORMAL')
fs.open(
path,
opts.flag,
function (e, fd) {
if (e) cb(e)
else
fs._fadviseSync(fd, 0, 0, opts.advice),
fn(fd, function () {
var ctx = this,
args = arguments
fs.close(
fd,
function (closeErr) {
cb.apply(ctx, args)
},
'_nested_'
)
})
},
'_nested_'
)
})
}
fs.stat = fs.lstat = function (path, cb) {
_fdOperation(
path,
{ flag: 'r' },
function (fd, cb) {
fs.fstat(fd, cb, '_nested_')
},
cb
)
}
fs.exists = function (path, cb) {
fs.stat(path, function (err) {
cb(err ? false : true)
})
}
fs.readFile = function (path, opts, cb) {
if (typeof opts === 'function') {
cb = opts
opts = {}
}
opts.flag || (opts.flag = 'r')
opts.advice || (opts.advice = 'NOREUSE')
_fdOperation(
path,
opts,
function (fd, cb) {
fs.fstat(
fd,
function (e, stat) {
if (e) return cb(e)
else {
var buffer = _.allocBuffer(stat.size)
fs.read(
fd,
buffer,
0,
buffer.length,
null,
function (e) {
if (e) cb(e)
else cb(null, opts.encoding ? buffer.toString(opts.encoding) : buffer)
},
'_nested_'
)
}
},
'_nested_'
)
},
cb
)
}
fs.writeFile = function (path, data, opts, cb) {
if (typeof opts === 'function') {
cb = opts
opts = {}
}
opts.flag || (opts.flag = 'w')
opts.advice || (opts.advice = 'NOREUSE')
_fdOperation(
path,
opts,
function (fd, cb) {
if (typeof data === 'string') data = _.bufferFrom(data, opts.encoding || 'utf8')
fs.write(
fd,
data,
0,
data.length,
null,
function (e) {
cb(e)
},
'_nested_'
)
},
cb
)
}
fs.appendFile = function (path, data, opts, cb) {
if (typeof opts === 'function') {
cb = opts
opts = {}
}
opts.flag || (opts.flag = 'a')
fs.writeFile(path, data, opts, cb)
}
fs.truncate = function (path, len, cb) {
_fdOperation(
path,
{ flag: 'r+' },
function (fd, cb) {
fs.ftruncate(fd, len, cb, '_nested_')
},
cb
)
}
fs.readdir = function (path, cb) {
_fdOperation(
path,
{ flag: '\\r' },
function (fd, cb) {
fs._readdir(fd, cb, '_nested_')
},
cb
)
}
fs.mkdir = function (path, mode, cb) {
if (typeof mode === 'function') {
cb = mode
mode = 0777
}
_fdOperation(
path,
{ flag: '\\wx' },
function (fd, cb) {
fs._mkdir(fd, cb, '_nested_')
},
cb
)
}
fs.utimes = function (path, atime, mtime, cb) {
_fdOperation(
path,
{ flag: 'r+' },
function (fd, cb) {
fs.futimes(fd, atime, mtime, cb, '_nested_')
},
cb
)
}
fs.chmod = fs.lchmod = function (path, mode, cb) {
_fdOperation(
path,
{ flag: '\\r+' },
function (fd, cb) {
fs.fchmod(fd, mode, cb, '_nested_')
},
cb
)
}
fs.chown = fs.lchown = function (path, uid, gid, cb) {
_fdOperation(
path,
{ flag: '\\r+' },
function (fd, cb) {
fs.fchown(fd, uid, gid, cb, '_nested_')
},
cb
)
}
/* STUBS */
fs.link = function (src, dst, cb) {
// NOTE: theoretically we _could_ do hard links [with untracked `stat.nlink` count…]
_.delayedCall(cb, S.err.NOSYS())
}
fs.symlink = function (src, dst, type, cb) {
if (typeof type === 'function') {
cb = type
type = null
}
_.delayedCall(cb, S.err.NOSYS())
}
fs.readlink = function (path, cb) {
_fdOperation(
path,
{ flag: '\\r' },
function (fd, cb) {
// the named file is *never* a symbolic link…
// NOTE: we still use _fdOperation for catching e.g. NOENT/NOTDIR errors…
cb(S.err.INVAL())
},
cb
)
}
fs.realpath = function (path, cache, cb) {
if (typeof cache === 'function') {
cb = cache
cache = null
}
if (cache)
_.delayedCall(cb, S.err.NOSYS()) // TODO: what would be involved here?
else
_fdOperation(
path,
{ flag: '\\r' },
function (fd, cb) {
cb(null, _.absolutePath(path))
},
cb
)
}
fs.fchown = function (fd, uid, gid, cb, _n_) {
cb = GROUP(
cb,
function () {
var _fd = fileDescriptors[fd]
if (!_fd || !_fd.flags.write) _.delayedCall(cb, S.err.BADF())
else _.delayedCall(cb, S.err.NOSYS())
},
_n_ === '_nested_'
)
}
// See https://github.com/natevw/fatfs/pull/31/files
fs.createLabel = function (name, cb) {
fs.open(name, 'a', (e, _fd) => {
if (e) {
cb(e)
} else {
let fd = fileDescriptors[_fd]
fd.entry.Attr.volume_id = true
fd.entry.FstClusLO = 0
fd.entry.FstClusHI = 0
fs._updateEntry(fd.entry, {}, cb)
}
})
}
return fs
}

36
@vates/fatfs/make_sample.sh Executable file
View File

@@ -0,0 +1,36 @@
#! /bin/sh
# NOTE: this only works on OS X
# TODO: Linux could use mkfs stuff without attach?
# ./make_sample.sh /tmp/fat16.img FAT16
FILE=$1
: ${FILE:?must be provided as first argument}
TYPE=$2
: ${TYPE:?must be provided as second argument}
SIZE=$3 # in MB
case "$TYPE" in
"FAT12") : ${SIZE:=1} # <128
;;
"FAT16") : ${SIZE:=5} # >4
;;
"FAT32") : ${SIZE:=33} # >32
;;
*) : ${SIZE:=1} # e.g. ExFAT
esac
echo Making $TYPE of $SIZE MB at $FILE
if [[ "$TYPE" = FAT* ]]
then
TYPE="MS-DOS $TYPE"
fi
dd if=/dev/zero of=$FILE bs=1048576 count=$SIZE
DEV=`hdiutil attach $FILE -nomount`
diskutil eraseVolume "$TYPE" "FATFS TEST" $DEV
hdiutil detach $DEV

34
@vates/fatfs/package.json Normal file
View File

@@ -0,0 +1,34 @@
{
"private": false,
"name": "@vates/fatfs",
"version": "0.11.1",
"description": "fs implementation on top of raw FAT16/FAT32 block source",
"main": "index.js",
"scripts": {
"postversion": "npm publish --access public"
},
"repository": {
"directory": "@vates/fatfs",
"type": "git",
"url": "https://github.com/vatesfr/xen-orchestra.git"
},
"keywords": [
"filesystem",
"fs",
"fat",
"fat32",
"fat16"
],
"author": "Vates SAS",
"license": "Apache-2.0",
"bugs": "https://github.com/vatesfr/xen-orchestra/issues",
"homepage": "https://github.com/vatesfr/xen-orchestra/tree/master/@vates/fatfs",
"dependencies": {
"fifolock": "^1.0.0",
"struct-fu": "^1.2.1",
"xok": "^1.0.0"
},
"engines": {
"node": ">=18"
}
}

255
@vates/fatfs/structs.js Normal file
View File

@@ -0,0 +1,255 @@
// see http://staff.washington.edu/dittrich/misc/fatgen103.pdf
// and http://www.cse.scu.edu/~tschwarz/COEN252_09/Lectures/FAT.html
var _ = require('struct-fu'),
__ = require("./helpers.js");
var bootBase = _.struct([
_.byte('jmpBoot', 3),
_.char('OEMName', 8),
_.uint16le('BytsPerSec'),
_.uint8('SecPerClus'),
_.uint16le('ResvdSecCnt'), // Rsvd in table, but Resvd in calcs…
_.uint8('NumFATs'),
_.uint16le('RootEntCnt'),
_.uint16le('TotSec16'),
_.uint8('Media'),
_.uint16le('FATSz16'),
_.uint16le('SecPerTrk'),
_.uint16le('NumHeads'),
_.uint32le('HiddSec'),
_.uint32le('TotSec32')
]);
var bootInfo = _.struct([
_.uint8('DrvNum'),
_.uint8('Reserved1'),
_.uint8('BootSig'),
_.uint32le('VolID'),
_.char('VolLab', 11),
_.char('FilSysType', 8)
]);
exports.boot16 = _.struct([
bootBase,
bootInfo
]);
exports.boot32 = _.struct([
bootBase,
_.uint32le('FATSz32'),
_.struct('ExtFlags', [
_.ubit('NumActiveFAT', 4),
_.ubit('_reserved1', 3),
_.bool('MirroredFAT'),
_.ubit('_reserved2', 8)
].reverse()),
_.struct('FSVer', [
_.uint8('Major'),
_.uint8('Minor')
]),
_.uint32le('RootClus'),
_.uint16le('FSInfo'),
_.uint16le('BkBootSec'),
_.byte('Reserved', 12),
bootInfo
]);
var _time = _.struct([
_.ubit('hours',5),
_.ubit('minutes',6),
_.ubit('seconds_2',5)
]), time = {
valueFromBytes: function (buf, off) {
off || (off = {bytes:0});
var _buf = __.bufferFrom([buf[off.bytes+1], buf[off.bytes+0]]),
val = _time.valueFromBytes(_buf);
off.bytes += this.size;
return val;
},
bytesFromValue: function (val, buf, off) {
val || (val = {hours:0, minutes:0, seconds_2:0});
buf || (buf = __.allocBuffer(this.size));
off || (off = {bytes:0});
var _buf = _time.bytesFromValue(val);
buf[off.bytes+1] = _buf[0];
buf[off.bytes+0] = _buf[1];
off.bytes += this.size;
return buf;
},
size: _time.size
};
var _date = _.struct([
_.ubit('year',7),
_.ubit('month',4),
_.ubit('day',5)
]), date = {
valueFromBytes: function (buf, off) {
off || (off = {bytes:0});
var _buf = __.bufferFrom([buf[off.bytes+1], buf[off.bytes+0]]),
val = _date.valueFromBytes(_buf);
off.bytes += this.size;
return val;
},
bytesFromValue: function (val, buf, off) {
val || (val = {year:0, month:0, day:0});
buf || (buf = __.allocBuffer(this.size));
off || (off = {bytes:0});
var _buf = _date.bytesFromValue(val);
buf[off.bytes+1] = _buf[0];
buf[off.bytes+0] = _buf[1];
off.bytes += this.size;
return buf;
},
size: _date.size
};
exports.dirEntry = _.struct([
_.struct('Name', [
_.char('filename',8),
_.char('extension',3)
]),
_.struct('Attr', [
_.bool('readonly'),
_.bool('hidden'),
_.bool('system'),
_.bool('volume_id'),
_.bool('directory'),
_.bool('archive'),
_.ubit('reserved', 2)
].reverse()),
_.byte('NTRes', 1),
_.uint8('CrtTimeTenth'),
_.struct('CrtTime', [time]),
_.struct('CrtDate', [date]),
_.struct('LstAccDate', [date]),
_.uint16le('FstClusHI'),
_.struct('WrtTime', [time]),
_.struct('WrtDate', [date]),
_.uint16le('FstClusLO'),
_.uint32le('FileSize')
]);
exports.entryDoneFlag = 0x00;
exports.entryFreeFlag = 0xE5;
exports.entryIsE5Flag = 0x05;
exports.dirEntry_simple = _.struct([
_.struct('Name', [
_.char('filename',8),
_.char('extension',3)
]),
_.padTo(exports.dirEntry.size)
/*
_.uint8('Attr_raw'),
_.byte('NTRes', 1),
_.byte('Crt_raw', 1+2+2),
_.byte('Lst_raw', 2),
_.uint16le('FstClusHI'),
_.byte('Wrt_raw', 2+2),
_.uint16le('FstClusLO'),
_.uint32le('FileSize')
*/
]);
exports.lastLongFlag = 0x40;
exports.longDirFlag = 0x0F;
exports.longDirEntry = _.struct([
_.uint8('Ord'),
_.char16le('Name1', 10),
_.uint8('Attr_raw'),
_.uint8('Type'),
_.uint8('Chksum'),
_.char16le('Name2', 12),
_.uint16le('FstClusLO'),
_.char16le('Name3', 4)
]);
if (exports.longDirEntry.size !== exports.dirEntry.size) throw Error("Structs ain't right!");
exports.fatField = {
'fat12': _.struct('Status', [
_.ubit('field0bc', 8),
_.ubit('field1c', 4),
_.ubit('field0a', 4),
_.ubit('field1ab', 8),
]),
'fat16': _.uint16le('Status'),
'fat32': _.uint32le('Status') // more properly this 4 bits reserved + uint28le
};
exports.fatPrefix = {
'fat12': 0xF00,
'fat16': 0xFF00,
'fat32': 0x0FFFFF00
};
exports.fatStat = {
free: 0x00,
_undef: 0x01,
rsvMin: 0xF0,
bad: 0xF7,
eofMin: 0xF8,
eof: 0xFF
};
exports._I = {
RUSR: 0400,
WUSR: 0200,
XUSR: 0100,
RGRP: 0040,
WGRP: 0020,
XGRP: 0010,
ROTH: 0004,
WOTH: 0002,
XOTH: 0001,
SUID: 04000,
SGID: 02000,
SVTX: 01000,
FDIR: 040000,
FREG: 0100000,
};
exports._I.RWXU = exports._I.RUSR | exports._I.WUSR | exports._I.XUSR;
exports._I.RWXG = exports._I.RGRP | exports._I.WGRP | exports._I.XGRP;
exports._I.RWXO = exports._I.ROTH | exports._I.WOTH | exports._I.XOTH;
exports._I._sss = exports._I.SUID | exports._I.SGID | exports._I.SVTX;
exports._I._chmoddable = exports._I.RWXU | exports._I.RWXG | exports._I.RWXO | exports._I._sss;
var _errors = {
IO: "Input/output error",
NOENT: "No such file or directory",
INVAL: "Invalid argument",
EXIST: "File exists",
NAMETOOLONG: "Filename too long",
NOSPC: "No space left on device",
NOSYS: "Function not supported",
ROFS: "ROFLCopter file system",
NOTDIR: "Not a directory",
BADF: "Bad file descriptor",
EXIST: "File exists",
ISDIR: "Is a directory",
ACCES: "Permission denied",
NOSYS: "Function not implemented",
_TODO: "Not implemented yet!"
};
exports.err = {};
Object.keys(_errors).forEach(function (sym) {
var msg = _errors[sym];
exports.err[sym] = function () {
var e = new Error(msg);
e.code = sym;
return e;
};
});

338
@vates/fatfs/test.js Normal file
View File

@@ -0,0 +1,338 @@
// can be called from CLI with image type, absolute path to an image, or, required as a module
var _ = require("./helpers.js");
var type = process.argv[2];
if (module.parent) exports.startTests = startTests;
else if (!type) throw "Usage: node test [FAT12|FAT16|FAT32|ExFAT|…|/path/to/image]";
else if (type[0] === '/') testWithImage(type);
else {
var uniq = Math.random().toString(36).slice(2),
IMG = require('os').tmpdir()+"fatfs-test-"+uniq+".img";
require('child_process').exec("./make_sample.sh "+JSON.stringify(IMG)+" "+JSON.stringify(type), function (e,out,err) {
if (e) throw e;
console.warn(err.toString());
//console.log(out.toString());
testWithImage(IMG);
//console.log("open", IMG);
//return;
require('fs').unlink(IMG, function (e) {
if (e) console.warn("Error cleaning up test image", e);
});
});
}
function testWithImage(imagePath) {
var vol = require("./img_volume.js").createDriverSync(imagePath);
startTests(vol);
}
function startTests(vol, waitTime) {
var fatfs = require("./"),
fs = fatfs.createFileSystem(vol, {umask:0020, uid:99, gid:42});
waitTime || (waitTime = 0.5e3);
[
'mkdir','readdir',
//'rename','unlink','rmdir',
'close','open','fsync',
'ftruncate','truncate',
'write','read','readFile','writeFile', 'appendFile',
'chown','lchown','fchown',
'chmod','lchmod', 'fchmod',
'utimes','futimes',
'stat','lstat','fstat','exists',
'link','symlink','readlink','realpath',
//'watchFile','unwatchFile','watch'
].forEach(function (method) { assert(method in fs, "fs."+method+" has implementation."); });
var BASE_DIR = "/fat_test-"+Math.random().toFixed(20).slice(2),
FILENAME = "Simple File.txt",
TEXTDATA = "Hello world!";
var isReady = false;
fs.on('ready', function () {
assert(isReady = true, "Driver is ready.");
}).on('error', function (e) {
assert(e, "If fs driver fires 'error' event, it should include error object.");
assert(false, "…but driver should not error when initializing in our case.");
});
setTimeout(function () {
assert(isReady, "Driver fired ready event in timely fashion.");
}, waitTime);
fs.readdir("/", function (e,files) {
assert(isReady, "Method completed after 'ready' event.");
assert(!e, "No error reading root directory.");
assert(Array.isArray(files), "Got a list of files: "+files);
});
fs.mkdir(BASE_DIR, function (e) {
assert(!e, "No error from fs.mkdir");
fs.readdir(BASE_DIR, function (e,arr) {
assert(!e, "No error from fs.readdir");
assert(arr.length === 0 , "No files in BASE_DIR yet.");
});
var file = [BASE_DIR,FILENAME].join('/');
fs.writeFile(file, TEXTDATA, function (e) {
assert(!e, "No error from fs.writeFile");
startStreamTests();
fs.realpath(file, function (e,path) {
assert(!e, "No error from basic fs.realpath call.");
assert(path === file, "We already had the real path.");
});
fs.realpath([BASE_DIR,".","garbage",".","..",FILENAME].join('/'), function (e,path) {
assert(!e, "No error from fluffy fs.realpath call.");
assert(path === file, "Fixed fluffy path matches normal one.");
});
fs.realpath([BASE_DIR,"non","existent","path"].join('/'), function (e) {
assert(e, "Expected error calling fs.realpath on nonexistent file.");
});
fs.readdir(BASE_DIR, function (e, arr) {
assert(!e, "Still no error from fs.readdir");
assert(arr.length === 2, "Test directory contains two files."); // (ours + startStreamTests's)
assert(arr[0] === FILENAME, "Filename is correct.");
fs.stat(file, function (e,d) {
assert(!e, "No error from fs.stat");
assert(d.isFile() === true, "Result is a file…");
assert(d.isDirectory() === false, "…and not a directory.");
assert(d.size === Buffer.byteLength(TEXTDATA), "Size matches length of content written.");
});
fs.exists(file, function (bool) {
assert(bool === true, "File exists.");
});
fs.readFile(file, {encoding:'utf8'}, function (e, d) {
assert(!e, "No error from fs.readFile");
assert(d === TEXTDATA, "Data matches what was written.");
});
// now, overwrite the same file and make sure that goes well too
fs.writeFile(file, _.bufferFrom([0x42]), function (e) {
assert(!e, "Still no error from fs.writeFile");
fs.readdir(BASE_DIR, function (e, arr) {
assert(!e, "No error from fs.readdir");
assert(arr.length === 2, "Test directory still contains two files.");
assert(arr[0] === FILENAME, "Filename still correct.");
fs.stat(file, function (e,d) {
assert(!e, "Still no error from fs.stat");
assert(d.isFile() === true, "Result is still a file…");
assert(d.isDirectory() === false, "…and not a directory.");
assert(d.size === 1, "Size matches length of now-truncated content.");
});
fs.readFile(file, function (e, d) {
assert(!e, "Still no error from fs.readFile");
assert(Buffer.isBuffer(d), "Result without encoding is a buffer.");
assert(d.length === 1, "Buffer is correct size.");
assert(d[0] === 0x42, "Buffer content is correct.");
fs.truncate(file, 1025, function (e) {
assert(!e, "No error from fs.truncate (extending)");
fs.readFile(file, function (e, d) {
assert(!e, "Still no error from fs.readFile after extension");
assert(d.length === 1025, "Read after extension is correct size.");
assert(d[0] === 0x42, "First byte is still correct.");
var allZeroes = true;
for (var i = 1, len = d.length; i < len; ++i) if (d[i] !== 0) allZeroes = false;
assert(allZeroes, "Extended portion of file is zero-filled.");
fs.truncate(file, 3, function (e) {
assert(!e, "No error from fs.truncate (shortening)");
fs.readFile(file, function (e, d) {
assert(!e, "Still no error from fs.readFile after shortening.");
assert(d.length === 3, "Read after shortening is correct size.");
assert(d[0] === 0x42, "First byte is still correct.");
assert(d[1] === 0x00, "Second byte is still correct.");
assert(d[2] === 0x00, "Third byte is still correct.");
proceedWithMoreTests();
});
});
});
});
});
});
});
});
});
function proceedWithMoreTests() {
var fd;
fs.open(file, 'r', function (e, _fd) {
assert(!e, "No error from fs.open.");
fd = _fd;
});
var was = "\u0042\u0000\u0000",
str = "abc";
fs.appendFile(file, str, function (e) {
assert(!e, "No error from fs.appendFile.");
assert(fd, "File descriptor opened before appendFile called.");
var buf = _.allocBuffer(str.length);
fs.read(fd, buf, 0, buf.length, was.length, function (e,n,d) {
assert(!e, "No error from fs.read after append.");
assert(n === str.length, "All appended data was readable.");
assert(d === buf, "Buffer returned from fs.read matched what was passed in.");
assert(d.toString() === str, "Correct data found where expected.");
});
});
fs.readFile(file, {encoding:'ascii'}, function (e,d) {
assert(!e, "No error from fs.appendFile.");
assert(d.length === 6, "Read is correct size after append.");
assert(d === was+str, "Read string matches what was written and then appended.");
fs.open(file, 'a', function (e, fd2) {
assert(!e, "No error from second open of file.");
var str2 = "zyx",
buf2 = _.allocBuffer(str2.length+2);
buf2.write(str2, 1);
fs.write(fd2, buf2, 1, buf2.length-2, was.length, function (e,n,d) {
assert(!e, "No error from appending fs.write.");
assert(n === buf2.length-2, "Wrote proper amount from buffer.");
assert(d === buf2, "Returned original buffer.");
buf2.fill(0);
buf2[0] = 0xFF;
fs.read(fd, buf2, 1, buf2.length-1, was.length, function (e,n,d) {
assert(!e, "No error from twice-appended read.");
assert(n === buf2.length-1, "Read proper amount into buffer.");
assert(buf2[0] === 0xFF, "Read left first byte in buffer properly alone.");
assert(d.slice(1).toString() === (str+str2).slice(0, buf2.length-1), "Data was appended, not written at position.");
});
});
});
});
var F = [BASE_DIR,"Manually inspect from time to time, please!.txt"].join('/'),
S = 512,
N = 16,
b = _.allocBuffer(S*N);
for (var i = 0; i < N; ++i) b.slice(S*i, S*i+S).fill(i.toString(16).charCodeAt(0));
fs.writeFile(F, b, function (e) {
assert(!e, "No error from fs.writeFile with counting blocks.");
fs.readFile(F, function (e,d) {
assert(!e, "No error from fs.readFile with counting blocks.");
assert(d.length === b.length, "Readback is correct size");
var matched = true;
for (var i = 0; i < S*N; ++i) if (b[i] !== d[i]) matched = false;
assert(matched, "Readback matches write byte-for-byte");
});
});
fs.stat(F, function (e,d) {
assert(!e, "No error from fs.stat on counting blocks file.");
assert(d.atime instanceof Date && !isNaN(d.atime.getTime()), "Access time is a valid date.");
assert(d.mtime instanceof Date && !isNaN(d.mtime.getTime()), "Modify time is a valid date.");
assert(d.ctime instanceof Date && !isNaN(d.ctime.getTime()), "Change^WCreate time is a valid date.");
var tf = d.ctime.getTime(),
ct = Date.now();
assert(tf - 2*waitTime < ct && ct < tf + 2*waitTime, "Create time is within ± two `waitTime`s of now.");
fs.utimes(F, new Date(2009, 7-1, 2), null, function (e) {
assert(!e, "No error from fs.utimes.");
fs.stat(F, function (e,d2) {
assert(!e, "No fs.stat error after touching timestamps.");
assert(+d.ctime === +d2.ctime, "Create time not changed by fs.utimes");
assert(d2.atime.toString().indexOf("Jul 02 2009 00:00:00") === 4, "Access time set correctly");
var tf = d2.mtime.getTime(),
ct = Date.now();
assert(tf-2e3 < ct && ct < tf+2e3+waitTime, "Modify time is within ± a few seconds of now.");
// NOTE: due to serialization, this can check results of the `fs.chmod` below, too!
assert(!(d2.mode & 0100), "Archive bit is now unset.");
assert(!(d2.mode & 0222), "Writable perms are unset.");
assert(d2.mode & 0100000, "Regular file bit is set.");
});
});
assert(d.uid === 99, "Desired UID applied.");
assert(d.gid === 42, "Desired GID applied.");
assert(d.mode & 0100, "Archive bit is set.");
assert(d.mode & 0200, "Writable perm is set for user.");
assert((d.mode & 0022) === 0002, "Writable perm is only masked out for group.");
fs.chmod(F, 0422, function (e) {
assert(!e, "No error from fs.chmod.");
});
});
fs.chown(F, 99, 256, function (e) {
assert(e && e.code === 'NOSYS', "Expected error from fs.fchown.");
});
}
function startStreamTests() {
var file2 = [BASE_DIR,FILENAME+"2"].join('/'),
outStream = fs.createWriteStream(file2);
var outStreamOpened = false;
outStream.on('open', function (fd) {
outStreamOpened = true;
assert(typeof fd === 'number', "Got file descriptor on fs.createWriteStream open.");
}).on('error', function (e) {
assert(e, "If fs.createWriteStream fires 'error' event, it should include error object.");
assert(false, "But, fs.createWriteStream should not error during these tests.");
});
setTimeout(function () {
assert(outStreamOpened, "outStream fired 'open' event in a timely fashion.");
}, waitTime);
var TEXT_MOD = TEXTDATA.toLowerCase()+"\n",
NUM_REPS = (waitTime <= 1e3) ? 1024 : 16;
outStream.write(TEXT_MOD, 'utf16le');
outStream.write("Ο καλύτερος χρόνος να φυτευτεί ένα \ud83c\udf31 είναι δέκα έτη πριν.", 'utf16le');
outStream.write("La vez del segundo mejor ahora está.\n", 'utf16le');
for (var i = 0; i < NUM_REPS; ++i) outStream.write("123456789\n", 'ascii');
outStream.write("JavaScript how do they work\n", 'utf16le');
outStream.write("The end, almost.\n", 'utf16le');
outStream.end(TEXTDATA, 'utf16le');
var outStreamFinished = false;
outStream.on('finish', function () {
outStreamFinished = true;
var inStream = fs.createReadStream(file2, {start:NUM_REPS*10, encoding:'utf16le', autoClose:false}),
gotData = false, gotEOF = false, inStreamFD = null;
inStream.on('open', function (fd) {
assert(typeof fd === 'number', "Got file descriptor on fs.createReadStream open.");
inStreamFD = fd;
});
inStream.on('data', function (d) {
gotData = true;
assert(typeof d === 'string', "Data returned as string.");
assert(d.slice(d.length-TEXTDATA.length) === TEXTDATA, "End of file matches what was written.");
});
inStream.on('end', function () {
gotEOF = true;
var len = Buffer.byteLength(TEXT_MOD, 'utf16le'),
buf = _.allocBuffer(len);
fs.fsync(inStreamFD, function (e) {
assert(!e, "No error from proper fsync.");
});
fs.fsync('garbage', function (e) {
assert(e, "Expected error from garbage fsync.");
});
fs.read(inStreamFD, buf, 0, len, 0, function (e,n,d) {
assert(!e, "No error reading from beginning of inStream's file descriptor.");
assert(n === len, "Read complete buffer at beginning of inStream's fd.");
assert(d.toString('utf16le') === TEXT_MOD, "Data matches at beginning of inStream's fd.");
fs.close(inStreamFD, function (e) {
assert(!e, "No error closing inStream's fd.");
});
});
});
setTimeout(function () {
assert(gotData, "inStream fired 'data' event in a timely fashion.");
setTimeout(function () {
assert(gotEOF, "inStream fired 'eof' event in a timely fashion.");
}, waitTime);
}, waitTime);
});
setTimeout(function () {
assert(outStreamFinished, "outStream fired 'finish' event in a timely fashion.");
}, 2*waitTime);
}
});
}
function assert(b,msg) { if (!msg) console.warn("no msg", Error().stack); if (!b) throw Error("Assertion failure. "+msg); else console.log(msg); }

165
@vates/fatfs/vol.js Normal file
View File

@@ -0,0 +1,165 @@
var S = require("./structs.js"),
c = require("./chains.js"),
$ = require("./cache.js"),
_ = require("./helpers.js");
exports.init = function (volume, opts, bootSector) {
if (bootSector[510] !== 0x55 || bootSector[511] !== 0xAA) throw Error("Invalid volume signature!");
var isFAT16 = bootSector.readUInt16LE(S.boot16.fields['FATSz16'].offset),
bootStruct = (isFAT16) ? S.boot16 : S.boot32,
BS = bootStruct.valueFromBytes(bootSector);
_.log(_.log.DBG, "Boot sector info:", BS);
bootSector = null; // allow GC
if (!BS.BytsPerSec) throw Error("This looks like an ExFAT volume! (unsupported)");
else if (BS.BytsPerSec !== volume.sectorSize) throw Error("Sector size mismatch with FAT table.");
var FATSz = (isFAT16) ? BS.FATSz16 : BS.FATSz32,
rootDirSectors = Math.ceil((BS.RootEntCnt * 32) / BS.BytsPerSec),
firstDataSector = BS.ResvdSecCnt + (BS.NumFATs * FATSz) + rootDirSectors,
totSec = (BS.TotSec16) ? BS.TotSec16 : BS.TotSec32,
dataSec = totSec - firstDataSector,
countofClusters = Math.floor(dataSec / BS.SecPerClus);
// avoid corrupting sectors from other partitions or whatnot
if (totSec > volume.numSectors) throw Error("Volume size mismatch!");
var fatType;
if (countofClusters < 4085) {
fatType = 'fat12';
} else if (countofClusters < 65525) {
fatType = 'fat16';
} else {
fatType = 'fat32';
}
_.log(_.log.DBG, "rootDirSectors", rootDirSectors, "firstDataSector", firstDataSector, "countofClusters", countofClusters, "=>", fatType);
var vol = {};
vol.opts = opts;
vol._sectorSize = BS.BytsPerSec;
vol._sectorsPerCluster = BS.SecPerClus;
vol._firstSectorOfCluster = function (n) {
return firstDataSector + (n-2)*vol._sectorsPerCluster;
};
vol._makeCache = function () {
return $.wrapDriver(volume);
};
vol._readSectors = function (cache, secNum, dest, cb) {
if (typeof dest === 'function') {
cb = dest;
dest = _.allocBuffer(vol._sectorSize);
}
_.log(_.log.DBG, "vol._readSectors", secNum, dest.length);
if (secNum < volume.numSectors) cache.readSectors(secNum, dest, function (e) { cb(e, dest); });
else throw Error("Invalid sector number!");
};
vol._writeSectors = function (cache, secNum, data, cb) {
_.log(_.log.DBG, "vol._writeSectors", secNum, data.length);
// NOTE: these are internal assertions, public API will get proper `S.err`s
if (data.length % volume.sectorSize) throw Error("Buffer length not a multiple of sector size");
else if (opts.ro) throw Error("Read-only filesystem");
else if (secNum < volume.numSectors) cache.writeSectors(secNum, data, cb);
else throw Error("Invalid sector number!");
};
function fatInfoForCluster(n) {
var entryStruct = S.fatField[fatType],
FATOffset = (fatType === 'fat12') ? Math.floor(n/2) * entryStruct.size : n * entryStruct.size,
SecNum = BS.ResvdSecCnt + Math.floor(FATOffset / BS.BytsPerSec);
EntOffset = FATOffset % BS.BytsPerSec;
return {sector:SecNum-BS.ResvdSecCnt, offset:EntOffset, struct:entryStruct};
}
// TODO: all this FAT manipulation is crazy inefficient! needs read caching *and* write caching
// …the best place for cache might be in `volume` handler, though. add a `flush` method to that spec?
// TODO: how should we handle redundant FATs? mirror every write? just ignore completely? copy-on-eject?
var fatChain = c.sectorChain(vol, BS.ResvdSecCnt, FATSz);
fatChain.cacheAdvice = 'RANDOM';
vol.fetchFromFAT = function (clusterNum, cb) {
var info = fatInfoForCluster(clusterNum);
fatChain.readFromPosition(info, info.struct.size, function (e,n,d) {
if (e) return cb(e);
var status = info.struct.valueFromBytes(d), prefix;
if (fatType === 'fat12') {
if (clusterNum % 2) {
status = (status.field1ab << 4) + status.field1c;
} else {
status = (status.field0a << 8) + status.field0bc;
}
}
else if (fatType === 'fat32') {
status &= 0x0FFFFFFF;
}
var prefix = S.fatPrefix[fatType];
if (status === S.fatStat.free) cb(null, 'free');
else if (status === S.fatStat._undef) cb(null, '-invalid-');
else if (status > prefix+S.fatStat.eofMin) cb(null, 'eof');
else if (status === prefix+S.fatStat.bad) cb(null, 'bad');
else if (status > prefix+S.fatStat.rsvMin) cb(null, 'reserved');
else cb(null, status);
});
};
vol.storeToFAT = function (clusterNum, status, cb) {
if (typeof status === 'string') {
status = S.fatStat[status];
status += S.fatPrefix[fatType];
}
var info = fatInfoForCluster(clusterNum);
// TODO: technically fat32 needs to *preserve* the high 4 bits
if (fatType === 'fat12') fatChain.readFromPosition(info, info.struct.size, function (e,n,d) {
var value = info.struct.valueFromBytes(d);
if (clusterNum % 2) {
value.field1ab = status >>> 4;
value.field1c = status & 0x0F;
} else {
value.field0a = status >>> 8;
value.field0bc = status & 0xFF;
}
var entry = info.struct.bytesFromValue(value);
fatChain.writeToPosition(info, entry, cb);
}); else {
var entry = info.struct.bytesFromValue(status);
fatChain.writeToPosition(info, entry, cb);
}
};
vol.allocateInFAT = function (hint, cb) {
if (typeof hint === 'function') {
cb = hint;
hint = 2; // TODO: cache a better starting point?
}
function searchForFreeCluster(num, cb) {
if (num < countofClusters) vol.fetchFromFAT(num, function (e, status) {
if (e) cb(e);
else if (status === 'free') cb(null, num);
else searchForFreeCluster(num+1, cb);
}); else cb(S.err.NOSPC()); // TODO: try searching backwards from hint…
}
searchForFreeCluster(hint, function (e, clusterNum) {
if (e) cb(e);
else vol.storeToFAT(clusterNum, 'eof', cb.bind(null,null,clusterNum));
});
};
vol.rootDirectoryChain = (isFAT16) ?
c.sectorChain(vol, firstDataSector - rootDirSectors, rootDirSectors) :
c.clusterChain(vol, BS.RootClus);
vol.rootDirectoryChain.cacheAdvice = 'WILLNEED';
vol.chainForCluster = c.clusterChain.bind(c, vol);
vol.chainFromJSON = function (d) {
return ('numSectors' in d) ?
c.sectorChain(vol, d.firstSector, d.numSectors) :
c.clusterChain(vol, d.firstCluster);
};
return vol;
}

49
@vates/fuse-vhd/.USAGE.md Normal file
View File

@@ -0,0 +1,49 @@
Mount a vhd generated by xen-orchestra to filesystem
### Library
```js
import { mount } from 'fuse-vhd'
// return a disposable, see promise-toolbox/Disposable
// unmount automatically when disposable is disposed
// in case of differencing VHD, it mounts the full chain
await mount(handler, diskId, mountPoint)
```
### cli
From the install folder:
```
cli.mjs <remoteUrl> <vhdPathInRemote> <mountPoint>
```
After installing the package
```
xo-fuse-vhd <remoteUrl> <vhdPathInRemote> <mountPoint>
```
The `remoteUrl` can be found using the following command from the XOA CLI, and then picking the right `url` property:
`xo-server-db ls remote`
The `vhdPathInRemote` follows a file structure described in [VM backups](https://github.com/vatesfr/xen-orchestra/blob/master/%40xen-orchestra/backups/docs/VM%20backups/README.md).
## Restore a file from a VHD using `fuse-vhd` CLI
1. Mount a VHD to the Filesystem (see **Usage**).
2. Verify the VHD is Correctly Mounted:
`mount | grep fuse`
3. Get the `START` and `SIZE` of the disk whose file you want to restore. Multiply `START` by 512 (block size) to get the offset value. (`mountedVhdPath` is the `mountPoint` value from earlier, followed by `/vhd0`, for example). Depending on the partition type, you may need to do some additional setup to discover the partitions.
`partx --bytes --output=NR,START,SIZE,NAME,UUID,TYPE --pairs <mountedVhdPath>`
4. Mount the disk. Depending on the partition type, you may need to add some additional options. The `norecovery` option is used for ext3/ext4/xfs file systems; otherwise, remove this option.
`mount --options=loop,ro,norecovery,sizelimit=<SIZE>,offset=<START*512> --source=<mountedVhdPath> --target=<diskMountPoint>`
5. Copy your files from the mounted partition, then unmount the partition.

80
@vates/fuse-vhd/README.md Normal file
View File

@@ -0,0 +1,80 @@
<!-- DO NOT EDIT MANUALLY, THIS FILE HAS BEEN GENERATED -->
# @vates/fuse-vhd
[![Package Version](https://badgen.net/npm/v/@vates/fuse-vhd)](https://npmjs.org/package/@vates/fuse-vhd) ![License](https://badgen.net/npm/license/@vates/fuse-vhd) [![PackagePhobia](https://badgen.net/bundlephobia/minzip/@vates/fuse-vhd)](https://bundlephobia.com/result?p=@vates/fuse-vhd) [![Node compatibility](https://badgen.net/npm/node/@vates/fuse-vhd)](https://npmjs.org/package/@vates/fuse-vhd)
## Install
Installation of the [npm package](https://npmjs.org/package/@vates/fuse-vhd):
```sh
npm install --save @vates/fuse-vhd
```
## Usage
Mount a vhd generated by xen-orchestra to filesystem
### Library
```js
import { mount } from 'fuse-vhd'
// return a disposable, see promise-toolbox/Disposable
// unmount automatically when disposable is disposed
// in case of differencing VHD, it mounts the full chain
await mount(handler, diskId, mountPoint)
```
### cli
From the install folder:
```
cli.mjs <remoteUrl> <vhdPathInRemote> <mountPoint>
```
After installing the package
```
xo-fuse-vhd <remoteUrl> <vhdPathInRemote> <mountPoint>
```
The `remoteUrl` can be found using the following command from the XOA CLI, and then picking the right `url` property:
`xo-server-db ls remote`
The `vhdPathInRemote` follows a file structure described in [VM backups](https://github.com/vatesfr/xen-orchestra/blob/master/%40xen-orchestra/backups/docs/VM%20backups/README.md).
## Restore a file from a VHD using `fuse-vhd` CLI
1. Mount a VHD to the Filesystem (see **Usage**).
2. Verify the VHD is Correctly Mounted:
`mount | grep fuse`
3. Get the `START` and `SIZE` of the disk whose file you want to restore. Multiply `START` by 512 (block size) to get the offset value. (`mountedVhdPath` is the `mountPoint` value from earlier, followed by `/vhd0`, for example). Depending on the partition type, you may need to do some additional setup to discover the partitions.
`partx --bytes --output=NR,START,SIZE,NAME,UUID,TYPE --pairs <mountedVhdPath>`
4. Mount the disk. Depending on the partition type, you may need to add some additional options. The `norecovery` option is used for ext3/ext4/xfs file systems; otherwise, remove this option.
`mount --options=loop,ro,norecovery,sizelimit=<SIZE>,offset=<START*512> --source=<mountedVhdPath> --target=<diskMountPoint>`
5. Copy your files from the mounted partition, then unmount the partition.
## Contributions
Contributions are _very_ welcomed, either on the documentation or on
the code.
You may:
- report any [issue](https://github.com/vatesfr/xen-orchestra/issues)
you've encountered;
- fork and create a pull request.
## License
[ISC](https://spdx.org/licenses/ISC) © [Vates SAS](https://vates.fr)

26
@vates/fuse-vhd/cli.mjs Executable file
View File

@@ -0,0 +1,26 @@
#!/usr/bin/env node
import Disposable from 'promise-toolbox/Disposable'
import { getSyncedHandler } from '@xen-orchestra/fs'
import { mount } from './index.mjs'
async function* main([remoteUrl, vhdPathInRemote, mountPoint]) {
if (mountPoint === undefined) {
throw new TypeError('missing arg: cli <remoteUrl> <vhdPathInRemote> <mountPoint>')
}
const handler = yield getSyncedHandler({ url: remoteUrl })
const mounted = await mount(handler, vhdPathInRemote, mountPoint)
let disposePromise
process.on('SIGINT', async () => {
// ensure single dispose
if (!disposePromise) {
disposePromise = mounted.dispose()
}
await disposePromise
process.exit()
})
}
Disposable.wrap(main)(process.argv.slice(2))

View File

@@ -1,8 +1,11 @@
import LRU from 'lru-cache'
import Fuse from 'fuse-native'
import { createLogger } from '@xen-orchestra/log'
import { VhdSynthetic } from 'vhd-lib'
import { Disposable, fromCallback } from 'promise-toolbox'
const { warn } = createLogger('vates:fuse-vhd')
// build a s stat object from https://github.com/fuse-friends/fuse-native/blob/master/test/fixtures/stat.js
const stat = st => ({
mtime: st.mtime || new Date(),
@@ -52,13 +55,16 @@ export const mount = Disposable.factory(async function* mount(handler, diskPath,
},
read(path, fd, buf, len, pos, cb) {
if (path === '/vhd0') {
return vhd.readRawData(pos, len, cache, buf).then(cb)
return vhd.readRawData(pos, len, cache, buf).then(cb, error => {
warn('read error', { path, len, pos, error })
cb(Fuse.EIO)
})
}
throw new Error(`read file ${path} not exists`)
},
})
return new Disposable(
() => fromCallback(() => fuse.unmount()),
fromCallback(() => fuse.mount())
() => fromCallback(cb => fuse.unmount(cb)),
fromCallback(cb => fuse.mount(cb))
)
})

View File

@@ -1,6 +1,6 @@
{
"name": "@vates/fuse-vhd",
"version": "2.0.0",
"version": "2.1.2",
"license": "ISC",
"private": false,
"homepage": "https://github.com/vatesfr/xen-orchestra/tree/master/@vates/fuse-vhd",
@@ -19,10 +19,15 @@
},
"main": "./index.mjs",
"dependencies": {
"@xen-orchestra/fs": "^4.8.0",
"@xen-orchestra/log": "^0.7.2",
"fuse-native": "^2.2.6",
"lru-cache": "^7.14.0",
"promise-toolbox": "^0.21.0",
"vhd-lib": "^4.6.1"
"vhd-lib": "^4.16.0"
},
"bin": {
"xo-fuse-vhd": "./cli.mjs"
},
"scripts": {
"postversion": "npm publish --access public"

View File

@@ -0,0 +1,58 @@
A toolbox to ease the use of generator
### Timeout
wrap a source async generator to have it throw an error when timeout is reached
timeout is a positive number in milliseconds
```js
import { Timeout } from '@vates/generator-toolbox'
const wrappedGenerator = new Timeout(sourceGenerator, timeout)
```
### Throttle
wrap a source async generator to have it respect a max speed ( in bytes per seconds).
speed is either a strictly positive number or a function returning a strictly positive number. A speed change will be used for the next emitted packet.
The source generator must yield object with a length property.
Optimized for small yields regarding to the speed, since it won't split incoming packet.
If the generator reached the max speed it will be paused, limiting memory consumption.
```js
import { Throttle } from '@vates/generator-toolbox'
const wrappedGenerator = new Throttle(sourceGenerator, speed)
```
### Synchronized
Fork a generator. The rules are:
- if the source returns, all the forks return
- if the forks error, all the forks error with the same error
- if a fork returns, it is stopped, but the generator continue with the other
- if a fork errors, it is stopped, but the generator continue with the other
- if all the forks return, the source is stopped
- if all the forks error, the source is errored with the last error
- the source start producing a packet when the fastest forked ask for it
- the source forks get the packet only when all the forks asked for it, no buffer stores in memory
```ts
import { Synchronized } from '@vates/generator-toolbox'
async function consume(generator: AsyncGenerator) {
for await (const val of generator) {
console.log({ val })
}
}
const forker = new Synchronized(generator)
const first = forker.fork('first')
const second = forker.fork('second')
await Promise.all([consume(first), consume(second)])
```
Note: you can stop early a generator by calling `generator.return()`, and you can stop in in error by calling `generator.throw(error)`

View File

@@ -0,0 +1 @@
../../scripts/npmignore

View File

@@ -0,0 +1,89 @@
<!-- DO NOT EDIT MANUALLY, THIS FILE HAS BEEN GENERATED -->
# @vates/generator-toolbox
[![Package Version](https://badgen.net/npm/v/@vates/generator-toolbox)](https://npmjs.org/package/@vates/generator-toolbox) ![License](https://badgen.net/npm/license/@vates/generator-toolbox) [![PackagePhobia](https://badgen.net/bundlephobia/minzip/@vates/generator-toolbox)](https://bundlephobia.com/result?p=@vates/generator-toolbox) [![Node compatibility](https://badgen.net/npm/node/@vates/generator-toolbox)](https://npmjs.org/package/@vates/generator-toolbox)
## Install
Installation of the [npm package](https://npmjs.org/package/@vates/generator-toolbox):
```sh
npm install --save @vates/generator-toolbox
```
## Usage
A toolbox to ease the use of generator
### Timeout
wrap a source async generator to have it throw an error when timeout is reached
timeout is a positive number in milliseconds
```js
import { Timeout } from '@vates/generator-toolbox'
const wrappedGenerator = new Timeout(sourceGenerator, timeout)
```
### Throttle
wrap a source async generator to have it respect a max speed ( in bytes per seconds).
speed is either a strictly positive number or a function returning a strictly positive number. A speed change will be used for the next emitted packet.
The source generator must yield object with a length property.
Optimized for small yields regarding to the speed, since it won't split incoming packet.
If the generator reached the max speed it will be paused, limiting memory consumption.
```js
import { Throttle } from '@vates/generator-toolbox'
const wrappedGenerator = new Throttle(sourceGenerator, speed)
```
### Synchronized
Fork a generator. The rules are:
- if the source returns, all the forks return
- if the forks error, all the forks error with the same error
- if a fork returns, it is stopped, but the generator continue with the other
- if a fork errors, it is stopped, but the generator continue with the other
- if all the forks return, the source is stopped
- if all the forks error, the source is errored with the last error
- the source start producing a packet when the fastest forked ask for it
- the source forks get the packet only when all the forks asked for it, no buffer stores in memory
```ts
import { Synchronized } from '@vates/generator-toolbox'
async function consume(generator: AsyncGenerator) {
for await (const val of generator) {
console.log({ val })
}
}
const forker = new Synchronized(generator)
const first = forker.fork('first')
const second = forker.fork('second')
await Promise.all([consume(first), consume(second)])
```
Note: you can stop early a generator by calling `generator.return()`, and you can stop in in error by calling `generator.throw(error)`
## Contributions
Contributions are _very_ welcomed, either on the documentation or on
the code.
You may:
- report any [issue](https://github.com/vatesfr/xen-orchestra/issues)
you've encountered;
- fork and create a pull request.
## License
[MIT](https://spdx.org/licenses/MIT) © [Vates SAS](https://vates.fr)

View File

@@ -0,0 +1,6 @@
// @ts-check
import eslint from '@eslint/js'
import tseslint from 'typescript-eslint'
export default tseslint.config(eslint.configs.recommended, tseslint.configs.recommended)

View File

@@ -0,0 +1,38 @@
{
"name": "@vates/generator-toolbox",
"version": "1.1.2",
"main": "dist/index.mjs",
"license": "MIT",
"private": false,
"type": "module",
"devDependencies": {
"@eslint/js": "^9.19.0",
"rimraf": "^6.0.1",
"@types/node": "^20.6",
"typescript": "~5.6",
"typescript-eslint": "^8.23.0"
},
"scripts": {
"build": "tsc",
"dev": "tsc --watch",
"postversion": "npm publish --access public",
"prebuild": "rimraf dist/",
"predev": "yarn run prebuild",
"test": "tsc && node --test **/*.test.mjs",
"clean": "rimraf dist/"
},
"homepage": "https://github.com/vatesfr/xen-orchestra/tree/master/@vates/generator-toolbox",
"bugs": "https://github.com/vatesfr/xen-orchestra/issues",
"repository": {
"directory": "@vates/generator-toolbox",
"type": "git",
"url": "https://github.com/vatesfr/xen-orchestra.git"
},
"author": {
"name": "Vates SAS",
"url": "https://vates.fr"
},
"engines": {
"node": ">=20.18"
}
}

View File

@@ -0,0 +1,3 @@
export { Synchronized } from './synchronized.mjs'
export { Throttle } from './throttle.mjs'
export { Timeout } from './timeout.mjs'

View File

@@ -0,0 +1,150 @@
import assert from 'node:assert'
export class Synchronized<T, TReturn, TNext> {
#source: AsyncGenerator<T, TReturn, TNext>
#forks = new Map<string, Forked<T, TReturn, TNext>>()
#removedForks = new Set<string>()
#waitingForks = new Set<string>()
#started = false
#nextValueForksReady?: {
promise: Promise<IteratorResult<T>>
forksWaitingReject: (error: Error) => void
forksWaitingResolve: () => void
}
constructor(source: AsyncGenerator<T, TReturn, TNext>) {
this.#source = source
}
fork(uid: string): AsyncGenerator<T, TReturn, TNext> {
assert.strictEqual(this.#started, false, `can't create a fork after consuming the data`)
assert.strictEqual(this.#forks.has(uid), false, `a fork with id ${uid} already exists`)
const fork = new Forked<T, TReturn, TNext>(this, uid)
this.#forks.set(uid, fork)
return fork
}
async #resolveWhenAllForksReady(): Promise<IteratorResult<T>> {
if (!this.#nextValueForksReady) {
throw new Error('Can t wait forks if there are noone waiting')
}
const { promise, forksWaitingResolve } = this.#nextValueForksReady
if (this.#waitingForks.size === this.#forks.size) {
// reset value
this.#waitingForks.clear()
this.#nextValueForksReady = undefined
forksWaitingResolve() // for the other forks waiting
}
return promise
}
async next(uid: string): Promise<IteratorResult<T>> {
if (this.#removedForks.has(uid)) {
return { done: true, value: undefined }
}
if (!this.#forks.has(uid)) {
throw new Error(`trying to advance fork ${uid} that is not a fork of this one`)
}
if (this.#waitingForks.has(uid)) {
throw new Error(`Fork ${uid} is already waiting`)
}
this.#started = true
if (this.#nextValueForksReady === undefined) {
let forksWaitingResolve = () => {}
let forksWaitingReject: (reason?: Error) => void = () => {}
const next = this.#source.next().catch(async error => {
const e = new Error(`Error in the source generator ${error.message}`, { cause: error })
forksWaitingReject(e)
// source has failed, kill everything, and stop the forks
for (const uid of [...this.#forks.keys()]) {
await this.remove(uid, error)
}
})
const promise = Promise.all([
next,
new Promise((_resolve, _reject) => {
forksWaitingResolve = () => _resolve(undefined)
forksWaitingReject = _reject
}),
]).then(([_]) => _ as IteratorResult<T>)
this.#nextValueForksReady = { promise, forksWaitingResolve, forksWaitingReject }
}
this.#waitingForks.add(uid)
return this.#resolveWhenAllForksReady()
}
async remove(uid: string, error?: Error): Promise<IteratorResult<T>> {
const fork = this.#forks.get(uid)
if (fork === undefined) {
if (this.#removedForks.has(uid)) {
// already removed
return { done: true, value: undefined }
}
throw new Error(`trying to remove fork with uid ${uid} that is not a fork of this one`)
}
this.#forks.delete(uid)
this.#waitingForks.delete(uid)
this.#removedForks.add(uid)
try {
if (error === undefined) {
await fork.return()
} else {
await fork.throw(error)
}
} catch (cleaningError) {
console.error('Error while cleaning the forked', {
cleaningError,
sourceError: error,
})
}
if (this.#forks.size === 0) {
if (error === undefined) {
await this.#source.return(undefined as TReturn)
} else {
await this.#source.throw(error)
}
// Reject any pending forks waiting for the next value
if (this.#nextValueForksReady) {
this.#nextValueForksReady.forksWaitingReject(new Error('Source generator terminated.', { cause: error }))
this.#nextValueForksReady = undefined
}
// clear state
this.#removedForks.clear()
this.#waitingForks.clear()
} else {
// this fork was maybe blocking the others
if (this.#nextValueForksReady) {
await this.#resolveWhenAllForksReady()
}
}
return { done: true, value: undefined }
}
}
class Forked<T, TReturn, TNext> implements AsyncGenerator<T, TReturn, TNext> {
#parent: Synchronized<T, TReturn, TNext>
#uid: string
constructor(parent: Synchronized<T, TReturn, TNext>, uid: string) {
this.#parent = parent
this.#uid = uid
}
next(): Promise<IteratorResult<T>> {
return this.#parent.next(this.#uid)
}
async return(): Promise<IteratorResult<T>> {
return this.#parent.remove(this.#uid)
}
async throw(e: Error): Promise<IteratorResult<T>> {
return this.#parent.remove(this.#uid, e)
}
[Symbol.asyncIterator](): AsyncGenerator<T, TReturn, TNext> {
return this
}
}

View File

@@ -0,0 +1,173 @@
import assert from 'node:assert'
import { suite, test } from 'node:test'
import { Synchronized } from './synchronized.mjs'
async function* makeRangeGenerator(end = Infinity, progress = { yielded: 0 }, onYielded = (_val: unknown) => {}) {
for (let i = 0; i < end; i++) {
await new Promise(resolve => setTimeout(resolve, 10))
yield i
onYielded(i)
progress.yielded = i
}
return progress
}
async function consume(
iterable: AsyncGenerator,
delay = 2500,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
onConsumed = (_val: unknown, _iterable: AsyncGenerator) => Promise.resolve(false)
) {
for await (const val of iterable) {
await new Promise(resolve => setTimeout(resolve, delay))
if (await onConsumed(val, iterable)) {
iterable.return(undefined)
}
}
}
suite('success', () => {
test('for-await-of break stops the source generator', async () => {
let sourceClosed = false
const source = (async function* () {
try {
for (let i = 0; i < 10; i++) {
await new Promise(resolve => setTimeout(resolve, 10))
yield i
}
} finally {
sourceClosed = true
}
})()
const forker = new Synchronized(source)
const fork = forker.fork('first')
// for-await-of must call fork.return() on break, which propagates to the source
for await (const val of fork) {
if (val === 2) break
}
assert.strictEqual(sourceClosed, true)
})
test('if works with multiple consumer', async () => {
const progress = { yielded: 0 }
const generator = makeRangeGenerator(3, progress)
const forker = new Synchronized(generator)
const first = forker.fork('first')
const second = forker.fork('second')
await Promise.all([consume(first, 50), consume(second, 500)])
assert.strictEqual(progress.yielded, 2)
})
test('if works with one consumer returning', async () => {
const progress = { yielded: 0 }
const generator = makeRangeGenerator(10, progress)
const forker = new Synchronized(generator)
const first = forker.fork('first')
const second = forker.fork('second')
await new Promise(resolve => setTimeout(resolve, 500))
await Promise.all([
consume(first, 1),
consume(second, 1, async (val: unknown) => {
return Promise.resolve(val === 2)
}),
])
assert.strictEqual(progress.yielded, 9)
})
test('if works with all consumers returning', async () => {
const progress = { yielded: 0 }
const generator = makeRangeGenerator(10, progress)
const forker = new Synchronized(generator)
const first = forker.fork('first')
const second = forker.fork('second')
await new Promise(resolve => setTimeout(resolve, 500))
await Promise.all([
consume(first, 1, async (val: unknown) => {
return Promise.resolve(val === 5)
}),
consume(second, 1, async (val: unknown) => {
return Promise.resolve(val === 2)
}),
])
assert.strictEqual(progress.yielded, 4)
})
})
suite('error', () => {
test('it fails all if error on source', async () => {
const progress = { yielded: 0 }
const generator = makeRangeGenerator(5, progress, (val: unknown) => {
if (val === 2) {
throw new Error('source stop')
}
})
const forker = new Synchronized(generator)
const first = forker.fork('first')
const second = forker.fork('second')
await assert.rejects(Promise.all([consume(first, 1), consume(second, 1)]))
assert.strictEqual(progress.yielded, 1)
})
test('it flows until the end if one consumer throws', async () => {
const progress = { yielded: 0 }
const generator = makeRangeGenerator(10, progress)
const forker = new Synchronized(generator)
const first = forker.fork('first')
const second = forker.fork('second')
const firstConsume = consume(first, 1)
const secondConsume = assert.rejects(() =>
consume(second, 1, async (val: unknown, iterable) => {
if (val === 1) {
await iterable.throw(new Error('error on second'))
}
return false
})
)
await Promise.allSettled([firstConsume, secondConsume])
assert.strictEqual(progress.yielded, 9)
})
test('it throw if ALL consumer throws', async () => {
const progress = { yielded: 0 }
const generator = makeRangeGenerator(5, progress)
const forker = new Synchronized(generator)
const first = forker.fork('first')
const second = forker.fork('second')
const firstConsume = consume(first, 1, async (val: unknown, iterable) => {
if (val === 3) {
await iterable.throw(new Error('error on first'))
}
return false
})
const secondConsume = consume(second, 1, async (val: unknown, iterable) => {
if (val === 1) {
await iterable.throw(new Error('error on second'))
}
return false
})
await assert.rejects(Promise.all([firstConsume, secondConsume]))
assert.strictEqual(progress.yielded, 2)
})
test('It should not allow a new fork after the start', async () => {
const progress = { yielded: 0 }
const generator = makeRangeGenerator(5, progress)
const forker = new Synchronized(generator)
const first = forker.fork('first')
await first.next()
assert.throws(() => forker.fork('second'))
})
test('It should not allow fork with the same uid', async () => {
const progress = { yielded: 0 }
const generator = makeRangeGenerator(5, progress)
const forker = new Synchronized(generator)
forker.fork('first')
forker.fork('second')
assert.throws(() => forker.fork('first'))
})
})

View File

@@ -0,0 +1,68 @@
import assert from 'node:assert'
/**
*
* This class will throttle the production of a group of generators
*
* limits: depends on the event loop, so don't expect it to be very precise
* works better with more small blocks
* The source generator must yield object with a length property
* Changing the speed will only be takin into account fot the next packets asked
*/
export class Throttle {
#previousSlot = 0
#bytesPerSecond: number | (() => number)
get speed(): number {
let speed: number
if (typeof this.#bytesPerSecond === 'function') {
speed = this.#bytesPerSecond()
} else {
speed = this.#bytesPerSecond
}
assert.ok(speed >= 0, `speed must be positive, ${speed} computed`)
return speed
}
constructor(speed: number | (() => number)) {
this.#bytesPerSecond = speed
}
getNextSlot(length: number): { timeout?: ReturnType<typeof setTimeout>; promise?: Promise<unknown> } {
assert.notStrictEqual(length, undefined, `throttled stream need to expose a length property }`)
assert.ok(length > 0, `throttled stream must expose a positive length property , ${length} given }`)
if (this.speed === 0) {
return {}
}
const previous = this.#previousSlot
const nextSlot = Math.round(previous + (length * 1000) / this.speed)
if (nextSlot < Date.now()) {
// we're above the limit, go now
this.#previousSlot = Date.now()
return {}
}
this.#previousSlot = nextSlot
// wait till the next slot
// it won't be extremely precise since the event loop is not
let timeout: ReturnType<typeof setTimeout> | undefined = undefined
const promise = new Promise(function (resolve) {
timeout = setTimeout(resolve, nextSlot - Date.now())
})
return { promise, timeout }
}
async *createThrottledGenerator(source: AsyncGenerator<{ length: number }>): AsyncGenerator<{ length: number }> {
let timeout: ReturnType<typeof setTimeout> | undefined
try {
for await (const value of source) {
const res = this.getNextSlot(value.length)
timeout = res.timeout
// wait for the time slot before yielding the data
if (res.promise !== undefined) {
await res.promise
}
yield value
}
} finally {
clearTimeout(timeout)
}
}
}

View File

@@ -0,0 +1,63 @@
import { Throttle } from './throttle.mjs'
import { suite, test } from 'node:test'
import assert from 'node:assert'
async function* makeGenerator(chunkSize = 1024 * 1024, nbChunks = 100) {
for (let i = 0; i < nbChunks; i++) {
yield Buffer.allocUnsafe(chunkSize)
}
}
async function consumes(generator: AsyncGenerator) {
// eslint-disable-next-line no-empty,@typescript-eslint/no-unused-vars
for await (const data of generator) {
}
}
suite('it throttle one', () => {
test('base test', async () => {
// 10MB/s
const throttler = new Throttle(10 * 1024 * 1024)
const throttled = throttler.createThrottledGenerator(makeGenerator(1024 * 1024, 20))
const start = Date.now()
await consumes(throttled)
const end = Date.now()
assert.strictEqual(Math.round((end - start) / 1000), 2)
})
test('variable speed test', async () => {
// 10MB/s
const throttler = new Throttle(() => 10 * 1024 * 1024)
const throttled = throttler.createThrottledGenerator(makeGenerator(1024 * 1024, 20))
const start = Date.now()
await consumes(throttled)
const end = Date.now()
assert.strictEqual(Math.round((end - start) / 1000), 2)
})
test('multiple generator test', async () => {
// 10MB/s
const throttler = new Throttle(10 * 1024 * 1024)
const first = throttler.createThrottledGenerator(makeGenerator(1024 * 1024, 10))
const second = throttler.createThrottledGenerator(makeGenerator(1024 * 1024, 10))
const start = Date.now()
await Promise.all([consumes(first), consumes(second)])
const end = Date.now()
assert.strictEqual(Math.round((end - start) / 1000), 2)
})
test(`it doesn't accept negative value`, async () => {
// 10MB/s
let throttler = new Throttle(-10 * 1024 * 1024)
let generator = throttler.createThrottledGenerator(makeGenerator(1024 * 1024, 10))
await assert.rejects(() => consumes(generator))
let index = 5
throttler = new Throttle(() => {
index--
return index > 0 ? 10 * 1024 * 1024 : -10 * 1024 * 1024
})
generator = throttler.createThrottledGenerator(makeGenerator(1024 * 1024, 10))
await assert.rejects(() => consumes(generator))
})
})

View File

@@ -0,0 +1,49 @@
import assert from 'node:assert'
const TIMEOUT = Symbol('timeout')
export class Timeout<T> implements AsyncGenerator {
#source: AsyncGenerator<T>
#timeout: number
constructor(source: AsyncGenerator<T>, timeout: number) {
assert.ok(timeout > 0, `Timeout value must be positive, ${timeout} received`)
this.#source = source
this.#timeout = timeout
}
async next(): Promise<IteratorResult<T>> {
let timeoutHandle: ReturnType<typeof setTimeout>
const sourceNext = this.#source.next()
const result = await Promise.race([
sourceNext.then(res => {
clearTimeout(timeoutHandle)
return res
}),
new Promise<typeof TIMEOUT>(resolve => {
timeoutHandle = setTimeout(() => resolve(TIMEOUT), this.#timeout)
}),
])
if (result === TIMEOUT) {
// stop the source once the in-flight next settles to avoid data loss on the next call
// we don't want to await for the end of timeouted code
sourceNext.then(
() => this.#source.return(undefined).catch(() => {}),
() => {} // source already errored, nothing to clean up
)
throw new Error('Timeout reached')
}
return result
}
return(): Promise<IteratorResult<T>> {
return this.#source.return(undefined)
}
throw(e: Error): Promise<IteratorResult<T>> {
return this.#source.throw(e)
}
[Symbol.asyncIterator](): AsyncGenerator<T> {
return this
}
}

View File

@@ -0,0 +1,87 @@
import { describe, it } from 'node:test'
import assert from 'node:assert'
import { Timeout } from './timeout.mjs'
describe('Timeout class', () => {
it('should reject a timeout with a negative or zero value ', async () => {
// Create a mock async generator that never resolves
const mockGenerator = (async function* () {
yield 1
})()
assert.throws(() => new Timeout(mockGenerator, 0))
assert.throws(() => new Timeout(mockGenerator, -10))
})
it('should resolve with the value from the source generator if it completes before the timeout', async () => {
// Create a mock async generator that resolves immediately
const mockGenerator = (async function* () {
yield 1
})()
const timeout = new Timeout(mockGenerator, 100) // 100ms timeout
const result = await timeout.next()
assert.strictEqual(result.value, 1)
assert.strictEqual(result.done, false)
})
it('should reject with a timeout error if the source generator takes too long', async () => {
// Create a mock async generator that never resolves
// eslint-disable-next-line require-yield
const mockGenerator = (async function* () {
await new Promise(() => {}) // Never resolves
})()
const timeout = new Timeout(mockGenerator, 10) // 10ms timeout
await assert.rejects(timeout.next(), 'Expected timeout error was not thrown')
})
it('should allow iteration using for-await-of', async () => {
// Create a mock async generator that yields values
const mockGenerator: AsyncGenerator<number> = (async function* () {
yield 1
yield 2
yield 3
})()
const timeout = new Timeout(mockGenerator, 100) // 100ms timeout
const results: Array<number> = []
for await (const value of timeout) {
results.push(value as number)
}
assert.deepStrictEqual(results, [1, 2, 3])
})
it('should handle the throw method correctly', async () => {
// Create a mock async generator with a throw method
const mockGenerator = (async function* () {
yield 1
})()
const timeout = new Timeout(mockGenerator, 100) // 100ms timeout
await assert.rejects(timeout.throw(new Error('Test error')), 'Expected error was not thrown')
})
it('should close the source generator after a timeout', async () => {
let sourceClosed = false
const slowSource = (async function* () {
try {
// resolves after 100ms so the in-flight next() eventually settles
await new Promise(resolve => setTimeout(resolve, 100))
yield 1
} finally {
sourceClosed = true
}
})()
const timeout = new Timeout(slowSource, 10) // fires before source yields
await assert.rejects(() => timeout.next(), /Timeout reached/)
// wait for the in-flight next() to settle so source.return() can be called
await new Promise(resolve => setTimeout(resolve, 200))
assert.strictEqual(sourceClosed, true)
})
})

View File

@@ -0,0 +1,13 @@
{
"compilerOptions": {
"target": "es2023",
"module": "ESNext",
"types": ["node"], // Only use types from Node.js and packages that are explicitly imported
"moduleResolution": "bundler",
"strict": true,
"declaration": true, // Generates `.d.ts` files for type safety
"outDir": "dist" // Outputs compiled code to the `dist` directory
},
"include": ["src/**/*"],
"exclude": ["node_modules", "dist"]
}

View File

@@ -0,0 +1,65 @@
### `create([opts], [requestListener])`
Creates a new server instance. `opts` may contain `createServer` and `createSecureServer` factories (defaults to `http.createServer` and `https.createServer`). `requestListener` is registered as a `request` event listener.
```js
import { create } from '@vates/http-server-plus'
const server = create(function onRequest(req, res) {
res.end('Hello')
})
```
### `server.listen(opts)`
Starts listening. Returns a promise that resolves to a human-readable address string, or rejects with `error.niceAddress` set.
```js
// HTTP on a specific port
await server.listen({ port: 8080 })
// HTTPS — detected automatically when cert+key are provided
await server.listen({
port: 443,
cert: fs.readFileSync('certificate.pem'),
key: fs.readFileSync('private_key.pem'),
})
// Unix socket
await server.listen({ socket: '/var/run/http.sock' })
// File descriptor
await server.listen({ fd: 3 })
// Systemd socket activation
await server.listen({ systemdSocket: 0 })
```
> As a convenience, if `hostname` is `'localhost'`, it will listen on both `127.0.0.1` and `::1`, similar to what Node does when no hostname is provided.
Multiple endpoints can be started on the same instance:
```js
const [httpAddr, httpsAddr] = await Promise.all([server.listen({ port: 80 }), server.listen({ port: 443, cert, key })])
console.log('listening on', httpAddr, httpsAddr)
```
### HTTP/2
Pass a custom `createSecureServer` factory to enable HTTP/2:
```js
import { createSecureServer } from 'node:http2'
import { create } from '@vates/http-server-plus'
const server = create({ createSecureServer }, app)
await server.listen({ port: 443, cert, key })
```
### `server.close()`
Closes all underlying servers. Returns a promise that resolves once the `close` event is emitted.
```js
await server.close()
```

View File

@@ -0,0 +1 @@
../../scripts/npmignore

View File

@@ -0,0 +1,91 @@
<!-- DO NOT EDIT MANUALLY, THIS FILE HAS BEEN GENERATED -->
# @vates/http-server-plus
> Augmented &#x60;http.Server&#x60;, HTTP/HTTPS/HTTP2 and multiple ports on the same instance
## Usage
### `create([opts], [requestListener])`
Creates a new server instance. `opts` may contain `createServer` and `createSecureServer` factories (defaults to `http.createServer` and `https.createServer`). `requestListener` is registered as a `request` event listener.
```js
import { create } from '@vates/http-server-plus'
const server = create(function onRequest(req, res) {
res.end('Hello')
})
```
### `server.listen(opts)`
Starts listening. Returns a promise that resolves to a human-readable address string, or rejects with `error.niceAddress` set.
```js
// HTTP on a specific port
await server.listen({ port: 8080 })
// HTTPS — detected automatically when cert+key are provided
await server.listen({
port: 443,
cert: fs.readFileSync('certificate.pem'),
key: fs.readFileSync('private_key.pem'),
})
// Unix socket
await server.listen({ socket: '/var/run/http.sock' })
// File descriptor
await server.listen({ fd: 3 })
// Systemd socket activation
await server.listen({ systemdSocket: 0 })
```
> As a convenience, if `hostname` is `'localhost'`, it will listen on both `127.0.0.1` and `::1`, similar to what Node does when no hostname is provided.
Multiple endpoints can be started on the same instance:
```js
const [httpAddr, httpsAddr] = await Promise.all([
server.listen({ port: 80 }),
server.listen({ port: 443, cert, key }),
])
console.log('listening on', httpAddr, httpsAddr)
```
### HTTP/2
Pass a custom `createSecureServer` factory to enable HTTP/2:
```js
import { createSecureServer } from 'node:http2'
import { create } from '@vates/http-server-plus'
const server = create({ createSecureServer }, app)
await server.listen({ port: 443, cert, key })
```
### `server.close()`
Closes all underlying servers. Returns a promise that resolves once the `close` event is emitted.
```js
await server.close()
```
## Contributions
Contributions are _very_ welcomed, either on the documentation or on
the code.
You may:
- report any [issue](https://github.com/vatesfr/xen-orchestra/issues)
you've encountered;
- fork and create a pull request.
## License
[ISC](https://spdx.org/licenses/ISC) © [Vates SAS](https://vates.fr)

View File

@@ -0,0 +1,268 @@
'use strict'
// ===================================================================
const EventEmitter = require('events').EventEmitter
const formatUrl = require('url').format
const fromEvent = require('promise-toolbox/fromEvent')
const inherits = require('util').inherits
const resolvePath = require('path').resolve
// ===================================================================
const forwardedEvents = [
'checkContinue',
'checkExpectation',
'clientError',
'connect',
'connection',
'listening',
'request',
'secureConnection',
'upgrade',
]
function extractProperty(obj, prop) {
const value = obj[prop]
if (value !== undefined) {
delete obj[prop]
return value
}
}
function forOwn(obj, cb) {
const keys = Object.keys(obj)
for (let i = 0, n = keys.length; i < n; ++i) {
cb(obj[keys[i]])
}
}
function getSystemdFd(index) {
if (process.pid !== +process.env.LISTEN_PID) {
throw new Error('systemd sockets are not meant for us (LISTEN_PID)')
}
const listenFds = process.env.LISTEN_FDS
if (listenFds == null) {
throw new Error('no systemd sockets found (LISTEN_FDS)')
}
const max = listenFds - 1
if (index > max) {
throw new Error('no such systemd socket found')
}
return index + 3 // 3 = SD_LISTEN_FDS_START
}
const isEmpty = obj => Object.keys(obj).length === 0
// ===================================================================
function onNewListener(event, listener) {
if (forwardedEvents.includes(event)) {
forOwn(this._servers, server => {
server.on(event, listener)
})
}
}
function onRemoveListener(event, listener) {
if (forwardedEvents.includes(event)) {
forOwn(this._servers, server => {
server.off(event, listener)
})
}
}
function Server(opts) {
EventEmitter.call(this)
this._createServer = (opts != null && opts.createServer) || require('http').createServer
this._createSecureServer = (opts != null && opts.createSecureServer) || require('https').createServer
this._servers = Object.create(null)
this._niceAddresses = Object.create(null)
this.on('removeListener', onRemoveListener).on('newListener', onNewListener)
}
inherits(Server, EventEmitter)
const proto = Server.prototype
function getAddress(serverId) {
return this[serverId].address()
}
proto.addresses = function Server$addresses() {
const servers = this._servers
return Object.keys(servers).map(getAddress, servers)
}
function getNiceAddress(serverId) {
return this[serverId]
}
proto.niceAddresses = function Server$niceAddresses() {
const niceAddresses = this._niceAddresses
return Object.keys(niceAddresses).map(getNiceAddress, niceAddresses)
}
function close(server) {
server.close()
}
proto.close = function Server$close(callback) {
if (callback) {
this.once('close', callback)
}
// Emit the close event even if there are no registered servers.
if (isEmpty(this._servers)) {
const self = this
setImmediate(function () {
self.emit('close')
})
return Promise.resolve()
}
// Closes each servers.
forOwn(this._servers, close)
return fromEvent(this, 'close')
}
let nextId = 0
proto.listen = function Server$listen(opts) {
opts = Object.assign({}, opts)
if (opts.hostname === 'localhost') {
return Promise.all([
this.listen(Object.assign(opts, { hostname: '::1' })),
this.listen(Object.assign(opts, { hostname: '127.0.0.1' })),
]).then(addresses => addresses[0])
}
const hostname = extractProperty(opts, 'hostname')
let port = extractProperty(opts, 'port')
const systemdSocket = extractProperty(opts, 'systemdSocket')
let fd = extractProperty(opts, 'fd')
let socket = extractProperty(opts, 'socket')
const servers = this._servers
const niceAddresses = this._niceAddresses
let server, protocol
if (opts.pfx || opts.SNICallback || (opts.cert && opts.key)) {
server = this._createSecureServer(opts)
protocol = 'https'
} else {
server = this._createServer(opts)
protocol = 'http'
}
const id = nextId++
servers[id] = server
if (systemdSocket != null) {
fd = getSystemdFd(systemdSocket)
}
// Compute a temporary nice address to display in case of error.
let niceAddress
if (fd != null) {
server.listen({ fd })
niceAddress = protocol + '://<fd:' + fd + '>'
} else if (socket != null) {
socket = resolvePath(socket)
server.listen(socket)
niceAddress = protocol + '://' + socket
} else {
if (port == null) {
port = protocol === 'https' ? 443 : 80
}
server.listen(port, hostname)
niceAddress = formatUrl({
protocol,
// Hostname default to localhost.
hostname: hostname || 'localhost',
// No port means random, unknown for now.
port: port || '<unknown>',
})
}
const emit = this.emit.bind(this)
server.once('close', function onClose() {
delete servers[id]
delete niceAddresses[id]
if (isEmpty(servers)) {
emit('close')
}
})
server.on('error', function onError() {
delete servers[id]
// FIXME: Should it be forwarded and be fatal if there are no
// listeners?
})
forwardedEvents.forEach(event => {
this.listeners(event).forEach(listener => {
server.on(event, listener)
})
})
return fromEvent(server, 'listening').then(
function () {
const address = server.address()
const niceAddress =
typeof address === 'string'
? protocol + '://' + address
: formatUrl({
protocol,
hostname: address.address,
port: address.port,
})
niceAddresses[id] = niceAddress
return niceAddress
},
function (error) {
error.niceAddress = niceAddress
throw error
}
)
}
function ref(server) {
server.ref()
}
proto.ref = function Server$ref() {
forOwn(this._servers, ref)
}
function unref(server) {
server.unref()
}
proto.unref = function Server$unref() {
forOwn(this._servers, unref)
}
// ===================================================================
module.exports = exports = Server
exports.create = function create(opts, requestListener) {
if (typeof opts === 'function') {
requestListener = opts
opts = undefined
}
const server = new Server(opts)
if (requestListener !== undefined) {
server.on('request', requestListener)
}
return server
}

View File

@@ -0,0 +1,303 @@
'use strict'
// ===================================================================
const assert = require('assert/strict')
const { EventEmitter } = require('events')
const resolvePath = require('path').resolve
const { describe, it } = require('node:test')
const HttpServerPlus = require('./')
// ===================================================================
// Creates a minimal mock server that can be used as a drop-in for http/https.Server.
// `address` is the value returned by mock.address() — use an object for TCP, a string for sockets.
function createMock(address) {
const mock = new EventEmitter()
mock.listen = function () {
setImmediate(() => this.emit('listening'))
}
mock.address = () => address
mock.close = function () {
setImmediate(() => this.emit('close'))
}
return mock
}
// ===================================================================
describe('HttpServerPlus', function () {
describe('#create()', function () {
it('creates a new instance', function () {
assert(HttpServerPlus.create() instanceof HttpServerPlus)
})
it('can register a `request` listener', function () {
const listener = function () {}
const server = HttpServerPlus.create(listener)
assert.deepEqual(server.listeners('request'), [listener])
})
})
describe('.addresses()', function () {
it('returns the list of addresses the server is listening at', function () {
const addr = { address: '127.0.0.1', port: 8080, family: 'IPv4' }
const mock = createMock(addr)
const server = HttpServerPlus.create({ createServer: () => mock })
return server.listen({ port: 8080 }).then(function () {
assert.deepEqual(server.addresses(), [addr])
return server.close()
})
})
})
describe('.niceAddresses()', function () {
it('returns the list of human readable addresses the server is listening at', function () {
const mock = createMock({ address: '127.0.0.1', port: 8080 })
const server = HttpServerPlus.create({ createServer: () => mock })
return server.listen({ hostname: '127.0.0.1', port: 8080 }).then(function (address) {
assert.deepEqual(server.niceAddresses(), [address])
return server.close()
})
})
})
describe('secureConnection event forwarding', function () {
function createMockHttpsServer() {
const server = new EventEmitter()
server.listen = function () {
setImmediate(() => this.emit('listening'))
}
server.address = () => ({ address: '127.0.0.1', port: 8443 })
server.close = function () {
setImmediate(() => this.emit('close'))
}
return server
}
function createServerWithMock() {
let mockServer
const server = HttpServerPlus.create({
createSecureServer: () => {
mockServer = createMockHttpsServer()
return mockServer
},
})
return {
server,
getMock: () => mockServer,
}
}
it('forwards secureConnection to listeners registered before listen()', function () {
const { server, getMock } = createServerWithMock()
const received = []
server.on('secureConnection', socket => received.push(socket))
const fakeSocket = {}
return server.listen({ cert: 'fake-cert', key: 'fake-key' }).then(function () {
getMock().emit('secureConnection', fakeSocket)
assert.deepEqual(received, [fakeSocket])
return server.close()
})
})
it('forwards secureConnection to listeners registered after listen()', function () {
const { server, getMock } = createServerWithMock()
return server.listen({ cert: 'fake-cert', key: 'fake-key' }).then(function () {
const received = []
server.on('secureConnection', socket => received.push(socket))
const fakeSocket = {}
getMock().emit('secureConnection', fakeSocket)
assert.deepEqual(received, [fakeSocket])
return server.close()
})
})
it('stops forwarding secureConnection after listener is removed', function () {
const { server, getMock } = createServerWithMock()
const received = []
const listener = socket => received.push(socket)
server.on('secureConnection', listener)
return server.listen({ cert: 'fake-cert', key: 'fake-key' }).then(function () {
server.off('secureConnection', listener)
getMock().emit('secureConnection', {})
assert.deepEqual(received, [])
return server.close()
})
})
})
describe('.listen()', function () {
it('can use a host:port', function () {
let listenArgs
const mock = createMock({ address: '127.0.0.1', port: 8080 })
mock.listen = function (...args) {
listenArgs = args
setImmediate(() => this.emit('listening'))
}
const server = HttpServerPlus.create({ createServer: () => mock })
return server.listen({ hostname: '127.0.0.1', port: 8080 }).then(function () {
assert.deepEqual(listenArgs, [8080, '127.0.0.1'])
return server.close()
})
})
it('can use a systemd socket', function () {
const SD_LISTEN_FDS_START = 3
const SOCKET_INDEX = 0
let listenArgs
const mock = createMock('http://<fd:3>')
mock.listen = function (...args) {
listenArgs = args
setImmediate(() => this.emit('listening'))
}
const server = HttpServerPlus.create({ createServer: () => mock })
const env = process.env
env.LISTEN_FDS = String(SOCKET_INDEX + 1)
env.LISTEN_PID = String(process.pid)
return server.listen({ systemdSocket: SOCKET_INDEX }).then(function () {
delete env.LISTEN_FDS
delete env.LISTEN_PID
assert.deepEqual(listenArgs, [{ fd: SOCKET_INDEX + SD_LISTEN_FDS_START }])
return server.close()
})
})
it('can use a socket', function () {
const socketPath = '/tmp/http-server-plus-test.sock'
let listenArgs
const mock = createMock(socketPath)
mock.listen = function (...args) {
listenArgs = args
setImmediate(() => this.emit('listening'))
}
const server = HttpServerPlus.create({ createServer: () => mock })
return server.listen({ socket: socketPath }).then(function () {
assert.deepEqual(listenArgs, [resolvePath(socketPath)])
return server.close()
})
})
it('can use a HTTPS certificate', function () {
let capturedOpts
const mock = createMock({ address: '127.0.0.1', port: 8443 })
const server = HttpServerPlus.create({
createSecureServer: opts => {
capturedOpts = opts
return mock
},
})
return server.listen({ cert: 'my-cert', key: 'my-key', port: 8443 }).then(function (address) {
assert.equal(capturedOpts.cert, 'my-cert')
assert.equal(capturedOpts.key, 'my-key')
assert.ok(address.startsWith('https://'), `expected https URL, got: ${address}`)
return server.close()
})
})
it('returns a promise which will resolve once listening', function () {
const mock = createMock({ address: '127.0.0.1', port: 8080 })
const server = HttpServerPlus.create({ createServer: () => mock })
return server.listen({ port: 8080 }).then(function (address) {
assert.equal(typeof address, 'string')
assert.ok(address.startsWith('http://'), `expected http URL, got: ${address}`)
return server.close()
})
})
it('returns a promise which will reject if failure', function () {
const listenError = new Error('EADDRINUSE')
const mock = createMock(null)
mock.listen = function () {
setImmediate(() => this.emit('error', listenError))
}
const server = HttpServerPlus.create({ createServer: () => mock })
return server.listen({ port: 8080 }).then(
function () {
assert.fail('should have rejected')
},
function (err) {
assert.equal(err, listenError)
assert.equal(typeof err.niceAddress, 'string')
}
)
})
})
describe('.close()', function () {
it('closes all servers', function () {
const closed = []
let callCount = 0
const server = HttpServerPlus.create({
createServer: () => {
const id = callCount++
const mock = createMock({ address: '127.0.0.1', port: id })
mock.close = function () {
closed.push(id)
setImmediate(() => this.emit('close'))
}
return mock
},
})
return Promise.all([server.listen({ port: 0 }), server.listen({ port: 0 })])
.then(function () {
return server.close()
})
.then(function () {
assert.equal(closed.length, 2)
})
})
it('emit the `close` event when all servers are closed', function () {
const mock = createMock({ address: '127.0.0.1', port: 8080 })
const server = HttpServerPlus.create({ createServer: () => mock })
let closeEmitted = false
server.on('close', () => {
closeEmitted = true
})
return server
.listen({ port: 8080 })
.then(function () {
return server.close()
})
.then(function () {
assert.ok(closeEmitted)
})
})
it('emit the `close` event even if there are no servers', function () {
const server = HttpServerPlus.create()
// close() with no servers returns Promise.resolve() immediately (before emitting
// 'close' via setImmediate), so we must wait for the event itself, not the promise.
return new Promise(function (resolve) {
server.close(resolve)
})
})
})
})

View File

@@ -0,0 +1,37 @@
{
"name": "@vates/http-server-plus",
"version": "2.0.0",
"license": "ISC",
"description": "Augmented `http.Server`, HTTP/HTTPS/HTTP2 and multiple ports on the same instance",
"keywords": [
"http",
"https",
"server",
"ports"
],
"homepage": "https://github.com/vatesfr/xen-orchestra/tree/master/@vates/http-server-plus",
"bugs": "https://github.com/vatesfr/xen-orchestra/issues",
"repository": {
"directory": "@vates/http-server-plus",
"type": "git",
"url": "https://github.com/vatesfr/xen-orchestra.git"
},
"engines": {
"node": ">=20"
},
"dependencies": {
"promise-toolbox": "^0.21.0"
},
"devDependencies": {
"eslint-plugin-n": "^15.1.0"
},
"scripts": {
"pretest": "eslint .",
"test": "node --test index.spec.js"
},
"private": true,
"author": {
"name": "Vates SAS",
"url": "https://vates.fr"
}
}

View File

@@ -0,0 +1,18 @@
The use for this library is to create a composite key from a JSON value, ignoring objects identity and properties order.
The hash algorithm used is intended to be fast and with low collisions and is not guaranteed to be be secure.
The hash is encoded using [Base64 URL](https://en.wikipedia.org/wiki/Base64#URL_applications) to make it easy to use in URLs and filenames.
```js
import { jsonHash } from '@vates/json-hash'
console.log(jsonHash('foo'))
// → "siEyldVkkW-JpqQkVVZ8h8P0gPzXocFeIg8X1xaaeQs"
// order of properties is ignored
console.log(jsonHash({ foo: 0, bar: 1 }))
// → "JckoRSMIBjNlgEWIXhgpBOuyLQYqABZqvf1ccb3BPg0"
console.log(jsonHash({ bar: 1, foo: 0 }))
// → "JckoRSMIBjNlgEWIXhgpBOuyLQYqABZqvf1ccb3BPg0"
```

1
@vates/json-hash/.npmignore Symbolic link
View File

@@ -0,0 +1 @@
../../scripts/npmignore

View File

@@ -0,0 +1,51 @@
<!-- DO NOT EDIT MANUALLY, THIS FILE HAS BEEN GENERATED -->
# @vates/json-hash
[![Package Version](https://badgen.net/npm/v/@vates/json-hash)](https://npmjs.org/package/@vates/json-hash) ![License](https://badgen.net/npm/license/@vates/json-hash) [![PackagePhobia](https://badgen.net/bundlephobia/minzip/@vates/json-hash)](https://bundlephobia.com/result?p=@vates/json-hash) [![Node compatibility](https://badgen.net/npm/node/@vates/json-hash)](https://npmjs.org/package/@vates/json-hash)
> Compute a stable hash from a JSON-ifiable value
## Install
Installation of the [npm package](https://npmjs.org/package/@vates/json-hash):
```sh
npm install --save @vates/json-hash
```
## Usage
The use for this library is to create a composite key from a JSON value, ignoring objects identity and properties order.
The hash algorithm used is intended to be fast and with low collisions and is not guaranteed to be be secure.
The hash is encoded using [Base64 URL](https://en.wikipedia.org/wiki/Base64#URL_applications) to make it easy to use in URLs and filenames.
```js
import { jsonHash } from '@vates/json-hash'
console.log(jsonHash('foo'))
// → "siEyldVkkW-JpqQkVVZ8h8P0gPzXocFeIg8X1xaaeQs"
// order of properties is ignored
console.log(jsonHash({ foo: 0, bar: 1 }))
// → "JckoRSMIBjNlgEWIXhgpBOuyLQYqABZqvf1ccb3BPg0"
console.log(jsonHash({ bar: 1, foo: 0 }))
// → "JckoRSMIBjNlgEWIXhgpBOuyLQYqABZqvf1ccb3BPg0"
```
## Contributions
Contributions are _very_ welcomed, either on the documentation or on
the code.
You may:
- report any [issue](https://github.com/vatesfr/xen-orchestra/issues)
you've encountered;
- fork and create a pull request.
## License
[ISC](https://spdx.org/licenses/ISC) © [Vates SAS](https://vates.fr)

38
@vates/json-hash/index.js Normal file
View File

@@ -0,0 +1,38 @@
'use strict'
const { createHash } = require('node:crypto')
function updateJsonHash(value, hash) {
if (value !== null && typeof value === 'object') {
if (Array.isArray(value)) {
hash.update('[')
for (const item of value) {
updateJsonHash(item, hash)
// trailing is not a big deal because it does not need to be valid JSON
hash.update(',')
}
hash.update(']')
} else {
hash.update('{')
for (const key of Object.keys(value).sort()) {
updateJsonHash(key, hash)
hash.update(':')
updateJsonHash(value[key], hash)
// trailing is not a big deal because it does not need to be valid JSON
hash.update(',')
}
hash.update('}')
}
} else {
hash.update(JSON.stringify(value))
}
}
exports.jsonHash = function jsonHash(value) {
// this hash does not need to be secure, it just needs to be fast and with low collisions
const hash = createHash('sha256')
updateJsonHash(value, hash)
return hash.digest('base64url')
}

View File

@@ -0,0 +1,21 @@
'use strict'
const { jsonHash } = require('@vates/json-hash')
const assert = require('node:assert/strict')
const test = require('node:test')
const cases = [
[null, 'dCNOmK_nSY-12vHzasLXiswzlGT5UHA7jAGYkvmCuQs'],
[42, 'c0dctApWjo2ooEXO0RATfhWfiQrE2og7axfcZRs6gEk'],
['foo', 'siEyldVkkW-JpqQkVVZ8h8P0gPzXocFeIg8X1xaaeQs'],
[[], 'T1PNoYwrqgwDVLtfmj7L5e0Sq02OEbqHPC8RFhICuUU'],
[{}, 'RBNvo1WzZ4oRRq0W9-hknpT7T8If536DEMBg9hyq_4o'],
[{ a: 1, b: 2 }, 'LMjVxyj2vtMZ3W1cZ2cJrQij5zn7FBOlPiyBB38OmFE'],
[{ b: 2, a: 1 }, 'LMjVxyj2vtMZ3W1cZ2cJrQij5zn7FBOlPiyBB38OmFE'],
]
for (const [value, hash] of cases) {
test(JSON.stringify(value), function () {
assert.equal(jsonHash(value), hash)
})
}

View File

@@ -0,0 +1,30 @@
{
"private": false,
"name": "@vates/json-hash",
"description": "Compute a stable hash from a JSON-ifiable value",
"keywords": [
"hash",
"json",
"stable"
],
"homepage": "https://github.com/vatesfr/xen-orchestra/tree/master/@vates/json-hash",
"bugs": "https://github.com/vatesfr/xen-orchestra/issues",
"repository": {
"directory": "@vates/json-hash",
"type": "git",
"url": "https://github.com/vatesfr/xen-orchestra.git"
},
"author": {
"name": "Vates SAS",
"url": "https://vates.fr"
},
"license": "ISC",
"version": "0.2.0",
"engines": {
"node": ">=14.18.0"
},
"scripts": {
"postversion": "npm publish --access public",
"test": "node --test"
}
}

View File

@@ -17,4 +17,14 @@ map.get(['foo', 'bar']) // 2
map.get(['bar', 'foo']) // 3
map.get([OBJ]) // 4
map.get([{}]) // undefined
map.delete([])
for (const [key, value] of map.entries() {
console.log(key, value)
}
for (const value of map.values()) {
console.log(value)
}
```

View File

@@ -35,6 +35,16 @@ map.get(['foo', 'bar']) // 2
map.get(['bar', 'foo']) // 3
map.get([OBJ]) // 4
map.get([{}]) // undefined
map.delete([])
for (const [key, value] of map.entries() {
console.log(key, value)
}
for (const value of map.values()) {
console.log(value)
}
```
## Contributions

View File

@@ -36,14 +36,31 @@ function del(node, i, keys) {
return node
}
function* entries(node, key) {
if (node !== undefined) {
if (node instanceof Node) {
const { value } = node
if (value !== undefined) {
yield [key, node.value]
}
for (const [childKey, child] of node.children.entries()) {
yield* entries(child, key.concat(childKey))
}
} else {
yield [key, node]
}
}
}
function get(node, i, keys) {
return i === keys.length
? node instanceof Node
? node.value
: node
: node instanceof Node
? get(node.children.get(keys[i]), i + 1, keys)
: undefined
? get(node.children.get(keys[i]), i + 1, keys)
: undefined
}
function set(node, i, keys, value) {
@@ -69,6 +86,22 @@ function set(node, i, keys, value) {
return node
}
function* values(node) {
if (node !== undefined) {
if (node instanceof Node) {
const { value } = node
if (value !== undefined) {
yield node.value
}
for (const child of node.children.values()) {
yield* values(child)
}
} else {
yield node
}
}
}
exports.MultiKeyMap = class MultiKeyMap {
constructor() {
// each node is either a value or a Node if it contains children
@@ -79,6 +112,10 @@ exports.MultiKeyMap = class MultiKeyMap {
this._root = del(this._root, 0, keys)
}
entries() {
return entries(this._root, [])
}
get(keys) {
return get(this._root, 0, keys)
}
@@ -86,4 +123,8 @@ exports.MultiKeyMap = class MultiKeyMap {
set(keys, value) {
this._root = set(this._root, 0, keys, value)
}
values() {
return values(this._root)
}
}

View File

@@ -1,6 +1,6 @@
'use strict'
const { describe, it } = require('test')
const { describe, it } = require('node:test')
const assert = require('node:assert')
const { MultiKeyMap } = require('./')
@@ -19,7 +19,7 @@ describe('MultiKeyMap', () => {
// reverse composite key
['bar', 'foo'],
]
const values = keys.map(() => ({}))
const values = keys.map(() => Math.random())
// set all values first to make sure they are all stored and not only the
// last one
@@ -27,6 +27,12 @@ describe('MultiKeyMap', () => {
map.set(key, values[i])
})
assert.deepEqual(
Array.from(map.entries()),
keys.map((key, i) => [key, values[i]])
)
assert.deepEqual(Array.from(map.values()), values)
keys.forEach((key, i) => {
// copy the key to make sure the array itself is not the key
assert.strictEqual(map.get(key.slice()), values[i])

View File

@@ -18,15 +18,12 @@
"url": "https://vates.fr"
},
"license": "ISC",
"version": "0.1.0",
"version": "0.2.0",
"engines": {
"node": ">=8.10"
},
"scripts": {
"postversion": "npm publish --access public",
"test": "node--test"
},
"devDependencies": {
"test": "^3.2.1"
"test": "node --test"
}
}

View File

@@ -0,0 +1,132 @@
import { RandomAccessDisk } from '@xen-orchestra/disk-transform'
import NbdClient from '@vates/nbd-client'
/**
* @typedef {{ offset: number, length: number }} DataRange
*/
/**
* @extends {RandomAccessDisk}
*/
export class NbdDisk extends RandomAccessDisk {
#nbdInfos
/** @type {NbdClient|undefined} */
#nbdClient
/** @type {Array<DataRange> | undefined} */
#dataMap
/** @type {number} */
#blockSize
constructor(nbdInfos, blockSize, { dataMap } = {}) {
super()
this.#blockSize = blockSize
this.#nbdInfos = nbdInfos
this.#dataMap = dataMap && this.#processDatamap(dataMap)
}
#processDatamap(rawDataMap) {
return rawDataMap
.filter(({ type }) => type === 0)
.map(({ offset, length }) => ({ offset, length }))
.sort(({ offset: offset1 }, { offset: offset2 }) => offset1 - offset2)
}
/**
* @param {number} index
* @returns {Promise<DiskBlock>}
*/
async readBlock(index) {
if (!this.#nbdClient) {
throw new Error("can't readBlock before init")
}
let data = await this.#nbdClient.readBlock(index, this.getBlockSize())
if (data.length !== this.getBlockSize()) {
// this condition only work on non aligned disks
// we won't accept truncated block from unaligned disks
if (index === Math.ceil(this.getVirtualSize() / this.getBlockSize()) - 1) {
// last block add zeros at the end
data = Buffer.concat([data], this.getBlockSize())
} else {
throw new Error(`Block ${index} is not at the right size, expecting ${this.getBlockSize()}, got ${data.length}`)
}
}
return {
index,
data,
}
}
/**
* @returns {number}
*/
getVirtualSize() {
if (!this.#nbdClient) {
throw new Error("can't get size before init")
}
return Number(this.#nbdClient.exportSize)
}
/**
* @returns {number}
*/
getBlockSize() {
return this.#blockSize
}
/**
* @returns {Promise<void>}
*/
async init() {
this.#nbdClient = new NbdClient(this.#nbdInfos)
await this.#nbdClient.connect()
if (this.#dataMap === undefined) {
this.#dataMap = this.#processDatamap(await this.#nbdClient.getMap())
}
}
/**
* @returns {Promise<void>}
*/
async close() {
await this.#nbdClient?.disconnect()
}
/**
* @returns {boolean}
*/
isDifferencing() {
return false
}
/**
* @returns {Array<number>}
*/
getBlockIndexes() {
const indexes = new Set()
this.#dataMap?.forEach(({ offset, length }) => {
if (length === 0) return
const firstBlockIndex = Math.floor(offset / this.getBlockSize())
const lastBlockIndex = Math.floor((offset + length - 1) / this.getBlockSize())
for (let blockIndex = firstBlockIndex; blockIndex <= lastBlockIndex; blockIndex++) {
indexes.add(blockIndex)
}
})
return [...indexes].sort((a, b) => a - b)
}
/**
* @param {number} index
* @returns {boolean}
*/
hasBlock(index) {
if (!this.#dataMap) {
throw new Error("can't hasBlock before init")
}
const blockStart = index * this.getBlockSize()
const blockEnd = (index + 1) * this.getBlockSize()
return this.#dataMap.some(({ offset, length }) => offset + length > blockStart && offset < blockEnd)
}
}

View File

@@ -1,6 +1,6 @@
export const INIT_PASSWD = Buffer.from('NBDMAGIC') // "NBDMAGIC" ensure we're connected to a nbd server
export const OPTS_MAGIC = Buffer.from('IHAVEOPT') // "IHAVEOPT" start an option block
export const NBD_OPT_REPLY_MAGIC = 1100100111001001n // magic received during negociation
export const NBD_OPT_REPLY_MAGIC = 1100100111001001n // magic received during negotiation
export const NBD_OPT_EXPORT_NAME = 1
export const NBD_OPT_ABORT = 2
export const NBD_OPT_LIST = 3

View File

@@ -1,10 +1,9 @@
import assert from 'node:assert'
import { Socket } from 'node:net'
import { connect } from 'node:tls'
import { fromCallback, pRetry, pDelay, pTimeout } from 'promise-toolbox'
import { pRetry, pDelay, pTimeout, pFromCallback } from 'promise-toolbox'
import { readChunkStrict } from '@vates/read-chunk'
import { createLogger } from '@xen-orchestra/log'
import {
INIT_PASSWD,
NBD_CMD_READ,
@@ -21,6 +20,7 @@ import {
OPTS_MAGIC,
NBD_CMD_DISC,
} from './constants.mjs'
import { spawn } from 'node:child_process'
const { warn } = createLogger('vates:nbd-client')
@@ -36,33 +36,39 @@ export default class NbdClient {
#exportSize
#waitBeforeReconnect
#readAhead
#readBlockRetries
#reconnectRetry
#connectTimeout
#messageTimeout
// AFAIK, there is no guaranty the server answers in the same order as the queries
// so we handle a backlog of command waiting for response and handle concurrency manually
#waitingForResponse // there is already a listenner waiting for a response
#waitingForResponse // there is already a listener waiting for a response
#nextCommandQueryId = BigInt(0)
#commandQueryBacklog // map of command waiting for an response queryId => { size/*in byte*/, resolve, reject}
#commandQueryBacklog // map of command waiting for a response queryId => { size/*in byte*/, resolve, reject}
#connected = false
#reconnectingPromise
constructor(
{ address, port = NBD_DEFAULT_PORT, exportname, cert },
{ connectTimeout = 6e4, waitBeforeReconnect = 1e3, readAhead = 10, readBlockRetries = 5, reconnectRetry = 5 } = {}
{
connectTimeout = 6e4,
messageTimeout = 6e4,
waitBeforeReconnect = 1e3,
readBlockRetries = 5,
reconnectRetry = 5,
} = {}
) {
this.#serverAddress = address
this.#serverPort = port
this.#exportName = exportname
this.#serverCert = cert
this.#waitBeforeReconnect = waitBeforeReconnect
this.#readAhead = readAhead
this.#readBlockRetries = readBlockRetries
this.#reconnectRetry = reconnectRetry
this.#connectTimeout = connectTimeout
this.#messageTimeout = messageTimeout
}
get exportSize() {
@@ -115,13 +121,27 @@ export default class NbdClient {
if (!this.#connected) {
return
}
this.#connected = false
const socket = this.#serverSocket
const queryId = this.#nextCommandQueryId
this.#nextCommandQueryId++
const buffer = Buffer.alloc(28)
buffer.writeInt32BE(NBD_REQUEST_MAGIC, 0) // it is a nbd request
buffer.writeInt16BE(0, 4) // no command flags for a disconnect
buffer.writeInt16BE(NBD_CMD_DISC, 6) // we want to disconnect from nbd server
await this.#write(buffer)
await this.#serverSocket.destroy()
buffer.writeBigUInt64BE(queryId, 8)
buffer.writeBigUInt64BE(0n, 16)
buffer.writeInt32BE(0, 24)
const promise = pFromCallback(cb => {
socket.end(buffer, 'utf8', cb)
})
try {
await pTimeout.call(promise, this.#messageTimeout)
} catch (error) {
socket.destroy()
}
this.#serverSocket = undefined
this.#connected = false
}
@@ -177,7 +197,7 @@ export default class NbdClient {
}
// send export name we want to access.
// it's implictly closing the negociation phase.
// it's implicitly closing the negotiation phase.
await this.#write(OPTS_MAGIC)
await this.#writeInt32(NBD_OPT_EXPORT_NAME)
const exportNameBuffer = Buffer.from(this.#exportName)
@@ -195,11 +215,27 @@ export default class NbdClient {
}
#read(length) {
return readChunkStrict(this.#serverSocket, length)
const promise = readChunkStrict(this.#serverSocket, length)
return pTimeout.call(promise, this.#messageTimeout)
}
#write(buffer) {
return fromCallback.call(this.#serverSocket, 'write', buffer)
let timeout
const messageTimeout = this.#messageTimeout
const socket = this.#serverSocket
return Promise.race([
new Promise((resolve, reject) => {
timeout = setTimeout(() => {
reject(new Error('timeout'))
}, messageTimeout)
}),
new Promise(resolve =>
socket.write(buffer, () => {
clearTimeout(timeout)
resolve()
})
),
])
}
async #readInt32() {
@@ -232,19 +268,20 @@ export default class NbdClient {
}
try {
this.#waitingForResponse = true
const magic = await this.#readInt32()
const buffer = await this.#read(16)
const magic = buffer.readInt32BE(0)
if (magic !== NBD_REPLY_MAGIC) {
throw new Error(`magic number for block answer is wrong : ${magic} ${NBD_REPLY_MAGIC}`)
}
const error = await this.#readInt32()
const error = buffer.readInt32BE(4)
if (error !== 0) {
// @todo use error code from constants.mjs
throw new Error(`GOT ERROR CODE : ${error}`)
}
const blockQueryId = await this.#readInt64()
const blockQueryId = buffer.readBigUInt64BE(8)
const query = this.#commandQueryBacklog.get(blockQueryId)
if (!query) {
throw new Error(` no query associated with id ${blockQueryId}`)
@@ -265,7 +302,7 @@ export default class NbdClient {
}
}
async readBlock(index, size = NBD_DEFAULT_BLOCK_SIZE) {
async #readBlock(index, size) {
// we don't want to add anything in backlog while reconnecting
if (this.#reconnectingPromise) {
await this.#reconnectingPromise
@@ -281,7 +318,13 @@ export default class NbdClient {
buffer.writeInt16BE(NBD_CMD_READ, 6) // we want to read a data block
buffer.writeBigUInt64BE(queryId, 8)
// byte offset in the raw disk
buffer.writeBigUInt64BE(BigInt(index) * BigInt(size), 16)
const offset = BigInt(index) * BigInt(size)
const remaining = this.#exportSize - offset
if (remaining < BigInt(size)) {
size = Number(remaining)
}
buffer.writeBigUInt64BE(offset, 16)
buffer.writeInt32BE(size, 24)
return new Promise((resolve, reject) => {
@@ -307,45 +350,59 @@ export default class NbdClient {
})
}
async *readBlocks(indexGenerator) {
// default : read all blocks
if (indexGenerator === undefined) {
const exportSize = this.#exportSize
const chunkSize = 2 * 1024 * 1024
indexGenerator = function* () {
const nbBlocks = Math.ceil(Number(exportSize / BigInt(chunkSize)))
for (let index = 0; BigInt(index) < nbBlocks; index++) {
yield { index, size: chunkSize }
}
async readBlock(index, size = NBD_DEFAULT_BLOCK_SIZE) {
return pRetry(() => this.#readBlock(index, size), {
tries: this.#readBlockRetries,
when: error => error.code !== 'ERR_ABORTED',
onRetry: async err => {
warn('will retry reading block ', index, err)
await this.reconnect()
},
})
}
/**
* returns the map of the file with holes, zeros and data, useful to handle efficiently sparse source
* to implement this internally: use structure response if the server supports it, and then ask for BLOCK_STATUS *
*
* @returns {Promise<{ offset: number, length: number, type: number }[]>}
* A promise that resolves to an array where each object represents a segment:
* - `offset` — The byte offset from the start.
* - `length` — The size of the segment in bytes.
* - `type` — A numeric code indicating the segment type ( 0 means data).
*/
/* async */ getMap(signal) {
return new Promise((resolve, reject) => {
const process = spawn('nbdinfo', [
'--json',
'--map',
`nbd://${this.#serverAddress}:${this.#serverPort}/${encodeURIComponent(this.#exportName)}`,
])
let text = ''
let errText = ''
process.stdout.on('data', data => (text += data))
process.stderr.on('data', data => (errText += data))
const onAbort = () => {
process.kill()
reject(signal.reason)
}
}
const readAhead = []
const readAheadMaxLength = this.#readAhead
const makeReadBlockPromise = (index, size) => {
const promise = pRetry(() => this.readBlock(index, size), {
tries: this.#readBlockRetries,
onRetry: async err => {
warn('will retry reading block ', index, err)
await this.reconnect()
},
signal?.addEventListener('abort', onAbort, { once: true })
process.on('error', err => {
signal?.removeEventListener('abort', onAbort)
reject(err)
})
// error is handled during unshift
promise.catch(() => {})
return promise
}
// read all blocks, but try to keep readAheadMaxLength promise waiting ahead
for (const { index, size } of indexGenerator()) {
// stack readAheadMaxLength promises before starting to handle the results
if (readAhead.length === readAheadMaxLength) {
// any error will stop reading blocks
yield readAhead.shift()
}
readAhead.push(makeReadBlockPromise(index, size))
}
while (readAhead.length > 0) {
yield readAhead.shift()
}
process.on('close', code => {
signal?.removeEventListener('abort', onAbort)
if (code !== 0) {
return reject(new Error(`Error during getMap (code: ${code}): ${errText}`))
}
try {
const json = JSON.parse(text)
resolve(json)
} catch (error) {
reject(new Error(`${error} ${text}`))
}
})
})
}
}

145
@vates/nbd-client/multi.mjs Normal file
View File

@@ -0,0 +1,145 @@
import { asyncEach } from '@vates/async-each'
import { NBD_DEFAULT_BLOCK_SIZE } from './constants.mjs'
import NbdClient from './index.mjs'
import { createLogger } from '@xen-orchestra/log'
const { warn } = createLogger('vates:nbd-client:multi')
export default class MultiNbdClient {
#clients = []
#nbdConcurrency
#options
#readAhead
#settings
get exportSize() {
return this.#clients[0].exportSize
}
constructor(settings, { nbdConcurrency = 8, readAhead = 16, ...options } = {}) {
this.#readAhead = readAhead
this.#options = options
this.#nbdConcurrency = nbdConcurrency
if (!Array.isArray(settings)) {
settings = [settings]
}
this.#settings = settings
}
/**
*
* open nbdConcurrency connections to NBD servers
* it must obtain at least one connection to succeed
* it tries to spread connections on multiple host
*
* @returns {Promise<void>}
*/
async connect() {
const candidates = [...this.#settings]
const baseOptions = this.#options
const _connect = async () => {
if (candidates.length === 0) {
return
}
// a little bit of randomization to spread the load
const nbdInfo = candidates[Math.floor(Math.random() * candidates.length)]
const client = new NbdClient(nbdInfo, {
...baseOptions,
readAhead: Math.ceil(this.#readAhead / this.#nbdConcurrency),
})
try {
await client.connect()
this.#clients.push(client)
} catch (err) {
client.disconnect().catch(() => {})
// do not hammer unreachable hosts, once failed, remove from the list
const candidateIndex = candidates.findIndex(({ address }) => address === nbdInfo.address)
if (candidateIndex >= 0) {
// this candidate may have already been deleted by another parallel promise
candidates.splice(candidateIndex, 1)
}
warn(`can't connect to one nbd client`, { err })
// retry with another candidate (if available)
return _connect()
}
}
// don't connect in parallel since this can lead to race condition
// on distributed systems ( like the NBD server of the XAPI)
for (let i = 0; i < this.#nbdConcurrency; i++) {
await _connect()
}
if (this.#clients.length === 0) {
const error = new Error(`Fail to connect to any Nbd client`, { nbdInfos: this.#settings })
error.code = 'NO_NBD_AVAILABLE'
throw error
}
if (this.#clients.length < this.#nbdConcurrency) {
warn(
`incomplete connection by multi Nbd, only ${this.#clients.length} over ${this.#nbdConcurrency} expected clients`
)
}
}
/**
* @returns {Promise<void>}
*/
async disconnect() {
await asyncEach(this.#clients, client => client.disconnect(), {
stopOnError: false,
})
}
/**
*
* @param {number} index
* @param {number} size
* @returns {Promise<Buffer>}
*/
async readBlock(index, size = NBD_DEFAULT_BLOCK_SIZE) {
const clientId = index % this.#clients.length
return this.#clients[clientId].readBlock(index, size)
}
/**
*
* @param {AsyncGenerator<Buffer>} indexGenerator
*/
async *readBlocks(indexGenerator) {
// default : read all blocks
const readAhead = []
const makeReadBlockPromise = (index, size) => {
const promise = this.readBlock(index, size)
// error is handled during unshift
promise.catch(() => {})
return promise
}
// read all blocks, but try to keep readAheadMaxLength promise waiting ahead
for (const { index, size } of indexGenerator()) {
// stack readAheadMaxLength promises before starting to handle the results
if (readAhead.length === this.#readAhead) {
// any error will stop reading blocks
yield readAhead.shift()
}
readAhead.push(makeReadBlockPromise(index, size))
}
while (readAhead.length > 0) {
yield readAhead.shift()
}
}
/**
* returns the map of the file with holes, zeros and data, useful to handle efficiently sparse source *
*
* @returns {Promise<{ offset: number, length: number, type: number }[]>}
* A promise that resolves to an array where each object represents a segment:
* - `offset` — The byte offset from the start.
* - `length` — The size of the segment in bytes.
* - `type` — A numeric code indicating the segment type (0 means no data).
*/
async getMap(signal) {
// ask the map from one of the connected client
return this.#clients[Math.floor(this.#clients.length * Math.random())].getMap(signal)
}
}

View File

@@ -13,25 +13,26 @@
"url": "https://vates.fr"
},
"license": "ISC",
"version": "2.0.0",
"version": "3.4.0",
"engines": {
"node": ">=14.0"
},
"main": "./index.mjs",
"dependencies": {
"@vates/async-each": "^1.0.0",
"@vates/read-chunk": "^1.2.0",
"@xen-orchestra/async-map": "^0.1.2",
"@xen-orchestra/log": "^0.6.0",
"@vates/async-each": "^1.0.3",
"@vates/read-chunk": "^1.2.1",
"@xen-orchestra/async-map": "^0.1.3",
"@xen-orchestra/disk-transform": "^1.2.3",
"@xen-orchestra/log": "^0.7.2",
"promise-toolbox": "^0.21.0",
"xen-api": "^1.3.6"
"xen-api": "^4.7.7"
},
"devDependencies": {
"tap": "^16.3.0",
"tap": "^18.7.0",
"tmp": "^0.2.1"
},
"scripts": {
"postversion": "npm publish --access public",
"test-integration": "tap --lines 97 --functions 95 --branches 74 --statements 97 tests/*.integ.mjs"
"test-integration": "tap --allow-incomplete-coverage"
}
}

View File

@@ -1,4 +1,3 @@
import NbdClient from '../index.mjs'
import { spawn, exec } from 'node:child_process'
import fs from 'node:fs/promises'
import { test } from 'tap'
@@ -7,8 +6,10 @@ import { pFromCallback } from 'promise-toolbox'
import { Socket } from 'node:net'
import { NBD_DEFAULT_PORT } from '../constants.mjs'
import assert from 'node:assert'
import MultiNbdClient from '../multi.mjs'
const FILE_SIZE = 10 * 1024 * 1024
const CHUNK_SIZE = 1024 * 1024 // non default size
const FILE_SIZE = 1024 * 1024 * 9.5 // non aligned file size
async function createTempFile(size) {
const tmpPath = await pFromCallback(cb => tmp.file(cb))
@@ -77,15 +78,14 @@ async function killNbdKit() {
)
}
test('it works with unsecured network', async tap => {
test('it works secured network', async tap => {
const path = await createTempFile(FILE_SIZE)
let nbdServer = await spawnNbdKit(path)
const client = new NbdClient(
{
address: '127.0.0.1',
exportname: 'MY_SECRET_EXPORT',
cert: `-----BEGIN CERTIFICATE-----
const connectionSettings = {
address: '127.0.0.1',
exportname: 'MY_SECRET_EXPORT',
cert: `-----BEGIN CERTIFICATE-----
MIIDazCCAlOgAwIBAgIUeHpQ0IeD6BmP2zgsv3LV3J4BI/EwDQYJKoZIhvcNAQEL
BQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yMzA1MTcxMzU1MzBaFw0yNDA1
@@ -107,15 +107,21 @@ CYu1Xn/FVPx1HoRgWc7E8wFhDcA/P3SJtfIQWHB9FzSaBflKGR4t8WCE2eE8+cTB
57ABhfYpMlZ4aHjuN1bL
-----END CERTIFICATE-----
`,
},
{
readAhead: 2,
}
)
}
const invalid = {
address: '500.500.500.500',
port: 0,
exportname: 'nop',
}
// it should work even with some broken servers
const nbdInfos = [connectionSettings, connectionSettings, invalid]
const client = new MultiNbdClient(nbdInfos, {
nbdConcurrency: 4,
readAhead: 2,
})
await client.connect()
tap.equal(client.exportSize, BigInt(FILE_SIZE))
const CHUNK_SIZE = 1024 * 1024 // non default size
const indexes = []
for (let i = 0; i < FILE_SIZE / CHUNK_SIZE; i++) {
indexes.push(i)
@@ -127,9 +133,9 @@ CYu1Xn/FVPx1HoRgWc7E8wFhDcA/P3SJtfIQWHB9FzSaBflKGR4t8WCE2eE8+cTB
})
let i = 0
for await (const block of nbdIterator) {
let blockOk = true
let blockOk = block.length === Math.min(CHUNK_SIZE, FILE_SIZE - CHUNK_SIZE * i)
let firstFail
for (let j = 0; j < CHUNK_SIZE; j += 4) {
for (let j = 0; j < block.length; j += 4) {
const wanted = i * CHUNK_SIZE + j
const found = block.readUInt32BE(j)
blockOk = blockOk && found === wanted
@@ -137,7 +143,7 @@ CYu1Xn/FVPx1HoRgWc7E8wFhDcA/P3SJtfIQWHB9FzSaBflKGR4t8WCE2eE8+cTB
firstFail = j
}
}
tap.ok(blockOk, `check block ${i} content`)
tap.ok(blockOk, `check block ${i} content ${block.length}`)
i++
// flaky server is flaky
@@ -147,17 +153,6 @@ CYu1Xn/FVPx1HoRgWc7E8wFhDcA/P3SJtfIQWHB9FzSaBflKGR4t8WCE2eE8+cTB
nbdServer = await spawnNbdKit(path)
}
}
// we can reuse the conneciton to read other blocks
// default iterator
const nbdIteratorWithDefaultBlockIterator = client.readBlocks()
let nb = 0
for await (const block of nbdIteratorWithDefaultBlockIterator) {
nb++
tap.equal(block.length, 2 * 1024 * 1024)
}
tap.equal(nb, 5)
assert.rejects(() => client.readBlock(100, CHUNK_SIZE))
await client.disconnect()
@@ -166,3 +161,18 @@ CYu1Xn/FVPx1HoRgWc7E8wFhDcA/P3SJtfIQWHB9FzSaBflKGR4t8WCE2eE8+cTB
nbdServer.kill()
await fs.unlink(path)
})
test('fails if server does not answer', async () => {
const client = new MultiNbdClient(
{
address: '500.500.500.500',
port: 0,
exportname: 'nop',
},
{
nbdConcurrency: 1,
readAhead: 2,
}
)
await assert.rejects(client.connect())
})

View File

@@ -24,7 +24,7 @@ $ npm install node-vsphere-soap --save
## Sample Code
### To connect to a vCenter server:
### To connect to a vCenter server
var nvs = require('node-vsphere-soap');
var vc = new nvs.Client(host, user, password, sslVerify);
@@ -54,7 +54,7 @@ $ npm install node-vsphere-soap --save
- userName - username of authenticated user
- fullName - full name of authenticated user
### To run a command:
### To run a command
var vcCmd = vc.runCommand( commandToRun, arguments );
vcCmd.once('result', function( result, raw, soapHeader) {

View File

@@ -7,7 +7,7 @@
This file creates the Client class
- when the class is instantiated, a connection will be made to the ESXi/vCenter server to verify that the creds are good
- upon a bad login, the connnection will be terminated
- upon a bad login, the connection will be terminated
*/
@@ -17,7 +17,20 @@ import https from 'node:https'
import util from 'util'
import soap from 'soap'
import Cookie from 'soap-cookie' // required for session persistence
import { createLogger } from '@xen-orchestra/log'
const { warn } = createLogger('xo:node-vsphere-soap:client')
class VmwareError extends Error {
constructor(rawError) {
super(rawError.body)
const matches = rawError.body?.match(/<faultstring[^>]*>(.*)<\/faultstring>/im)
this.message = matches?.[1] ?? rawError.message
this.name = 'VmwareError'
this.stack = rawError.stack
// not putting the cause since the error failed to be stringified correctly down the road
warn(rawError)
}
}
// Client class
// inherits from EventEmitter
// possible events: connect, error, ready
@@ -31,14 +44,20 @@ export function Client(vCenterHostname, username, password, sslVerify) {
EventEmitter.call(this)
// sslVerify argument handling
// don't use any proxy to connect to the esxi
if (sslVerify) {
this.clientopts = {}
this.clientopts = {
request: axios.create({
proxy: false,
}),
}
} else {
this.clientopts = {
request: axios.create({
httpsAgent: new https.Agent({
rejectUnauthorized: false,
}),
proxy: false,
}),
}
}
@@ -134,8 +153,9 @@ Client.prototype._connect = function () {
self.clientopts,
function (err, client) {
if (err) {
self.emit('error', err)
throw err
const vErr = new VmwareError(err)
self.emit('error', vErr)
throw vErr
}
self.client = client // save client for later use
@@ -144,6 +164,7 @@ Client.prototype._connect = function () {
.runCommand('RetrieveServiceContent', { _this: 'ServiceInstance' })
.once('result', function (result, raw, soapHeader) {
if (!result.returnval) {
// this is a domain/server error return it as is
self.status = 'disconnected'
self.emit('error', raw)
return
@@ -202,7 +223,7 @@ Client.prototype._close = function () {
function _soapErrorHandler(self, emitter, command, args, err) {
err = err || { body: 'general error' }
if (err.body.match(/session is not authenticated/)) {
if (err.body?.match(/session is not authenticated/)) {
self.status = 'disconnected'
process.removeAllListeners('beforeExit')
@@ -214,16 +235,19 @@ function _soapErrorHandler(self, emitter, command, args, err) {
emitter.emit('result', result, raw, soapHeader)
})
.once('error', function (err) {
emitter.emit('error', err.body)
throw err
const vErr = new VmwareError(err)
emitter.emit('error', vErr)
throw vErr
})
} else {
emitter.emit('error', err.body)
throw err
const vErr = new VmwareError(err)
emitter.emit('error', vErr)
throw vErr
}
} else {
emitter.emit('error', err.body)
throw err
const vErr = new VmwareError(err)
emitter.emit('error', vErr)
throw vErr
}
}

View File

@@ -1,6 +1,6 @@
{
"name": "@vates/node-vsphere-soap",
"version": "2.0.0",
"version": "2.1.3",
"description": "interface to vSphere SOAP/WSDL from node for interfacing with vCenter or ESXi, forked from node-vsphere-soap",
"main": "lib/client.mjs",
"author": "reedog117",
@@ -11,13 +11,11 @@
},
"bugs": "https://github.com/vatesfr/xen-orchestra/issues",
"dependencies": {
"axios": "^1.4.0",
"@xen-orchestra/log": "^0.7.2",
"axios": "^1.15.0",
"soap": "^1.0.0",
"soap-cookie": "^0.10.1"
},
"devDependencies": {
"test": "^3.3.0"
},
"keywords": [
"vsphere",
"vcenter",

View File

@@ -5,7 +5,7 @@
*/
import assert from 'assert'
import { describe, it } from 'test'
import { describe, it } from 'node:test'
import * as vc from '../lib/client.mjs'

View File

@@ -0,0 +1,46 @@
### `replace(value, replacement)`
> Recursively replace sensitive entries with a replacement value.
```js
import { replace } from '@vates/obfuscate'
replace({ username: 'foo', password: 'bar' }, 'obfuscated')
// → { username: 'foo', password: 'obfuscated'}
```
### `obfuscate(value)`
> Recursively replace sensitive entries with a special tag.
```js
import { obfuscate } from '@vates/obfuscate'
obfuscate({ username: 'foo', password: 'bar' })
// → {
// username: 'foo',
// password: 'obfuscated-q3oi6d9X8uenGvdLnHk2',
// }
```
### `merge(newValue, oldValue)`
> Replace entries obfuscated by `obfuscate()` in the new value by entries from the old one.
>
> This is especially useful to give an obfuscated value to a client, let them modify it, and then merge modified and unmodified values.
```js
import { obfuscate, merge } from '@vates/obfuscate'
const original = { username: 'foo', password: 'bar', token: 'baz' }
// compute an obfuscated value to send to a client
const obfuscated = obfuscate(original)
// let the client update any entries
obfuscated.token = 'qux'
// merge the updated value with the original one
merge(obfuscated, original)
// → { username: 'foo', password: 'bar', token: 'qux' }
```

1
@vates/obfuscate/.npmignore Symbolic link
View File

@@ -0,0 +1 @@
../../scripts/npmignore

View File

@@ -0,0 +1,77 @@
<!-- DO NOT EDIT MANUALLY, THIS FILE HAS BEEN GENERATED -->
# @vates/obfuscate
[![Package Version](https://badgen.net/npm/v/@vates/obfuscate)](https://npmjs.org/package/@vates/obfuscate) ![License](https://badgen.net/npm/license/@vates/obfuscate) [![PackagePhobia](https://badgen.net/bundlephobia/minzip/@vates/obfuscate)](https://bundlephobia.com/result?p=@vates/obfuscate) [![Node compatibility](https://badgen.net/npm/node/@vates/obfuscate)](https://npmjs.org/package/@vates/obfuscate)
## Install
Installation of the [npm package](https://npmjs.org/package/@vates/obfuscate):
```sh
npm install --save @vates/obfuscate
```
## Usage
### `replace(value, replacement)`
> Recursively replace sensitive entries with a replacement value.
```js
import { replace } from '@vates/obfuscate'
replace({ username: 'foo', password: 'bar' }, 'obfuscated')
// → { username: 'foo', password: 'obfuscated'}
```
### `obfuscate(value)`
> Recursively replace sensitive entries with a special tag.
```js
import { obfuscate } from '@vates/obfuscate'
obfuscate({ username: 'foo', password: 'bar' })
// → {
// username: 'foo',
// password: 'obfuscated-q3oi6d9X8uenGvdLnHk2',
// }
```
### `merge(newValue, oldValue)`
> Replace entries obfuscated by `obfuscate()` in the new value by entries from the old one.
>
> This is especially useful to give an obfuscated value to a client, let them modify it, and then merge modified and unmodified values.
```js
import { obfuscate, merge } from '@vates/obfuscate'
const original = { username: 'foo', password: 'bar', token: 'baz' }
// compute an obfuscated value to send to a client
const obfuscated = obfuscate(original)
// let the client update any entries
obfuscated.token = 'qux'
// merge the updated value with the original one
merge(obfuscated, original)
// → { username: 'foo', password: 'bar', token: 'qux' }
```
## Contributions
Contributions are _very_ welcomed, either on the documentation or on
the code.
You may:
- report any [issue](https://github.com/vatesfr/xen-orchestra/issues)
you've encountered;
- fork and create a pull request.
## License
[ISC](https://spdx.org/licenses/ISC) © [Vates SAS](https://vates.fr)

View File

@@ -1,9 +1,18 @@
import mapValues from 'lodash/mapValues.js'
'use strict'
function mapValues(object, iteratee) {
const result = {}
for (const key of Object.keys(object)) {
result[key] = iteratee(object[key], key, object)
}
return result
}
// this random value is used to obfuscate real data
const OBFUSCATED_VALUE = 'obfuscated-q3oi6d9X8uenGvdLnHk2'
exports.OBFUSCATED_VALUE = OBFUSCATED_VALUE
export const merge = (newValue, oldValue) => {
function merge(newValue, oldValue) {
if (newValue === OBFUSCATED_VALUE) {
return oldValue
}
@@ -23,14 +32,16 @@ export const merge = (newValue, oldValue) => {
const iteratee = (v, k) => merge(v, oldValue[k])
return isArray ? newValue.map(iteratee) : mapValues(newValue, iteratee)
}
exports.merge = merge
export const obfuscate = value => replace(value, OBFUSCATED_VALUE)
const obfuscate = value => replace(value, OBFUSCATED_VALUE)
exports.obfuscate = obfuscate
const SENSITIVE_PARAMS = ['token', 'passphrase', /password/i, 'encryptionKey']
const isSensitiveParam = name =>
SENSITIVE_PARAMS.some(pattern => (typeof pattern === 'string' ? pattern === name : pattern.test(name)))
export function replace(value, replacement) {
function replace(value, replacement) {
function helper(value, name) {
if (typeof value === 'string' && isSensitiveParam(name)) {
return replacement
@@ -45,3 +56,4 @@ export function replace(value, replacement) {
return helper(value)
}
exports.replace = replace

View File

@@ -0,0 +1,23 @@
{
"private": false,
"name": "@vates/obfuscate",
"homepage": "https://github.com/vatesfr/xen-orchestra/tree/master/@vates/obfuscate",
"bugs": "https://github.com/vatesfr/xen-orchestra/issues",
"repository": {
"directory": "@vates/obfuscate",
"type": "git",
"url": "https://github.com/vatesfr/xen-orchestra.git"
},
"author": {
"name": "Vates SAS",
"url": "https://vates.fr"
},
"license": "ISC",
"version": "0.1.0",
"engines": {
"node": ">=8.10"
},
"scripts": {
"postversion": "npm publish --access public"
}
}

View File

@@ -1,6 +1,6 @@
### Usual workflow
> This section presents how this library should be used to implement a classic two factor authentification.
> This section presents how this library should be used to implement a classic two factor authentication.
#### Setup

View File

@@ -18,7 +18,7 @@ npm install --save @vates/otp
### Usual workflow
> This section presents how this library should be used to implement a classic two factor authentification.
> This section presents how this library should be used to implement a classic two factor authentication.
#### Setup

View File

@@ -9,6 +9,15 @@ function assert(name, value) {
}
}
const WHITESPACES = /\s+/g
function cleanToken(otp) {
// remove whitespaces
//
// some OTP clients add whitespaces for better readability (e.g. `XXX XXX`)
// and users might be tempted to write them
return otp && otp.replace(WHITESPACES, '')
}
// https://github.com/google/google-authenticator/wiki/Key-Uri-Format
function generateUri(protocol, label, params) {
assert('label', typeof label === 'string')
@@ -64,7 +73,7 @@ export function generateHotpUri({ counter, digits, issuer, label, secret }) {
}
export async function verifyHotp(token, opts) {
return token === (await generateHotp(opts))
return cleanToken(token) === (await generateHotp(opts))
}
function totpCounter(period = 30, timestamp = Math.floor(Date.now() / 1e3)) {
@@ -85,6 +94,7 @@ export async function verifyTotp(token, { period, timestamp, window = 1, ...opts
const counter = totpCounter(period, timestamp)
const end = counter + window
opts.counter = counter - window
token = cleanToken(token)
while (opts.counter <= end) {
if (token === (await generateHotp(opts))) {
return true

View File

@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert'
import { describe, it } from 'tap/mocha'
import test from 'node:test'
import {
generateHotp,
@@ -11,6 +11,8 @@ import {
verifyTotp,
} from './index.mjs'
const { describe, it } = test
describe('generateSecret', function () {
it('generates a string of 32 chars', async function () {
const secret = generateSecret()

View File

@@ -22,7 +22,7 @@
"url": "https://vates.fr"
},
"license": "ISC",
"version": "1.0.0",
"version": "1.1.0",
"engines": {
"node": ">=15"
},
@@ -31,9 +31,6 @@
},
"scripts": {
"postversion": "npm publish --access public",
"test": "tap"
},
"devDependencies": {
"tap": "^16.3.0"
"test": "node --test"
}
}

View File

@@ -6,9 +6,11 @@ exports.parseDuration = value => {
if (typeof value === 'number') {
return value
}
const duration = ms(value)
if (duration === undefined) {
throw new TypeError(`not a valid duration: ${value}`)
if (typeof value === 'string' && value !== '') {
const duration = ms(value)
if (duration !== undefined) {
return duration
}
}
return duration
throw new TypeError(`not a valid duration: ${value}`)
}

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