diff -Nru cockpit-machines-295/build.js cockpit-machines-298/build.js --- cockpit-machines-295/build.js 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/build.js 2023-09-04 12:22:47.000000000 +0000 @@ -19,9 +19,8 @@ const esbuild = (await import(useWasm ? 'esbuild-wasm' : 'esbuild')); const production = process.env.NODE_ENV === 'production'; -const watchMode = process.env.ESBUILD_WATCH === "true" || false; // linters dominate the build time, so disable them for production builds by default, but enable in watch mode -const lint = process.env.LINT ? (process.env.LINT !== '0') : (watchMode || !production); +const lintDefault = process.env.LINT ? process.env.LINT === '0' : production; /* List of directories to use when resolving import statements */ const nodePaths = ['pkg/lib']; const outdir = 'dist'; @@ -29,6 +28,16 @@ // Obtain package name from package.json const packageJson = JSON.parse(fs.readFileSync('package.json')); +const parser = (await import('argparse')).default.ArgumentParser(); +parser.add_argument('-r', '--rsync', { help: "rsync bundles to ssh target after build", metavar: "HOST" }); +parser.add_argument('-w', '--watch', { action: 'store_true', help: "Enable watch mode", default: process.env.ESBUILD_WATCH === "true" }); +parser.add_argument('-e', '--no-eslint', { action: 'store_true', help: "Disable eslint linting", default: lintDefault }); +parser.add_argument('-s', '--no-stylelint', { action: 'store_true', help: "Disable stylelint linting", default: lintDefault }); +const args = parser.parse_args(); + +if (args.rsync) + process.env.RSYNC = args.rsync; + function notifyEndPlugin() { return { name: 'notify-end', @@ -89,12 +98,8 @@ target: ['es2020'], plugins: [ cleanPlugin(), - ...lint - ? [ - stylelintPlugin({ filter: new RegExp(cwd + '/src/.*\\.(css?|scss?)$') }), - eslintPlugin({ filter: new RegExp(cwd + '/src/.*\\.(jsx?|js?)$') }) - ] - : [], + ...args.no_stylelint ? [] : [stylelintPlugin({ filter: new RegExp(cwd + '/src/.*\\.(css?|scss?)$') })], + ...args.no_eslint ? [] : [eslintPlugin({ filter: new RegExp(cwd + '/src/.*\\.(jsx?|js?)$') })], // Esbuild will only copy assets that are explicitly imported and used // in the code. This is a problem for index.html and manifest.json which are not imported copy({ @@ -134,12 +139,12 @@ try { await context.rebuild(); } catch (e) { - if (!watchMode) + if (!args.watch) process.exit(1); // ignore errors in watch mode } -if (watchMode) { +if (args.watch) { const on_change = async path => { console.log("change detected:", path); await context.cancel(); diff -Nru cockpit-machines-295/cockpit-machines.spec cockpit-machines-298/cockpit-machines.spec --- cockpit-machines-295/cockpit-machines.spec 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/cockpit-machines.spec 2023-09-04 12:22:47.000000000 +0000 @@ -16,7 +16,7 @@ # Name: cockpit-machines -Version: 295 +Version: 298 Release: 1%{?dist} Summary: Cockpit user interface for virtual machines License: LGPL-2.1-or-later AND MIT @@ -65,15 +65,15 @@ Recommends: python3-gobject-base Suggests: (qemu-virtiofsd or virtiofsd) -Provides: bundled(npm(@babel/runtime)) = 7.22.6 +Provides: bundled(npm(@babel/runtime)) = 7.22.10 Provides: bundled(npm(@novnc/novnc)) = 1.4.0 -Provides: bundled(npm(@patternfly/patternfly)) = 5.0.0-alpha.53 +Provides: bundled(npm(@patternfly/patternfly)) = 5.0.2 Provides: bundled(npm(@patternfly/react-console)) = 5.0.0-alpha.1 -Provides: bundled(npm(@patternfly/react-core)) = 5.0.0-alpha.98 -Provides: bundled(npm(@patternfly/react-icons)) = 5.0.0-alpha.14 -Provides: bundled(npm(@patternfly/react-styles)) = 5.0.0-alpha.10 -Provides: bundled(npm(@patternfly/react-table)) = 5.0.0-alpha.100 -Provides: bundled(npm(@patternfly/react-tokens)) = 5.0.0-alpha.9 +Provides: bundled(npm(@patternfly/react-core)) = 5.0.0 +Provides: bundled(npm(@patternfly/react-icons)) = 5.0.0 +Provides: bundled(npm(@patternfly/react-styles)) = 5.0.0 +Provides: bundled(npm(@patternfly/react-table)) = 5.0.0 +Provides: bundled(npm(@patternfly/react-tokens)) = 5.0.0 Provides: bundled(npm(@spice-project/spice-html5)) = 0.2.1 Provides: bundled(npm(array-buffer-byte-length)) = 1.0.0 Provides: bundled(npm(attr-accept)) = 2.2.2 @@ -85,7 +85,7 @@ Provides: bundled(npm(es-get-iterator)) = 1.1.3 Provides: bundled(npm(file-saver)) = 1.3.8 Provides: bundled(npm(file-selector)) = 0.6.0 -Provides: bundled(npm(focus-trap)) = 7.4.1 +Provides: bundled(npm(focus-trap)) = 7.4.3 Provides: bundled(npm(for-each)) = 0.3.3 Provides: bundled(npm(function-bind)) = 1.1.1 Provides: bundled(npm(functions-have-names)) = 1.2.3 @@ -130,14 +130,14 @@ Provides: bundled(npm(react)) = 18.2.0 Provides: bundled(npm(redux-thunk)) = 2.4.2 Provides: bundled(npm(redux)) = 4.2.1 -Provides: bundled(npm(regenerator-runtime)) = 0.13.11 +Provides: bundled(npm(regenerator-runtime)) = 0.14.0 Provides: bundled(npm(regexp.prototype.flags)) = 1.5.0 Provides: bundled(npm(scheduler)) = 0.23.0 Provides: bundled(npm(side-channel)) = 1.0.4 Provides: bundled(npm(stop-iteration-iterator)) = 1.0.0 Provides: bundled(npm(tabbable)) = 6.2.0 Provides: bundled(npm(throttle-debounce)) = 5.0.0 -Provides: bundled(npm(tslib)) = 2.6.1 +Provides: bundled(npm(tslib)) = 2.6.2 Provides: bundled(npm(which-boxed-primitive)) = 1.0.2 Provides: bundled(npm(which-collection)) = 1.0.1 Provides: bundled(npm(which-typed-array)) = 1.1.11 diff -Nru cockpit-machines-295/debian/changelog cockpit-machines-298/debian/changelog --- cockpit-machines-295/debian/changelog 2023-07-28 05:36:42.000000000 +0000 +++ cockpit-machines-298/debian/changelog 2023-09-11 03:09:09.000000000 +0000 @@ -1,8 +1,28 @@ -cockpit-machines (295-1~bpo22.04.1) jammy-backports; urgency=medium +cockpit-machines (298-1~bpo22.04.1) jammy-backports; urgency=medium * No-change backport to jammy - -- Martin Pitt Fri, 28 Jul 2023 05:36:42 +0000 + -- Martin Pitt Mon, 11 Sep 2023 05:09:09 +0200 + +cockpit-machines (298-1) unstable; urgency=medium + + * New upstream bug fix release. + + -- Martin Pitt Wed, 06 Sep 2023 16:05:47 +0200 + +cockpit-machines (297-1) unstable; urgency=medium + + * New upstream bug fix release. + - Remove po/LINGUAS during package cleaning (Closes: #1043775) + + -- Martin Pitt Wed, 23 Aug 2023 13:01:23 +0200 + +cockpit-machines (296-1) unstable; urgency=medium + + * New upstream release: + - Update to PatternFly 5 + + -- Martin Pitt Wed, 09 Aug 2023 23:24:17 +0200 cockpit-machines (295-1) unstable; urgency=medium diff -Nru cockpit-machines-295/debian/rules cockpit-machines-298/debian/rules --- cockpit-machines-295/debian/rules 2023-06-17 09:18:11.000000000 +0000 +++ cockpit-machines-298/debian/rules 2023-08-23 10:59:44.000000000 +0000 @@ -5,6 +5,7 @@ override_dh_auto_clean: # don't call `make clean`, in a release dist/ is precious + rm -f po/LINGUAS override_dh_auto_test: # don't call `make check`, these are integration tests Binary files /tmp/tmprmu__0jf/CCDtjgffoL/cockpit-machines-295/dist/index.css.gz and /tmp/tmprmu__0jf/DQwhLxeFwR/cockpit-machines-298/dist/index.css.gz differ Binary files /tmp/tmprmu__0jf/CCDtjgffoL/cockpit-machines-295/dist/index.js.gz and /tmp/tmprmu__0jf/DQwhLxeFwR/cockpit-machines-298/dist/index.js.gz differ diff -Nru cockpit-machines-295/dist/index.js.LEGAL.txt cockpit-machines-298/dist/index.js.LEGAL.txt --- cockpit-machines-295/dist/index.js.LEGAL.txt 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/dist/index.js.LEGAL.txt 2023-09-04 12:22:47.000000000 +0000 @@ -55,6 +55,6 @@ focus-trap/dist/focus-trap.esm.js: /*! - * focus-trap 7.4.1 + * focus-trap 7.4.3 * @license MIT, https://github.com/focus-trap/focus-trap/blob/master/LICENSE */ Binary files /tmp/tmprmu__0jf/CCDtjgffoL/cockpit-machines-295/dist/po.es.js.gz and /tmp/tmprmu__0jf/DQwhLxeFwR/cockpit-machines-298/dist/po.es.js.gz differ Binary files /tmp/tmprmu__0jf/CCDtjgffoL/cockpit-machines-295/dist/po.fi.js.gz and /tmp/tmprmu__0jf/DQwhLxeFwR/cockpit-machines-298/dist/po.fi.js.gz differ Binary files /tmp/tmprmu__0jf/CCDtjgffoL/cockpit-machines-295/dist/po.ja.js.gz and /tmp/tmprmu__0jf/DQwhLxeFwR/cockpit-machines-298/dist/po.ja.js.gz differ Binary files /tmp/tmprmu__0jf/CCDtjgffoL/cockpit-machines-295/dist/po.zh_CN.js.gz and /tmp/tmprmu__0jf/DQwhLxeFwR/cockpit-machines-298/dist/po.zh_CN.js.gz differ diff -Nru cockpit-machines-295/.github/workflows/npm-update-pf.yml cockpit-machines-298/.github/workflows/npm-update-pf.yml --- cockpit-machines-295/.github/workflows/npm-update-pf.yml 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/.github/workflows/npm-update-pf.yml 2023-09-04 12:22:47.000000000 +0000 @@ -17,7 +17,7 @@ - name: Run npm-update bot run: | - make test/common/make-bots tools/node-modules + make tools/node-modules test/common/make-bots git config --global user.name "GitHub Workflow" git config --global user.email "cockpituous@cockpit-project.org" diff -Nru cockpit-machines-295/.github/workflows/npm-update.yml cockpit-machines-298/.github/workflows/npm-update.yml --- cockpit-machines-295/.github/workflows/npm-update.yml 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/.github/workflows/npm-update.yml 2023-09-04 12:22:47.000000000 +0000 @@ -17,7 +17,7 @@ - name: Run npm-update bot run: | - make test/common/make-bots tools/node-modules + make tools/node-modules test/common/make-bots git config --global user.name "GitHub Workflow" git config --global user.email "cockpituous@cockpit-project.org" diff -Nru cockpit-machines-295/Makefile cockpit-machines-298/Makefile --- cockpit-machines-295/Makefile 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/Makefile 2023-09-04 12:22:47.000000000 +0000 @@ -39,7 +39,7 @@ $(NULL) COCKPIT_REPO_URL = https://github.com/cockpit-project/cockpit.git -COCKPIT_REPO_COMMIT = 4693a536e3262d3254d848daed251ef385ae5017 # 296 + 30 commits +COCKPIT_REPO_COMMIT = 9a2a4d94269561ad6fce5501eece6d84ae085476 # 299 + 41 commits $(COCKPIT_REPO_FILES): $(COCKPIT_REPO_STAMP) COCKPIT_REPO_TREE = '$(strip $(COCKPIT_REPO_COMMIT))^{tree}' @@ -96,7 +96,7 @@ $(MAKE) package-lock.json && NODE_ENV=$(NODE_ENV) ./build.js watch: $(NODE_MODULES_TEST) $(COCKPIT_REPO_STAMP) - NODE_ENV=$(NODE_ENV) ESBUILD_WATCH=true ./build.js + NODE_ENV=$(NODE_ENV) ./build.js -w clean: rm -rf dist/ diff -Nru cockpit-machines-295/package.json cockpit-machines-298/package.json --- cockpit-machines-295/package.json 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/package.json 2023-09-04 12:22:47.000000000 +0000 @@ -7,7 +7,7 @@ "author": "", "license": "LGPL-2.1", "scripts": { - "watch": "ESBUILD_WATCH='true' ./build.js", + "watch": "./build.js -w", "build": "./build.js", "eslint": "eslint --ext .jsx --ext .js src/", "eslint:fix": "eslint --fix --ext .jsx --ext .js src/", @@ -18,11 +18,11 @@ "argparse": "^2.0.1", "buffer": "^6.0.3", "chrome-remote-interface": "^0.32.1", - "esbuild": "^0.18.13", + "esbuild": "^0.19.1", "esbuild-plugin-copy": "^2.0.2", "esbuild-plugin-replace": "^1.3.0", "esbuild-sass-plugin": "^2.10.0", - "esbuild-wasm": "^0.18.13", + "esbuild-wasm": "^0.19.1", "eslint": "^8.45.0", "eslint-config-standard": "^17.0.0", "eslint-config-standard-jsx": "^11.0.0", @@ -44,13 +44,13 @@ "stylelint-formatter-pretty": "^3.1.1" }, "dependencies": { - "@patternfly/patternfly": "5.0.0-alpha.53", + "@patternfly/patternfly": "5.0.2", "@patternfly/react-console": "5.0.0-alpha.1", - "@patternfly/react-core": "5.0.0-alpha.98", - "@patternfly/react-icons": "5.0.0-alpha.14", - "@patternfly/react-styles": "5.0.0-alpha.10", - "@patternfly/react-table": "5.0.0-alpha.100", - "@patternfly/react-tokens": "5.0.0-alpha.9", + "@patternfly/react-core": "5.0.0", + "@patternfly/react-icons": "5.0.0", + "@patternfly/react-styles": "5.0.0", + "@patternfly/react-table": "5.0.0", + "@patternfly/react-tokens": "5.0.0", "date-fns": "2.30.0", "deep-equal": "2.2.2", "prop-types": "15.8.1", diff -Nru cockpit-machines-295/package-lock.json cockpit-machines-298/package-lock.json --- cockpit-machines-295/package-lock.json 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/package-lock.json 2023-09-04 12:22:47.000000000 +0000 @@ -27,12 +27,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", - "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", + "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.22.5" + "@babel/highlight": "^7.22.10", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" @@ -49,22 +50,22 @@ } }, "node_modules/@babel/core": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", - "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.10.tgz", + "integrity": "sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==", "dev": true, "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.9", + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-compilation-targets": "^7.22.10", "@babel/helper-module-transforms": "^7.22.9", - "@babel/helpers": "^7.22.6", - "@babel/parser": "^7.22.7", + "@babel/helpers": "^7.22.10", + "@babel/parser": "^7.22.10", "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.8", - "@babel/types": "^7.22.5", + "@babel/traverse": "^7.22.10", + "@babel/types": "^7.22.10", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -80,13 +81,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", - "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", + "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", "dev": true, "peer": true, "dependencies": { - "@babel/types": "^7.22.5", + "@babel/types": "^7.22.10", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -109,9 +110,9 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz", - "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz", + "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", "dev": true, "peer": true, "dependencies": { @@ -123,9 +124,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-environment-visitor": { @@ -264,28 +262,28 @@ } }, "node_modules/@babel/helpers": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", - "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.10.tgz", + "integrity": "sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==", "dev": true, "peer": true, "dependencies": { "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.6", - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.22.10", + "@babel/types": "^7.22.10" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", - "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", + "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.0.0", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -293,9 +291,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", - "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz", + "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==", "dev": true, "peer": true, "bin": { @@ -358,11 +356,11 @@ } }, "node_modules/@babel/runtime": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", - "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.10.tgz", + "integrity": "sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==", "dependencies": { - "regenerator-runtime": "^0.13.11" + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" @@ -384,20 +382,20 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", - "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.10.tgz", + "integrity": "sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==", "dev": true, "peer": true, "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.7", + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.7", - "@babel/types": "^7.22.5", + "@babel/parser": "^7.22.10", + "@babel/types": "^7.22.10", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -406,9 +404,9 @@ } }, "node_modules/@babel/types": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", - "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", + "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", "dev": true, "peer": true, "dependencies": { @@ -437,9 +435,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.17.tgz", - "integrity": "sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.2.tgz", + "integrity": "sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ==", "cpu": [ "x64" ], @@ -468,18 +466,18 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", - "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.7.0.tgz", + "integrity": "sha512-+HencqxU7CFJnQb7IKtuNBqS6Yx3Tz4kOL8BJXo+JyeiBm5MEX6pO8onXDkjrkCRlfYXS1Axro15ZjVFe9YgsA==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", - "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -500,9 +498,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -527,9 +525,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", - "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz", + "integrity": "sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -584,9 +582,9 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true, "peer": true, "engines": { @@ -611,23 +609,16 @@ "peer": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", "dev": true, "peer": true, "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true, - "peer": true - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -669,9 +660,9 @@ "integrity": "sha512-kW6ALMc5BuH08e/ond/I1naYcfjc19JYMN1EdtmgjjjzPGCjW8fMtVM3MwM6q7YLRjPlQ3orEvoKMgSS7RkEVQ==" }, "node_modules/@patternfly/patternfly": { - "version": "5.0.0-alpha.53", - "resolved": "https://registry.npmjs.org/@patternfly/patternfly/-/patternfly-5.0.0-alpha.53.tgz", - "integrity": "sha512-sy9lk98PLVGjFuJ6li9uIwKc/IXXhjv8Ow0Q/MDOCFrhnj2gWLjMr4uB4d0393mAGfD1vk8KkqF+7tfEDIBjpQ==" + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@patternfly/patternfly/-/patternfly-5.0.2.tgz", + "integrity": "sha512-PB8+MLdYVgF1hIOxGmnVsZG+YHUX3RePe5W1oMS4gS00EmSgw1cobr1Qbpy/BqqS8/R9DRN4hZ2FKDT0d5tkFQ==" }, "node_modules/@patternfly/react-console": { "version": "5.0.0-alpha.1", @@ -705,14 +696,14 @@ } }, "node_modules/@patternfly/react-core": { - "version": "5.0.0-alpha.98", - "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-5.0.0-alpha.98.tgz", - "integrity": "sha512-LouTqxWPtvzK3834i1JW5kTjDoqIWnvbioZaRIJOuL3eGgBYk+ORpoa9EZ8j4r+NQWxeogMFgxzsP9Oe04xjcQ==", - "dependencies": { - "@patternfly/react-icons": "^5.0.0-alpha.14", - "@patternfly/react-styles": "^5.0.0-alpha.10", - "@patternfly/react-tokens": "^5.0.0-alpha.9", - "focus-trap": "7.4.1", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-5.0.0.tgz", + "integrity": "sha512-kewRVFhLw0Dvt8250pqrO47sVRx8E93sMGZbHQomJnZdachYeQ9STnQTP2gvOBq/GPnMei0LZLv0T99g8mPE4w==", + "dependencies": { + "@patternfly/react-icons": "^5.0.0", + "@patternfly/react-styles": "^5.0.0", + "@patternfly/react-tokens": "^5.0.0", + "focus-trap": "7.4.3", "react-dropzone": "^14.2.3", "tslib": "^2.5.0" }, @@ -722,28 +713,28 @@ } }, "node_modules/@patternfly/react-icons": { - "version": "5.0.0-alpha.14", - "resolved": "https://registry.npmjs.org/@patternfly/react-icons/-/react-icons-5.0.0-alpha.14.tgz", - "integrity": "sha512-+FXETYc+x0xKqktrcgrpxPTZgtaJ6rfpObu/qM4YGuwXkJRIu0OJaoNQTPH9QsxKAeZ+VUh9CnhOcNTRfq9plA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@patternfly/react-icons/-/react-icons-5.0.0.tgz", + "integrity": "sha512-GG5Y/UYl0h346MyDU9U650Csaq4Mxk8S6U8XC7ERk/xIrRr2RF67O2uY7zKBDMTNLYdBvPzgc2s3OMV1+d2/mg==", "peerDependencies": { "react": "^17 || ^18", "react-dom": "^17 || ^18" } }, "node_modules/@patternfly/react-styles": { - "version": "5.0.0-alpha.10", - "resolved": "https://registry.npmjs.org/@patternfly/react-styles/-/react-styles-5.0.0-alpha.10.tgz", - "integrity": "sha512-SJsLPtTKE1u6YpEAvx+zUre+u9poc/IIIKJ9dk0Jze94HtC/2kI4fhhvm2iQE5Z4rNAPrFlC4fVsvbr7skS3kg==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@patternfly/react-styles/-/react-styles-5.0.0.tgz", + "integrity": "sha512-xbSCgjx+fPrXbIzUznwTFWtJEbzVS0Wn4zrejdKJYQTY+4YcuPlFkeq2tl3syzwGsaYMpHiFwQiTaKyTvlwtuw==" }, "node_modules/@patternfly/react-table": { - "version": "5.0.0-alpha.100", - "resolved": "https://registry.npmjs.org/@patternfly/react-table/-/react-table-5.0.0-alpha.100.tgz", - "integrity": "sha512-w3phwe/O8tc5Lxy9KnIXsE5VxanyjwCPeVxWZCWOqWWeiokJoANX5dWI2RdVrDdauQGYohsmYs4+93OYhhSI8A==", - "dependencies": { - "@patternfly/react-core": "^5.0.0-alpha.98", - "@patternfly/react-icons": "^5.0.0-alpha.14", - "@patternfly/react-styles": "^5.0.0-alpha.10", - "@patternfly/react-tokens": "^5.0.0-alpha.9", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@patternfly/react-table/-/react-table-5.0.0.tgz", + "integrity": "sha512-Q3MBo9+ZmBvLJzVHxmV9f/4qQAz5Si743zVLHRwjh+tjbn/DrcbxJdT8Uxa3NGKkpvszzgi/LPeXipJOHOELug==", + "dependencies": { + "@patternfly/react-core": "^5.0.0", + "@patternfly/react-icons": "^5.0.0", + "@patternfly/react-styles": "^5.0.0", + "@patternfly/react-tokens": "^5.0.0", "lodash": "^4.17.19", "tslib": "^2.5.0" }, @@ -753,9 +744,9 @@ } }, "node_modules/@patternfly/react-tokens": { - "version": "5.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@patternfly/react-tokens/-/react-tokens-5.0.0-alpha.9.tgz", - "integrity": "sha512-8P8u9BJdQmiunZbGAlDIunlGI6D4V81YZA16z9hw5qXReWztWyF9IXXB4L6lG5+VJZEnocBpJPenNJ1n1FmiBQ==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@patternfly/react-tokens/-/react-tokens-5.0.0.tgz", + "integrity": "sha512-to2CXIZ6WTuzBcjLZ+nXi5LhnYkSIDu3RBMRZwrplmECOoUWv87CC+2T0EVxtASRtpQfikjD2PDKMsif5i0BxQ==" }, "node_modules/@spice-project/spice-html5": { "version": "0.2.1", @@ -939,6 +930,25 @@ "node": ">=8" } }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.2.tgz", + "integrity": "sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array.prototype.flat": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", @@ -1032,6 +1042,15 @@ "node": ">=8" } }, + "node_modules/asynciterator.prototype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", + "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + } + }, "node_modules/attr-accept": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz", @@ -1127,9 +1146,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.9", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", - "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", "dev": true, "funding": [ { @@ -1147,9 +1166,9 @@ ], "peer": true, "dependencies": { - "caniuse-lite": "^1.0.30001503", - "electron-to-chromium": "^1.4.431", - "node-releases": "^2.0.12", + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", "update-browserslist-db": "^1.0.11" }, "bin": { @@ -1277,9 +1296,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001517", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz", - "integrity": "sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==", + "version": "1.0.30001522", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001522.tgz", + "integrity": "sha512-TKiyTVZxJGhsTszLuzb+6vUZSjVOAhClszBr2Ta2k9IwtNBT/4dzmL6aywt0HCgEZlmwJzXJd8yNiob6HgwTRg==", "dev": true, "funding": [ { @@ -1597,9 +1616,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.471", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.471.tgz", - "integrity": "sha512-GpmGRC1vTl60w/k6YpQ18pSiqnmr0j3un//5TV1idPi6aheNfkT1Ye71tMEabWyNDO6sBMgAR+95Eb0eUUr1tA==", + "version": "1.4.498", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.498.tgz", + "integrity": "sha512-4LODxAzKGVy7CJyhhN5mebwe7U2L29P+0G+HUriHnabm0d7LSff8Yn7t+Wq+2/9ze2Fu1dhX7mww090xfv7qXQ==", "dev": true, "peer": true }, @@ -1699,6 +1718,28 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-iterator-helpers": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.13.tgz", + "integrity": "sha512-LK3VGwzvaPWobO8xzXXGRUOGw8Dcjyfk62CsY/wfHN75CwsJPbuypOYJxK6g5RyEL8YDjIWcl6jgd8foO6mmrA==", + "dev": true, + "dependencies": { + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.21.3", + "es-set-tostringtag": "^2.0.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "iterator.prototype": "^1.1.0", + "safe-array-concat": "^1.0.0" + } + }, "node_modules/es-set-tostringtag": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", @@ -1740,9 +1781,9 @@ } }, "node_modules/esbuild": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.17.tgz", - "integrity": "sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.2.tgz", + "integrity": "sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg==", "dev": true, "hasInstallScript": true, "bin": { @@ -1752,28 +1793,28 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.18.17", - "@esbuild/android-arm64": "0.18.17", - "@esbuild/android-x64": "0.18.17", - "@esbuild/darwin-arm64": "0.18.17", - "@esbuild/darwin-x64": "0.18.17", - "@esbuild/freebsd-arm64": "0.18.17", - "@esbuild/freebsd-x64": "0.18.17", - "@esbuild/linux-arm": "0.18.17", - "@esbuild/linux-arm64": "0.18.17", - "@esbuild/linux-ia32": "0.18.17", - "@esbuild/linux-loong64": "0.18.17", - "@esbuild/linux-mips64el": "0.18.17", - "@esbuild/linux-ppc64": "0.18.17", - "@esbuild/linux-riscv64": "0.18.17", - "@esbuild/linux-s390x": "0.18.17", - "@esbuild/linux-x64": "0.18.17", - "@esbuild/netbsd-x64": "0.18.17", - "@esbuild/openbsd-x64": "0.18.17", - "@esbuild/sunos-x64": "0.18.17", - "@esbuild/win32-arm64": "0.18.17", - "@esbuild/win32-ia32": "0.18.17", - "@esbuild/win32-x64": "0.18.17" + "@esbuild/android-arm": "0.19.2", + "@esbuild/android-arm64": "0.19.2", + "@esbuild/android-x64": "0.19.2", + "@esbuild/darwin-arm64": "0.19.2", + "@esbuild/darwin-x64": "0.19.2", + "@esbuild/freebsd-arm64": "0.19.2", + "@esbuild/freebsd-x64": "0.19.2", + "@esbuild/linux-arm": "0.19.2", + "@esbuild/linux-arm64": "0.19.2", + "@esbuild/linux-ia32": "0.19.2", + "@esbuild/linux-loong64": "0.19.2", + "@esbuild/linux-mips64el": "0.19.2", + "@esbuild/linux-ppc64": "0.19.2", + "@esbuild/linux-riscv64": "0.19.2", + "@esbuild/linux-s390x": "0.19.2", + "@esbuild/linux-x64": "0.19.2", + "@esbuild/netbsd-x64": "0.19.2", + "@esbuild/openbsd-x64": "0.19.2", + "@esbuild/sunos-x64": "0.19.2", + "@esbuild/win32-arm64": "0.19.2", + "@esbuild/win32-ia32": "0.19.2", + "@esbuild/win32-x64": "0.19.2" } }, "node_modules/esbuild-plugin-copy": { @@ -1871,22 +1912,22 @@ } }, "node_modules/esbuild-sass-plugin": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/esbuild-sass-plugin/-/esbuild-sass-plugin-2.10.0.tgz", - "integrity": "sha512-STv849QGT8g77RRFmroSt4VBVKjv+dypKcO4aWz8IP4G5JbRH0KC0+B8ODuzlUNu9R5MbkGcev/62RDP/JcZ2Q==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/esbuild-sass-plugin/-/esbuild-sass-plugin-2.12.0.tgz", + "integrity": "sha512-+k/5WM/Yf/Ur7ahn6XXxEPwa/lmuacLO7vrCIAJuvQapX1CiIHtlX/nc2eiMoJ6P6RvqZhKpQvIiwgYJonzHtw==", "dev": true, "dependencies": { "resolve": "^1.22.2", - "sass": "^1.63.0" + "sass": "^1.65.1" }, "peerDependencies": { - "esbuild": "^0.18.0" + "esbuild": "^0.19.1" } }, "node_modules/esbuild-wasm": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.18.17.tgz", - "integrity": "sha512-9OHGcuRzy+I8ziF9FzjfKLWAPbvi0e/metACVg9k6bK+SI4FFxeV6PcZsz8RIVaMD4YNehw+qj6UMR3+qj/EuQ==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.19.2.tgz", + "integrity": "sha512-ak2XIIJKby+Uo3Iqh8wtw4pn2uZcnfLgtcmBHIgkShpun5ZIJsFigWXp7uLt7gXk3QAOCMmv0TSsIxD5qdn+Vw==", "dev": true, "bin": { "esbuild": "bin/esbuild" @@ -1915,27 +1956,27 @@ } }, "node_modules/eslint": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz", - "integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz", + "integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.1.0", - "@eslint/js": "8.44.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "^8.47.0", "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.6.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -2047,14 +2088,14 @@ } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "dependencies": { "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { @@ -2131,26 +2172,28 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "version": "2.28.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz", + "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==", "dev": true, "dependencies": { "array-includes": "^3.1.6", + "array.prototype.findlastindex": "^1.2.2", "array.prototype.flat": "^1.3.1", "array.prototype.flatmap": "^1.3.1", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", + "eslint-module-utils": "^2.8.0", "has": "^1.0.3", - "is-core-module": "^2.11.0", + "is-core-module": "^2.13.0", "is-glob": "^4.0.3", "minimatch": "^3.1.2", + "object.fromentries": "^2.0.6", + "object.groupby": "^1.0.0", "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" + "semver": "^6.3.1", + "tsconfig-paths": "^3.14.2" }, "engines": { "node": ">=4" @@ -2211,9 +2254,9 @@ } }, "node_modules/eslint-plugin-n": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.0.1.tgz", - "integrity": "sha512-CDmHegJN0OF3L5cz5tATH84RPQm9kG+Yx39wIqIwPR2C0uhBGMWfbbOtetR83PQjjidA5aXMu+LEFw1jaSwvTA==", + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.0.2.tgz", + "integrity": "sha512-Y66uDfUNbBzypsr0kELWrIz+5skicECrLUqlWuXawNSLUq3ltGlCwu6phboYYOTSnoTdHgTLrc+5Ydo6KjzZog==", "dev": true, "peer": true, "dependencies": { @@ -2285,15 +2328,16 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.33.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.0.tgz", - "integrity": "sha512-qewL/8P34WkY8jAqdQxsiL82pDUeT7nhs8IsuXgfgnsEloKCT4miAV9N9kGtx7/KM9NH/NCGUE7Edt9iGxLXFw==", + "version": "7.33.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", + "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", "dev": true, "dependencies": { "array-includes": "^3.1.6", "array.prototype.flatmap": "^1.3.1", "array.prototype.tosorted": "^1.1.1", "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.12", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", @@ -2355,9 +2399,9 @@ } }, "node_modules/eslint-scope": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.1.tgz", - "integrity": "sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -2371,9 +2415,9 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2456,9 +2500,9 @@ } }, "node_modules/eslint/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2690,9 +2734,9 @@ "dev": true }, "node_modules/focus-trap": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.4.1.tgz", - "integrity": "sha512-rnXP5ERIjlo1gEZp7hQb4ekYqUxRuSDQeyWvxhahH3/GkWtd8h8g1C8Eu/KGpuvbUWNVeogK0kuzzrM4u2Z9jA==", + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.4.3.tgz", + "integrity": "sha512-BgSSbK4GPnS2VbtZ50VtOv1Sti6DIkj3+LkVjiWMNjLeAp1SH1UlLx3ULu/DCu4vq5R4/uvTm+zrvsMsuYmGLg==", "dependencies": { "tabbable": "^6.1.2" } @@ -3128,9 +3172,9 @@ } }, "node_modules/immutable": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.1.tgz", - "integrity": "sha512-lj9cnmB/kVS0QHsJnYKD1uo3o39nrbKxszjnqS9Fr6NB7bZzW45U6WSGBPKXDL/CvDKqDNPA4r3DoDQ8GTxo2A==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.2.tgz", + "integrity": "sha512-oGXzbEDem9OOpDWZu88jGiYCvIsLHMvGw+8OXlpsvTFvIQplQbjg1B1cvKg8f7Hoch6+NGjpPsH1Fr+Mc2D1aA==", "dev": true }, "node_modules/import-fresh": { @@ -3260,6 +3304,21 @@ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -3310,9 +3369,9 @@ } }, "node_modules/is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -3344,6 +3403,18 @@ "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -3353,6 +3424,21 @@ "node": ">=8" } }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -3566,6 +3652,19 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "node_modules/iterator.prototype": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.0.tgz", + "integrity": "sha512-rjuhAk1AJ1fssphHD0IFV6TWL40CwRZ53FrztKx43yk2v6rguBYsY4Bj1VU4HmoMmKwZUlx7mfnhDf9cOp4YTw==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.4", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "has-tostringtag": "^1.0.0", + "reflect.getprototypeof": "^1.0.3" + } + }, "node_modules/jed": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/jed/-/jed-1.1.1.tgz", @@ -3646,9 +3745,9 @@ } }, "node_modules/jsx-ast-utils": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.4.tgz", - "integrity": "sha512-fX2TVdCViod6HwKEtSWGHs57oFhVfCMwieb9PuRDgjDPh5XeqJiHFFFJCHxU5cnTc3Bu/GRL+kPiFmw8XWOfKw==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", "dev": true, "dependencies": { "array-includes": "^3.1.6", @@ -4152,6 +4251,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object.groupby": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.0.tgz", + "integrity": "sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.21.2", + "get-intrinsic": "^1.2.1" + } + }, "node_modules/object.hasown": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", @@ -4353,9 +4464,9 @@ } }, "node_modules/postcss": { - "version": "8.4.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.27.tgz", - "integrity": "sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==", + "version": "8.4.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.28.tgz", + "integrity": "sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==", "dev": true, "funding": [ { @@ -4409,9 +4520,9 @@ } }, "node_modules/postcss-scss": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.6.tgz", - "integrity": "sha512-rLDPhJY4z/i4nVFZ27j9GqLxj1pwxE80eAzUNRMXtcpipFYIeowerzBgG3yJhMtObGEXidtIgbUpQ3eLDsf5OQ==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.7.tgz", + "integrity": "sha512-xPv2GseoyXPa58Nro7M73ZntttusuCmZdeOojUFR5PZDz2BR62vfYx1w9TyOnp1+nYFowgOMipsCBhxzVkAEPw==", "dev": true, "funding": [ { @@ -4421,6 +4532,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss-scss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "engines": { @@ -4734,10 +4849,30 @@ "redux": "^4" } }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.3.tgz", + "integrity": "sha512-TTAOZpkJ2YLxl7mVHWrNo3iDMEkYlva/kgFcXndqMgbo/AZUmmavEkdXV+hXtE4P8xdyEKRzalaFqZVuwIk/Nw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.1", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "node_modules/regexp.prototype.flags": { "version": "1.5.0", @@ -4765,12 +4900,12 @@ } }, "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", "dev": true, "dependencies": { - "is-core-module": "^2.11.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -4897,9 +5032,9 @@ "dev": true }, "node_modules/sass": { - "version": "1.64.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.64.1.tgz", - "integrity": "sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ==", + "version": "1.66.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.66.1.tgz", + "integrity": "sha512-50c+zTsZOJVgFfTgwwEzkjA3/QACgdNsKueWPyAR0mRINIvLAStVQBbPg14iuqEQ74NPDbXzJARJ/O4SI1zftA==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -5349,9 +5484,9 @@ } }, "node_modules/stylelint-formatter-pretty": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/stylelint-formatter-pretty/-/stylelint-formatter-pretty-3.2.0.tgz", - "integrity": "sha512-qUGdmJIKFcNamAgkf/I0NraOxlLqclSoAmBameWNR5EsOvm0Kwy2iMYi5z9hbQhFaCZ+TWSbwHmkB6XNbJWrQw==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/stylelint-formatter-pretty/-/stylelint-formatter-pretty-3.2.1.tgz", + "integrity": "sha512-fYL7iKejFK7YxTXtWmlIauuhgCPxRbLleTm6GuKKRHzEVaNt6mqchoWdHn3IzIZngFN8GEqh4Z5HpfbyBTTCBQ==", "dev": true, "funding": [ { @@ -5616,9 +5751,9 @@ } }, "node_modules/tslib": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", - "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/type-check": { "version": "0.4.0", @@ -5780,9 +5915,9 @@ "dev": true }, "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", + "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", "dev": true }, "node_modules/validate-npm-package-license": { @@ -5823,6 +5958,32 @@ }, "funding": { "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-collection": { diff -Nru cockpit-machines-295/packaging/arch/PKGBUILD cockpit-machines-298/packaging/arch/PKGBUILD --- cockpit-machines-295/packaging/arch/PKGBUILD 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/packaging/arch/PKGBUILD 2023-09-04 12:22:47.000000000 +0000 @@ -1,5 +1,5 @@ pkgname=cockpit-machines -pkgver=295 +pkgver=298 pkgrel=1 pkgdesc='Cockpit UI for virtual machines' arch=('x86_64') @@ -7,7 +7,7 @@ license=(LGPL) depends=(cockpit libvirt-dbus) optdepends=("virt-install: create new virtual machines") -source=("cockpit-machines-295.tar.xz") +source=("cockpit-machines-298.tar.xz") sha256sums=('SKIP') package() { diff -Nru cockpit-machines-295/packaging/debian/changelog cockpit-machines-298/packaging/debian/changelog --- cockpit-machines-295/packaging/debian/changelog 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/packaging/debian/changelog 2023-09-04 12:22:47.000000000 +0000 @@ -1,4 +1,4 @@ -cockpit-machines (295-1) UNRELEASED; urgency=medium +cockpit-machines (298-1) UNRELEASED; urgency=medium * Upstream build diff -Nru cockpit-machines-295/packaging/debian/rules cockpit-machines-298/packaging/debian/rules --- cockpit-machines-295/packaging/debian/rules 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/packaging/debian/rules 2023-09-04 12:22:47.000000000 +0000 @@ -5,6 +5,7 @@ override_dh_auto_clean: # don't call `make clean`, in a release dist/ is precious + rm -f po/LINGUAS override_dh_auto_test: # don't call `make check`, these are integration tests diff -Nru cockpit-machines-295/packit.yaml cockpit-machines-298/packit.yaml --- cockpit-machines-295/packit.yaml 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/packit.yaml 2023-09-04 12:22:47.000000000 +0000 @@ -19,17 +19,17 @@ - job: copr_build trigger: pull_request targets: - - fedora-37 - fedora-38 + - fedora-39 - fedora-development - centos-stream-8 - centos-stream-9 - + - job: tests trigger: pull_request targets: - - fedora-37 - fedora-38 + - fedora-39 - fedora-development - centos-stream-8 - centos-stream-9 @@ -51,19 +51,19 @@ trigger: release dist_git_branches: - fedora-development - - fedora-37 - fedora-38 + - fedora-39 - job: koji_build trigger: commit dist_git_branches: - fedora-development - - fedora-37 - fedora-38 + - fedora-39 - job: bodhi_update trigger: commit dist_git_branches: # rawhide updates are created automatically - - fedora-37 - fedora-38 + - fedora-39 diff -Nru cockpit-machines-295/pkg/lib/cockpit-components-dialog.jsx cockpit-machines-298/pkg/lib/cockpit-components-dialog.jsx --- cockpit-machines-295/pkg/lib/cockpit-components-dialog.jsx 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/pkg/lib/cockpit-components-dialog.jsx 2023-09-04 12:22:47.000000000 +0000 @@ -209,6 +209,7 @@ * - id optional, id that is assigned to the top level dialog node, but not the backdrop * - variant: See PF4 Modal component's 'variant' property * - titleIconVariant: See PF4 Modal component's 'titleIconVariant' property + * - showClose optional, specifies if 'X' button for closing the dialog is present */ class Dialog extends React.Component { componentDidMount() { @@ -241,7 +242,7 @@ undefined} - showClose={false} + showClose={!!this.props.showClose} id={this.props.id} isOpen help={help} @@ -264,6 +265,7 @@ footer: PropTypes.element, // is effectively required, see above id: PropTypes.string, error: PropTypes.object, + showClose: PropTypes.bool, }; /* Create and show a dialog diff -Nru cockpit-machines-295/pkg/lib/cockpit-components-file-autocomplete.jsx cockpit-machines-298/pkg/lib/cockpit-components-file-autocomplete.jsx --- cockpit-machines-295/pkg/lib/cockpit-components-file-autocomplete.jsx 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/pkg/lib/cockpit-components-file-autocomplete.jsx 2023-09-04 12:22:47.000000000 +0000 @@ -34,7 +34,7 @@ isOpen: false, value: this.props.value || null, }; - this.updateFiles(props.value || '/'); + this.typeaheadInputValue = ""; this.allowFilesUpdate = true; this.updateFiles = this.updateFiles.bind(this); @@ -43,7 +43,7 @@ this.clearSelection = this.clearSelection.bind(this); this.onCreateOption = this.onCreateOption.bind(this); - this.debouncedChange = debounce(300, (value) => { + this.onPathChange = (value) => { if (!value) { this.clearSelection(); return; @@ -80,7 +80,9 @@ return this.updateFiles(parentDir + '/'); } } - }); + }; + this.debouncedChange = debounce(300, this.onPathChange); + this.onPathChange(this.state.value); } componentWillUnmount() { diff -Nru cockpit-machines-295/pkg/lib/cockpit-components-form-helper.jsx cockpit-machines-298/pkg/lib/cockpit-components-form-helper.jsx --- cockpit-machines-295/pkg/lib/cockpit-components-form-helper.jsx 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/pkg/lib/cockpit-components-form-helper.jsx 2023-09-04 12:22:47.000000000 +0000 @@ -34,7 +34,7 @@ + icon={icon}> {formHelperVariant === "error" ? helperTextInvalid : helperText} diff -Nru cockpit-machines-295/pkg/lib/cockpit-components-listing-panel.scss cockpit-machines-298/pkg/lib/cockpit-components-listing-panel.scss --- cockpit-machines-295/pkg/lib/cockpit-components-listing-panel.scss 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/pkg/lib/cockpit-components-listing-panel.scss 2023-09-04 12:22:47.000000000 +0000 @@ -18,8 +18,7 @@ order: 1; } - // FIXME: https://github.com/patternfly/patternfly-react/pull/9135 - .pf-c-tab-content { + .pf-v5-c-tab-content { order: 3; flex-basis: 100%; } diff -Nru cockpit-machines-295/pkg/lib/cockpit.js cockpit-machines-298/pkg/lib/cockpit.js --- cockpit-machines-295/pkg/lib/cockpit.js 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/pkg/lib/cockpit.js 2023-09-04 12:22:47.000000000 +0000 @@ -316,10 +316,7 @@ if (!suffix) suffix = "socket"; const window_loc = window.location.toString(); - /* this is not set by anything right now, just a client-side stub; see - * https://github.com/cockpit-project/cockpit/pull/17473 for the server-side and complete solution */ - const meta_websocket_root = document.head.querySelector("meta[name='websocket-root']"); - let _url_root = meta_websocket_root ? meta_websocket_root.content.replace(/^\/+|\/+$/g, '') : url_root; + let _url_root = url_root; if (window.mock?.url) return window.mock.url; @@ -470,17 +467,6 @@ let check_health_timer; - /* HACK: Compatibility if we're hosted by older Cockpit versions */ - try { - /* See if we should communicate via parent */ - if (!ws && window.parent !== window && window.parent.options && - window.parent.options.protocol == "cockpit1") { - ws = new ParentWebSocket(window.parent); - } - } catch (ex) { - /* permission access errors */ - } - if (!ws) { const ws_loc = calculate_url(); transport_debug("connecting to " + ws_loc); diff -Nru cockpit-machines-295/pkg/lib/dialogs.jsx cockpit-machines-298/pkg/lib/dialogs.jsx --- cockpit-machines-295/pkg/lib/dialogs.jsx 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/pkg/lib/dialogs.jsx 2023-09-04 12:22:47.000000000 +0000 @@ -107,7 +107,8 @@ const Dialogs = { show: setDialog, - close: () => setDialog(null) + close: () => setDialog(null), + isActive: () => dialog !== null }; return ( diff -Nru cockpit-machines-295/pkg/lib/DynamicListForm.jsx cockpit-machines-298/pkg/lib/DynamicListForm.jsx --- cockpit-machines-295/pkg/lib/DynamicListForm.jsx 1970-01-01 00:00:00.000000000 +0000 +++ cockpit-machines-298/pkg/lib/DynamicListForm.jsx 2023-09-04 12:22:47.000000000 +0000 @@ -0,0 +1,94 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { Button } from "@patternfly/react-core/dist/esm/components/Button"; +import { EmptyState, EmptyStateBody } from "@patternfly/react-core/dist/esm/components/EmptyState"; +import { FormFieldGroup, FormFieldGroupHeader } from "@patternfly/react-core/dist/esm/components/Form"; +import { HelperText, HelperTextItem } from "@patternfly/react-core/dist/esm/components/HelperText"; + +import './DynamicListForm.scss'; + +export class DynamicListForm extends React.Component { + constructor(props) { + super(props); + this.state = { + list: [], + }; + this.keyCounter = 0; + this.removeItem = this.removeItem.bind(this); + this.addItem = this.addItem.bind(this); + this.onItemChange = this.onItemChange.bind(this); + } + + removeItem(idx, field, value) { + this.setState(state => { + const items = state.list.concat(); + items.splice(idx, 1); + return { list: items }; + }, () => this.props.onChange(this.state.list.concat())); + } + + addItem() { + this.setState(state => { + return { list: [...state.list, Object.assign({ key: this.keyCounter++ }, this.props.default)] }; + }, () => this.props.onChange(this.state.list.concat())); + } + + onItemChange(idx, field, value) { + this.setState(state => { + const items = state.list.concat(); + items[idx][field] = value || null; + return { list: items }; + }, () => this.props.onChange(this.state.list.concat())); + } + + render () { + const { id, label, actionLabel, formclass, emptyStateString, helperText } = this.props; + const dialogValues = this.state; + return ( + {actionLabel}} + /> + } className={"dynamic-form-group " + formclass}> + { + dialogValues.list.length + ? <> + {dialogValues.list.map((item, idx) => { + return React.cloneElement(this.props.itemcomponent, { + idx, + item, + id: id + "-" + idx, + key: idx, + onChange: this.onItemChange, + removeitem: this.removeItem, + additem: this.addItem, + options: this.props.options, + itemCount: Object.keys(dialogValues.list).length, + }); + }) + } + {helperText && + + {helperText} + + } + + : + + {emptyStateString} + + + } + + ); + } +} +DynamicListForm.propTypes = { + emptyStateString: PropTypes.string.isRequired, + onChange: PropTypes.func.isRequired, + id: PropTypes.string.isRequired, + itemcomponent: PropTypes.object.isRequired, + formclass: PropTypes.string, + options: PropTypes.object, +}; diff -Nru cockpit-machines-295/pkg/lib/DynamicListForm.scss cockpit-machines-298/pkg/lib/DynamicListForm.scss --- cockpit-machines-295/pkg/lib/DynamicListForm.scss 1970-01-01 00:00:00.000000000 +0000 +++ cockpit-machines-298/pkg/lib/DynamicListForm.scss 2023-09-04 12:22:47.000000000 +0000 @@ -0,0 +1,39 @@ +@import "global-variables"; + +.dynamic-form-group { + .pf-v5-c-empty-state { + padding: 0; + } + + .pf-v5-c-form__label { + // Don't allow labels to wrap + white-space: nowrap; + } + + .remove-button-group { + // Move 'Remove' button the the end of the row + grid-column: -1; + // Move 'Remove' button to the bottom of the line so as to align with the other form fields + display: flex; + align-items: flex-end; + } + + // Set check to the same height as input widgets and vertically align + .pf-v5-c-form__group-control > .pf-v5-c-check { + // Set height to the same as inputs + // Font height is font size * line height (1rem * 1.5) + // Widgets have 5px padding, 1px border (top & bottom): (5 + 1) * 2 = 12 + // This all equals to 36px + height: calc(var(--pf-v5-global--FontSize--md) * var(--pf-v5-global--LineHeight--md) + 12px); + align-content: center; + } + + // We use FormFieldGroup PF component for the nested look and for ability to add buttons to the header + // However we want to save space and not add indent to the left so we need to override it + .pf-v5-c-form__field-group-body { + // Stretch content fully + --pf-v5-c-form__field-group-body--GridColumn: 1 / -1; + // Reduce padding at the top + --pf-v5-c-form__field-group-body--PaddingTop: var(--pf-v5-global--spacer--xs); + } +} diff -Nru cockpit-machines-295/pkg/lib/manifest2po.js cockpit-machines-298/pkg/lib/manifest2po.js --- cockpit-machines-295/pkg/lib/manifest2po.js 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/pkg/lib/manifest2po.js 2023-09-04 12:22:47.000000000 +0000 @@ -64,6 +64,8 @@ process_menu(manifest.tools); if (manifest.bridges) process_bridges(manifest.bridges); + if (manifest.docs) + process_docs(manifest.docs); } function process_keywords(keywords) { diff -Nru cockpit-machines-295/pkg/lib/pam_user_parser.js cockpit-machines-298/pkg/lib/pam_user_parser.js --- cockpit-machines-295/pkg/lib/pam_user_parser.js 1970-01-01 00:00:00.000000000 +0000 +++ cockpit-machines-298/pkg/lib/pam_user_parser.js 2023-09-04 12:22:47.000000000 +0000 @@ -0,0 +1,95 @@ +/* + * This file is part of Cockpit. + * + * Copyright (C) 2013 Red Hat, Inc. + * + * Cockpit is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * Cockpit is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Cockpit; If not, see . + */ + +function parse_passwd_content(content) { + if (!content) { + console.warn("Couldn't read /etc/passwd"); + return []; + } + + const ret = []; + const lines = content.split('\n'); + + for (let i = 0; i < lines.length; i++) { + if (!lines[i]) + continue; + const column = lines[i].split(':'); + ret.push({ + name: column[0], + password: column[1], + uid: parseInt(column[2], 10), + gid: parseInt(column[3], 10), + gecos: (column[4] || '').replace(/,*$/, ''), + home: column[5] || '', + shell: column[6] || '', + }); + } + + return ret; +} + +export const etc_passwd_syntax = { + parse: parse_passwd_content +}; + +function parse_group_content(content) { + // /etc/group file is used to set only secondary groups of users. The primary group is saved in /etc/passwd- + content = (content || "").trim(); + if (!content) { + console.warn("Couldn't read /etc/group"); + return []; + } + + const ret = []; + const lines = content.split('\n'); + + for (let i = 0; i < lines.length; i++) { + if (!lines[i]) + continue; + const column = lines[i].split(':'); + ret.push({ + name: column[0], + password: column[1], + gid: parseInt(column[2], 10), + userlist: column[3].split(','), + }); + } + + return ret; +} + +export const etc_group_syntax = { + parse: parse_group_content +}; + +function parse_shells_content(content) { + content = (content || "").trim(); + if (!content) { + console.warn("Couldn't read /etc/shells"); + return []; + } + + const lines = content.split('\n'); + + return lines.filter(line => !line.includes("#") && line.trim()); +} + +export const etc_shells_syntax = { + parse: parse_shells_content +}; diff -Nru cockpit-machines-295/pkg/lib/patternfly/patternfly-5-overrides.scss cockpit-machines-298/pkg/lib/patternfly/patternfly-5-overrides.scss --- cockpit-machines-295/pkg/lib/patternfly/patternfly-5-overrides.scss 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/pkg/lib/patternfly/patternfly-5-overrides.scss 2023-09-04 12:22:47.000000000 +0000 @@ -1,32 +1,13 @@ -/*** PF4 overrides ***/ +/*** PF5 overrides ***/ // Pull in variables (for breakpoints) @use "global-variables" as *; -// https://github.com/patternfly/patternfly-react/pull/8953 -.pf-v5-c-input-group__text { - padding-inline: var(--pf-v5-global--spacer--sm); -} - // PF Select is deprecated - no issue reported upstream - this needs to be removed from our codebase // Make select have the expected width .pf-v5-c-select[data-popper-reference-hidden="false"] { inline-size: auto; } -// https://github.com/patternfly/patternfly/issues/5501 -.pf-v5-theme-dark { - .pf-v5-c-alert.pf-m-custom { - --pf-v5-c-alert--BackgroundColor: var(--pf-v5-global--palette--black-600); - --pf-v5-c-alert__title--Color: var(--pf-v5-global--custom-color--200); - } -} - -// https://github.com/patternfly/patternfly-react/issues/8993 -.pf-v5-c-about-modal-box__close { - --pf-v5-c-about-modal-box__close--c-button--BackgroundColor: var(--pf-v5-global--BackgroundColor--dark-200); - --pf-v5-c-about-modal-box__close--c-button--hover--BackgroundColor: var(--pf-v5-global--BackgroundColor--dark-400); -} - /* WORKAROUND: Navigation problems with Tertiary Nav widget on mobile */ /* See: https://github.com/patternfly/patternfly-design/issues/840 */ /* Helper mod to wrap pf-v5-c-nav__tertiary */ @@ -195,8 +176,15 @@ // Flex should use gap, not a margin hack // https://github.com/patternfly/patternfly/issues/4523 +// Override default spacing from lg -> md .pf-v5-l-flex { gap: var(--pf-v5-l-flex--spacer-base); + &:not([class*="pf-m-space-items-"]) { + > * { + --pf-v5-l-flex--spacer--column: 0; + } + gap: var(--pf-v5-l-flex--spacer--md); + } // Negate the margin hack used by immediate flex children // (except for nested flex, as we want to mind the gap) @@ -207,7 +195,7 @@ // Undo all spacer modification adjustments &[class*="pf-m-space-items-"] { > * { - --pf-v5-l-flex--spacer: 0; + --pf-v5-l-flex--spacer--column: 0; } } @@ -220,6 +208,39 @@ } } +// backported from https://github.com/patternfly/patternfly/pull/5788, fixed in 5.1.0-prerelease.4 +.pf-v5-c-radio { + display: grid; + width: unset; +} + +// Realign the radio and checks: https://github.com/patternfly/patternfly/issues/5802 +.pf-v5-c-radio, +.pf-v5-c-check { + // `baseline` is different in Firefox than Chrome & WebKit; use `normal` + align-items: normal; + + // Remove incorrect PF settings on the children + &__label, + &__input { + margin-block: auto; + align-self: unset; + -moz-transform: unset; + } + + // Slightly shift the radio and check widgets + &__input { + // Shift up the checks/radios for (most) browsers + transform: translateY(-1px); + // Mozilla doesn't need the translation, so undo it + -moz-transform: none; + // If the size is not specified, browsers may size it between 12px - 16px; so let's set it to the font size (which winds up 16px) + height: var(--pf-v5-global--FontSize--md); + // Use the height for width too + aspect-ratio: 1; + } +} + // InputMenus now use the PF Panel component which mistakenly uses position: // relative, when it needs to be set to absolute. // Additionally, it needs to be full width to properly align to the widget the @@ -292,16 +313,6 @@ } } - // PatternFly doesn't define gold color in dark mode - .pf-v5-c-label { - --pf-v5-c-label--m-gold--BackgroundColor: var(--pf-v5-global--BackgroundColor--300); - --pf-v5-c-label--m-gold__content--Color: var(--pf-v5-global--palette--gold-100); - - &.pf-m-gold { - --pf-v5-c-label__content--Color: var(--pf-v5-c-label--m-gold__content--Color); - } - } - // FIXME: https://github.com/patternfly/patternfly/issues/5278 .pf-v5-c-modal-box .pf-v5-c-table { background-color: inherit; @@ -575,3 +586,13 @@ font-weight: 700; src: url(data:font/woff2;base64,d09GMgABAAAAAASEAAsAAAAADlwAAAQ2AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmAAgkIRCAqBFIEsCwwAATYCJAMUBCAFlSEHIBukDRGVnM0Bfh7YtpMt1pMMwRCUu0ZjuTUEq7QbeQVD9K0cz/Ot8btvZnf/YKZJNFnHE01D/RnzSKWKhUyUChVONznY33vvR2dGwQ2aI5GoNmehLcEOiWwABJeyW3OVmVcm8ohUq47RZ7FbwPRAePVny2WpHmHbKIFFSYTiZgv0eNbhCK663oXEgZAouis1niAM8d0RrIJ/++6lfvsW4tlZz+XCcgddeYS86ClXUGEcuZ9pztoaHSVD7Uom1PoYXN4HzmM1HDvo8UJstrl+/duh/ooIdyFfyySwWFBRMV/ALlUwX2cxOp1g8////ez/7wTIYNOHFBRPpuM3UT2dduT/fwTQg7HosBaHAOMBUJSJ41s7f/UIRt8fohuPkYqTk0DjIYx+wDSdIBXHF4dHTScnx41XjWvbCeXg09bl7Kq2spLoZndx7KxpLys+bE+xPzlSvtEU9Kdaw+XrzSFfCjx7S7xYdVVkdxPPNt0V6Tn3pXNM35O5+5Lj8TVY8f+1pJQVQcrNGpprY9Ik7deGqZ/h49BxJ+DT3euFXl45vWgKCHjCmw1FF5wzw5Or//U/Ro5RHsGeErZC0JurgIII9gFYngkI4ITnAmJa5AKKIccFVEvTCwGdufkT0JtQdggYzCr5AkacqAYBzaT6BgLGmFS/CBjrdk8VMM7s/k7AeDMHpoAJbo+kCZhoXuMJmGx828MUE9q1+VPNbbuqdGPwlM8QK4OHYnwOQ3UoSdDZnlXozS1EGGwsFhjxtDRBs7B2yceo12BsltZPGGdzPw7jre+/YEKWDgaYaOfIK0w2u7lgirlNLucvmGpSt7lM7qfkWAGGRgZGhtBDQEM3moI2CEMXpUxIkxiaqrFAplRBDQHGchVPX5/lsEBN6JEyib5sun/VmWE4kkNiintWMinWBKkq1j5mPQKNN61wQ1xoZ4PJlTQWfjfEOg5qkYlI9NKWD4LKvsIBWNs3wdfAg/b9JD/GK04tASqxsZdO7i0AsMW2oxcemJdGiAQY6v2hj4/5jub2DnznuBqjbimBQcMNRmM/O3D5FqNuVZcqy4v1JSg8sy8eXD/7opUqTiaFNzdUr4ltdQWPsnLjOwlH+QU1zSZWiSQ6EEejweUpky0p6SA48swT/xBwKuiT9El+l5vYD1LSkIqGHupwVyFgqz9rKPLSzaGjvds6iLOcPkV66UGKvJMJY/hKQzuzbm7RfuSNODEixDT0CVekwI2Yun7uzTyIAlGRSAvNsUrPEhHr4Wac1Xe2cgCFYQwS3sbkcQPzJRV0vfftYZIvhIHN7j0prlgOThTI+EtwCbhkFD29IrGHWGFLMysqF5fCO59XB/DG+Xle3pOQIjH2k9PYLoHSvy+RUVwIR/xlEFc+BxEXVNQ/eHIo4f1HsH/OR5zIVm52mVCpjKZqyJHY+j1zNf8f/y+v5iopAAAAAA==); } + +// Fix for https://github.com/patternfly/patternfly/issues/5855 +.pf-v5-u-font-weight-light { + font-weight: 300; +} + +// Workaround for https://github.com/patternfly/patternfly/issues/5865 +.pf-v5-c-card.pf-m-selectable, .pf-v5-c-card.pf-m-clickable { + isolation: auto; +} diff -Nru cockpit-machines-295/pkg/lib/serverTime.js cockpit-machines-298/pkg/lib/serverTime.js --- cockpit-machines-295/pkg/lib/serverTime.js 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/pkg/lib/serverTime.js 2023-09-04 12:22:47.000000000 +0000 @@ -112,7 +112,7 @@ self.update = function update() { return cockpit.spawn(["date", "+%s:%z"], { err: "message" }) - .done(function(data) { + .then(data => { const parts = data.trim().split(":"); const timems = parseInt(parts[0], 10) * 1000; let tzmin = parseInt(parts[1].slice(-2), 10); @@ -125,34 +125,17 @@ remote_offset = offsetms; emit_changed(); }) - .fail(function(ex) { - console.log("Couldn't calculate server time offset: " + cockpit.message(ex)); - }); + .catch(ex => console.log("Couldn't calculate server time offset: " + cockpit.message(ex))); }; - self.change_time = function change_time(datestr, timestr) { - return new Promise((resolve, reject) => { - /* - * There is no way to make sense of this date without a round trip to the - * server, as the timezone is really server specific. - */ - cockpit.spawn(["date", "--date=" + datestr + " " + timestr, "+%s"]) - .fail(function(ex) { - reject(ex); - }) - .done(function(data) { - const seconds = parseInt(data.trim(), 10); - timedate.call('SetTime', [seconds * 1000 * 1000, false, true]) - .fail(function(ex) { - reject(ex); - }) - .done(function() { - self.update(); - resolve(); - }); - }); - }); - }; + /* There is no way to make sense of this date without a round trip to the + * server, as the timezone is really server specific. */ + self.change_time = (datestr, timestr) => cockpit.spawn(["date", "--date=" + datestr + " " + timestr, "+%s"]) + .then(data => { + const seconds = parseInt(data.trim(), 10); + return timedate.call('SetTime', [seconds * 1000 * 1000, false, true]) + .then(self.update); + }); self.bump_time = function (millis) { return timedate.call('SetTime', [millis, true, true]); @@ -166,21 +149,19 @@ return timedate.call('SetTimezone', [tz, true]); }; - self.poll_ntp_synchronized = function poll_ntp_synchronized() { - client.call(timedate.path, - "org.freedesktop.DBus.Properties", "Get", ["org.freedesktop.timedate1", "NTPSynchronized"]) - .fail(function(error) { - if (error.name != "org.freedesktop.DBus.Error.UnknownProperty" && + self.poll_ntp_synchronized = () => client.call( + timedate.path, "org.freedesktop.DBus.Properties", "Get", ["org.freedesktop.timedate1", "NTPSynchronized"]) + .then(result => { + const ifaces = { "org.freedesktop.timedate1": { NTPSynchronized: result[0].v } }; + const data = { }; + data[timedate.path] = ifaces; + client.notify(data); + }) + .catch(error => { + if (error.name != "org.freedesktop.DBus.Error.UnknownProperty" && error.problem != "not-found") - console.log("can't get NTPSynchronized property", error); - }) - .done(function(result) { - const ifaces = { "org.freedesktop.timedate1": { NTPSynchronized: result[0].v } }; - const data = { }; - data[timedate.path] = ifaces; - client.notify(data); - }); - }; + console.log("can't get NTPSynchronized property", error); + }); let ntp_waiting_value = null; let ntp_waiting_resolve = null; @@ -201,7 +182,7 @@ ntp_waiting_value = val; client.call(timedate.path, "org.freedesktop.DBus.Properties", "Get", ["org.freedesktop.timedate1", "NTP"]) - .done(function(result) { + .then(result => { // Check if don't want to enable enabled or disable disabled if (result[0].v === val) { ntp_waiting_resolve(); diff -Nru cockpit-machines-295/pkg/lib/table.css cockpit-machines-298/pkg/lib/table.css --- cockpit-machines-295/pkg/lib/table.css 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/pkg/lib/table.css 2023-09-04 12:22:47.000000000 +0000 @@ -106,19 +106,9 @@ } } -/* - * Fix up table row hovering. - * - * When you hover over table rows it's because they're clickable. - */ -.table-hover > tbody > tr > td, -.table-hover > tbody > tr > th { - cursor: pointer; -} - -.table-hover > tbody > tr:hover > td, -.table-hover > tbody > tr:hover > th { - /* PF3 uses a light blue; we have to force the override for hover colors */ +.pf-v5-c-table__tr.pf-m-clickable:hover > td, +.pf-v5-c-table__tr.pf-m-clickable:hover > th { + /* PF5 has no hover background color; we have to force the override for hover colors */ background-color: var(--ct-color-list-hover-bg) !important; color: var(--ct-color-list-hover-text) !important; } diff -Nru cockpit-machines-295/plans/all.fmf cockpit-machines-298/plans/all.fmf --- cockpit-machines-295/plans/all.fmf 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/plans/all.fmf 2023-09-04 12:22:47.000000000 +0000 @@ -3,6 +3,10 @@ execute: how: tmt +# Let's handle them upstream only, don't break Fedora/RHEL reverse dependency gating +environment: + TEST_AUDIT_NO_SELINUX: 1 + /basic: summary: Run basic tests (creation and lifetime) discover+: diff -Nru cockpit-machines-295/po/cs.po cockpit-machines-298/po/cs.po --- cockpit-machines-295/po/cs.po 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/po/cs.po 2023-09-04 12:22:47.000000000 +0000 @@ -12,7 +12,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-18 03:14+0000\n" +"POT-Creation-Date: 2023-09-05 02:50+0000\n" "PO-Revision-Date: 2023-07-03 11:37+0000\n" "Last-Translator: Pavel Borecki \n" "Language-Team: Czech \n" "Language-Team: German \n" "Language-Team: Spanish \n" @@ -33,7 +33,7 @@ "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1\n" -"X-Generator: Weblate 4.17\n" +"X-Generator: Weblate 4.18.2\n" #: src/components/create-vm-dialog/createVmDialog.jsx:827 msgid "$0 $1 available at default location" @@ -82,8 +82,8 @@ msgid "$0 network" msgstr "$0 Red" -#: src/components/vm/overview/vmOverviewCard.jsx:145 #: src/components/vm/vmUsageCard.jsx:47 +#: src/components/vm/overview/vmOverviewCard.jsx:145 msgid "$0 vCPU" msgid_plural "$0 vCPUs" msgstr[0] "$0 vCPU" @@ -102,8 +102,8 @@ "Mientras tanto, el anfitrión de origen mantiene su copia de la configuración " "de la MV." -#: src/components/vm/disks/vmDisksCard.jsx:188 #: src/components/vm/disks/diskEdit.jsx:115 +#: src/components/vm/disks/vmDisksCard.jsx:188 msgid "Access" msgstr "Acceso" @@ -120,12 +120,12 @@ msgid "Activate the storage pool to administer volumes" msgstr "Activar el grupo de almacenamiento para administrar volúmenes" +#: src/components/networks/networkOverviewTab.jsx:236 #: src/components/vm/disks/diskAdd.jsx:863 -#: src/components/vm/overview/vsock.jsx:196 -#: src/components/vm/overview/watchdog.jsx:154 #: src/components/vm/nics/nicAdd.jsx:213 #: src/components/vm/hostdevs/hostDevAdd.jsx:229 -#: src/components/networks/networkOverviewTab.jsx:236 +#: src/components/vm/overview/watchdog.jsx:154 +#: src/components/vm/overview/vsock.jsx:196 msgid "Add" msgstr "Añadir" @@ -135,13 +135,13 @@ # auto translated by TM merge from project: Cockpit, version: rhel-8.0, DocId: # cockpit -#: src/components/vm/disks/vmDisksCard.jsx:75 #: src/components/vm/disks/diskAdd.jsx:853 +#: src/components/vm/disks/vmDisksCard.jsx:75 msgid "Add disk" msgstr "Añadir disco" -#: src/components/vm/hostdevs/hostDevAdd.jsx:244 #: src/components/vm/hostdevs/hostDevCard.jsx:148 +#: src/components/vm/hostdevs/hostDevAdd.jsx:244 msgid "Add host device" msgstr "Añadir dispositivo del anfitrión" @@ -163,7 +163,7 @@ #: src/components/vm/overview/watchdog.jsx:172 msgid "Add watchdog device type" -msgstr "Añadir tipo de dispositivo watchdog" +msgstr "Añadir dispositivo de tipo watchdog" #: src/components/vm/overview/watchdog.jsx:105 msgid "Adding a watchdog will require a reboot to take effect." @@ -182,10 +182,10 @@ msgid "Additional" msgstr "Adicional" -#: src/components/vm/nics/vmNicsCard.jsx:154 -#: src/components/vm/consoles/desktopConsole.jsx:47 #: src/components/networks/networkOverviewTab.jsx:142 #: src/components/networks/networkOverviewTab.jsx:162 +#: src/components/vm/nics/vmNicsCard.jsx:154 +#: src/components/vm/consoles/desktopConsole.jsx:47 msgid "Address" msgstr "Dirección" @@ -216,7 +216,7 @@ "Caracteres permitidos: alfabeto latino básico, números, y puntuación " "limitada (-, _, +, .)" -#: src/components/storagePools/storagePoolDelete.jsx:176 +#: src/components/storagePools/storagePoolDelete.jsx:175 msgid "Also delete all volumes inside this pool:" msgstr "Eliminar también todos los volúmenes dentro de este grupo:" @@ -257,8 +257,8 @@ msgstr "Automatización" #: src/components/storagePools/storagePoolOverviewTab.jsx:71 -#: src/components/vm/overview/vmOverviewCard.jsx:200 #: src/components/networks/networkOverviewTab.jsx:119 +#: src/components/vm/overview/vmOverviewCard.jsx:200 msgid "Autostart" msgstr "Inicio automático" @@ -274,18 +274,18 @@ msgid "Boot order settings could not be saved" msgstr "La configuración del orden de arranque no se pudo guardar" -#: src/components/vm/disks/vmDisksCard.jsx:186 -#: src/components/vm/disks/diskAdd.jsx:227 #: src/components/vm/disks/diskEdit.jsx:90 +#: src/components/vm/disks/diskAdd.jsx:227 +#: src/components/vm/disks/vmDisksCard.jsx:186 +#: src/components/vm/hostdevs/hostDevCard.jsx:99 +#: src/components/vm/hostdevs/hostDevCard.jsx:107 +#: src/components/vm/hostdevs/hostDevCard.jsx:247 +#: src/components/vm/hostdevs/hostDevAdd.jsx:89 #: src/components/vm/overview/bootOrder.jsx:105 #: src/components/vm/overview/bootOrder.jsx:117 #: src/components/vm/overview/bootOrder.jsx:135 #: src/components/vm/overview/bootOrder.jsx:138 #: src/components/vm/overview/bootOrder.jsx:152 -#: src/components/vm/hostdevs/hostDevAdd.jsx:89 -#: src/components/vm/hostdevs/hostDevCard.jsx:99 -#: src/components/vm/hostdevs/hostDevCard.jsx:107 -#: src/components/vm/hostdevs/hostDevCard.jsx:247 msgid "Bus" msgstr "Bus" @@ -293,9 +293,9 @@ msgid "CD/DVD disc" msgstr "Disco CD/DVD" -#: src/components/common/needsShutdown.jsx:110 -#: src/components/vm/overview/vmOverviewCard.jsx:187 #: src/components/vm/vmUsageCard.jsx:69 +#: src/components/vm/overview/vmOverviewCard.jsx:187 +#: src/components/common/needsShutdown.jsx:110 msgid "CPU" msgstr "CPU" @@ -303,50 +303,48 @@ msgid "CPU mode could not be saved" msgstr "No se pudo guardar el modo de la CPU" +#: src/components/vm/disks/diskEdit.jsx:60 #: src/components/vm/disks/vmDiskColumns.jsx:101 #: src/components/vm/disks/diskAdd.jsx:216 -#: src/components/vm/disks/diskEdit.jsx:60 msgid "Cache" msgstr "Antememoria" #: src/components/create-vm-dialog/createVmDialog.jsx:1392 -#: src/components/common/deleteResource.jsx:91 -#: src/components/storagePools/storagePoolDelete.jsx:206 -#: src/components/storagePools/createStoragePoolDialog.jsx:443 #: src/components/storagePools/storageVolumeCreate.jsx:110 +#: src/components/storagePools/createStoragePoolDialog.jsx:443 +#: src/components/storagePools/storagePoolDelete.jsx:205 +#: src/components/networks/createNetworkDialog.jsx:421 +#: src/components/networks/networkOverviewTab.jsx:239 +#: src/components/vm/filesystems/vmFilesystemsCard.jsx:174 #: src/components/vm/vmCloneDialog.jsx:83 -#: src/components/vm/disks/mediaEject.jsx:110 -#: src/components/vm/disks/diskAdd.jsx:866 +#: src/components/vm/snapshots/vmSnapshotsRevertModal.jsx:102 +#: src/components/vm/snapshots/vmSnapshotsCreateModal.jsx:147 #: src/components/vm/disks/diskEdit.jsx:270 -#: src/components/vm/overview/bootOrder.jsx:318 -#: src/components/vm/overview/vsock.jsx:244 -#: src/components/vm/overview/watchdog.jsx:194 -#: src/components/vm/overview/memoryModal.jsx:159 -#: src/components/vm/overview/cpuModal.jsx:338 -#: src/components/vm/overview/firmware.jsx:72 -#: src/components/vm/confirmDialog.jsx:54 -#: src/components/vm/filesystems/vmFilesystemsCard.jsx:174 +#: src/components/vm/disks/diskAdd.jsx:866 +#: src/components/vm/disks/mediaEject.jsx:110 #: src/components/vm/vmRenameDialog.jsx:71 #: src/components/vm/deleteDialog.jsx:174 -#: src/components/vm/snapshots/vmSnapshotsCreateModal.jsx:147 -#: src/components/vm/snapshots/vmSnapshotsRevertModal.jsx:102 -#: src/components/vm/vmMigrateDialog.jsx:213 #: src/components/vm/nics/nicEdit.jsx:185 src/components/vm/nics/nicAdd.jsx:216 +#: src/components/vm/confirmDialog.jsx:54 #: src/components/vm/hostdevs/hostDevAdd.jsx:234 -#: src/components/networks/createNetworkDialog.jsx:419 -#: src/components/networks/networkOverviewTab.jsx:239 +#: src/components/vm/vmMigrateDialog.jsx:213 +#: src/components/vm/overview/firmware.jsx:72 +#: src/components/vm/overview/watchdog.jsx:194 +#: src/components/vm/overview/memoryModal.jsx:159 +#: src/components/vm/overview/bootOrder.jsx:318 +#: src/components/vm/overview/vsock.jsx:244 +#: src/components/vm/overview/cpuModal.jsx:338 +#: src/components/common/deleteResource.jsx:91 msgid "Cancel" msgstr "Cancelar" #: src/components/vm/overview/vsock.jsx:203 msgid "Cannot edit vsock device on a transient VM" -msgstr "" +msgstr "No se puede editar el dispositivo vsock en una MV temporal" #: src/components/vm/overview/watchdog.jsx:161 -#, fuzzy -#| msgid "Edit watchdog device type" msgid "Cannot edit watchdog device on a transient VM" -msgstr "Editar tipo de dispositivo watchdog" +msgstr "No se puede editar el dispositivo watchdog en una MV temporal" #: src/components/vm/disks/vmDisksCard.jsx:184 msgid "Capacity" @@ -434,12 +432,12 @@ msgid "Connecting" msgstr "Conectando" -#: src/components/common/machinesConnectionSelector.jsx:39 #: src/components/storagePools/storagePoolList.jsx:70 -#: src/components/vms/hostvmslist.jsx:145 -#: src/components/vm/overview/vmOverviewCard.jsx:163 -#: src/components/networks/networkList.jsx:69 #: src/components/networks/createNetworkDialog.jsx:41 +#: src/components/networks/networkList.jsx:69 +#: src/components/vm/overview/vmOverviewCard.jsx:163 +#: src/components/common/machinesConnectionSelector.jsx:39 +#: src/components/vms/hostvmslist.jsx:145 msgid "Connection" msgstr "Conexión" @@ -483,10 +481,10 @@ msgid "Crashed" msgstr "Colgado" -#: src/components/storagePools/createStoragePoolDialog.jsx:440 #: src/components/storagePools/storageVolumeCreate.jsx:107 +#: src/components/storagePools/createStoragePoolDialog.jsx:440 +#: src/components/networks/createNetworkDialog.jsx:418 #: src/components/vm/snapshots/vmSnapshotsCreateModal.jsx:144 -#: src/components/networks/createNetworkDialog.jsx:416 msgid "Create" msgstr "Crear" @@ -552,8 +550,8 @@ msgid "Create storage volume" msgstr "Crear un volumen de almacenamiento" -#: src/components/networks/createNetworkDialog.jsx:409 -#: src/components/networks/createNetworkDialog.jsx:437 +#: src/components/networks/createNetworkDialog.jsx:411 +#: src/components/networks/createNetworkDialog.jsx:439 msgid "Create virtual network" msgstr "Crear una red virtual" @@ -613,15 +611,16 @@ msgid "Deactivate" msgstr "Desactivar" +#: src/components/storagePools/storagePoolDelete.jsx:202 +#: src/components/storagePools/storagePoolDelete.jsx:238 +#: src/components/storagePools/storagePoolDelete.jsx:248 +#: src/components/networks/network.jsx:150 +#: src/components/networks/network.jsx:153 +#: src/components/vm/deleteDialog.jsx:171 src/components/vm/vmActions.jsx:451 +#: src/components/vm/vmActions.jsx:459 #: src/components/common/deleteResource.jsx:79 #: src/components/common/deleteResource.jsx:133 #: src/components/common/deleteResource.jsx:144 -#: src/components/storagePools/storagePoolDelete.jsx:203 -#: src/components/storagePools/storagePoolDelete.jsx:239 -#: src/components/storagePools/storagePoolDelete.jsx:249 -#: src/components/vm/deleteDialog.jsx:171 src/components/vm/vmActions.jsx:451 -#: src/components/vm/vmActions.jsx:459 src/components/networks/network.jsx:150 -#: src/components/networks/network.jsx:153 msgid "Delete" msgstr "Eliminar" @@ -629,7 +628,7 @@ msgid "Delete $0 VM?" msgstr "¿Eliminar la MV $0?" -#: src/components/storagePools/storagePoolDelete.jsx:195 +#: src/components/storagePools/storagePoolDelete.jsx:194 msgid "Delete $0 storage pool?" msgstr "¿Eliminar el grupo de almacenamiento $0?" @@ -651,7 +650,7 @@ msgid "Delete snapshot?" msgstr "¿Eliminar la instantánea?" -#: src/components/storagePools/storagePoolDelete.jsx:186 +#: src/components/storagePools/storagePoolDelete.jsx:185 msgid "" "Deleting an inactive storage pool will only undefine the pool. Its content " "will not be deleted." @@ -692,19 +691,19 @@ msgid "Details" msgstr "Detalles" +#: src/components/networks/createNetworkDialog.jsx:160 +#: src/components/networks/networkList.jsx:68 #: src/components/vm/disks/vmDiskColumns.jsx:40 -#: src/components/vm/disks/vmDisksCard.jsx:172 #: src/components/vm/disks/diskAdd.jsx:354 +#: src/components/vm/disks/vmDisksCard.jsx:172 +#: src/components/vm/hostdevs/hostDevCard.jsx:98 +#: src/components/vm/hostdevs/hostDevCard.jsx:246 +#: src/components/vm/hostdevs/hostDevAdd.jsx:88 +#: src/components/vm/hostdevs/hostDevAdd.jsx:123 #: src/components/vm/overview/bootOrder.jsx:97 #: src/components/vm/overview/bootOrder.jsx:104 #: src/components/vm/overview/bootOrder.jsx:136 #: src/components/vm/overview/bootOrder.jsx:139 -#: src/components/vm/hostdevs/hostDevAdd.jsx:88 -#: src/components/vm/hostdevs/hostDevAdd.jsx:123 -#: src/components/vm/hostdevs/hostDevCard.jsx:98 -#: src/components/vm/hostdevs/hostDevCard.jsx:246 -#: src/components/networks/networkList.jsx:68 -#: src/components/networks/createNetworkDialog.jsx:160 msgid "Device" msgstr "Dispositivo" @@ -712,8 +711,8 @@ msgid "Devices" msgstr "Dispositivos" -#: src/components/vm/consoles/serialConsole.jsx:94 #: src/components/vm/consoles/vnc.jsx:170 +#: src/components/vm/consoles/serialConsole.jsx:94 msgid "Disconnect" msgstr "Desconectar" @@ -764,8 +763,8 @@ msgstr "" "Las imágenes de disco se pueden almacenar en la carpeta personal del usuario" -#: src/components/vm/disks/diskAdd.jsx:716 #: src/components/vm/disks/diskEdit.jsx:218 +#: src/components/vm/disks/diskAdd.jsx:716 msgid "Disk settings could not be saved" msgstr "Las configuraciones del disco no se pudieron guardar" @@ -830,7 +829,7 @@ msgstr "Muriendo" #: src/components/vm/disks/diskEdit.jsx:166 -#: src/components/vm/nics/vmNicsCard.jsx:430 +#: src/components/vm/nics/vmNicsCard.jsx:453 msgid "Edit" msgstr "Editar" @@ -846,12 +845,12 @@ msgid "Edit watchdog device type" msgstr "Editar tipo de dispositivo watchdog" -#: src/components/vm/nics/vmNicsCard.jsx:418 +#: src/components/vm/nics/vmNicsCard.jsx:441 msgid "Editing network interfaces of transient guests is not allowed" msgstr "" "Editar las interfaces de red de los huéspedes transitorios no está permitido" -#: src/components/vm/nics/vmNicsCard.jsx:424 +#: src/components/vm/nics/vmNicsCard.jsx:447 msgid "Editing transient network interfaces is not allowed" msgstr "Editar la interfaces de red transitorias no está permitido" @@ -874,7 +873,7 @@ msgid "Enable virtualization support in BIOS/EFI settings." msgstr "Habilite el soporte de virtualización en la configuración de BIOS/EFI." -#: src/components/networks/createNetworkDialog.jsx:224 +#: src/components/networks/createNetworkDialog.jsx:226 msgid "End" msgstr "Terminar" @@ -998,10 +997,8 @@ msgstr "Forzar el reinicio" #: src/components/vm/vmActions.jsx:351 -#, fuzzy -#| msgid "Force reboot" msgid "Force reboot $0?" -msgstr "Forzar el reinicio" +msgstr "¿Forzar el reinicio de $0?" #: src/components/vm/snapshots/vmSnapshotsRevertModal.jsx:99 msgid "Force revert" @@ -1012,10 +1009,8 @@ msgstr "Forzar el apagado" #: src/components/vm/vmActions.jsx:287 -#, fuzzy -#| msgid "Force shut down" msgid "Force shut down $0?" -msgstr "Forzar el apagado" +msgstr "¿Forzar el apagado de $0?" #: src/components/storagePools/storageVolumeCreateBody.jsx:69 #: src/components/storagePools/createStoragePoolDialog.jsx:197 @@ -1041,8 +1036,8 @@ "los discos con escritura y no compartidos se transferirán. El almacenamiento " "no utilizado permanecerá en el origen tras la migración." -#: src/components/vm/overview/vmOverviewCard.jsx:159 #: src/components/networks/networkOverviewTab.jsx:110 +#: src/components/vm/overview/vmOverviewCard.jsx:159 msgid "General" msgstr "General" @@ -1078,13 +1073,13 @@ msgid "Hardware virtualization is disabled" msgstr "La virtualización por hardware está desactivada" -#: src/components/vm/disks/diskAdd.jsx:212 #: src/components/vm/filesystems/vmFilesystemsCard.jsx:241 +#: src/components/vm/disks/diskAdd.jsx:212 msgid "Hide additional options" msgstr "Ocultar opciones adicionales" -#: src/components/storagePools/storagePoolOverviewTab.jsx:34 #: src/components/storagePools/createStoragePoolDialog.jsx:121 +#: src/components/storagePools/storagePoolOverviewTab.jsx:34 #: src/components/vm/disks/vmDiskColumns.jsx:44 #: src/components/vm/overview/bootOrder.jsx:101 msgid "Host" @@ -1126,8 +1121,8 @@ msgid "IP" msgstr "IP" -#: src/components/vm/nics/vmNicsCard.jsx:350 #: src/components/networks/networkOverviewTab.jsx:254 +#: src/components/vm/nics/vmNicsCard.jsx:357 msgid "IP address" msgstr "Dirección IP" @@ -1139,7 +1134,7 @@ msgid "IP configuration" msgstr "Configuración de la IP" -#: src/components/networks/createNetworkDialog.jsx:241 +#: src/components/networks/createNetworkDialog.jsx:243 #: src/components/networks/networkOverviewTab.jsx:138 msgid "IPv4 address" msgstr "Dirección IPv4" @@ -1164,7 +1159,7 @@ msgid "IPv4 only" msgstr "Solo IPv4" -#: src/components/networks/createNetworkDialog.jsx:271 +#: src/components/networks/createNetworkDialog.jsx:273 #: src/components/networks/networkOverviewTab.jsx:158 msgid "IPv6 address" msgstr "Dirección IPv6" @@ -1361,7 +1356,7 @@ msgid "Libvirt or hypervisor does not support UEFI" msgstr "Libvirt o el hipervisor no soportan UEFI" -#: src/components/vm/nics/vmNicsCard.jsx:421 +#: src/components/vm/nics/vmNicsCard.jsx:444 msgid "Loading available network devices" msgstr "Cargando dispositivos de red disponibles" @@ -1383,14 +1378,15 @@ msgid "Location" msgstr "Ubicación" -#: src/components/vm/overview/bootOrder.jsx:111 #: src/components/networks/networkOverviewTab.jsx:68 +#: src/components/vm/overview/bootOrder.jsx:111 msgid "MAC" msgstr "MAC" -#: src/components/vm/nics/vmNicsCard.jsx:344 -#: src/components/vm/nics/nicEdit.jsx:47 src/components/vm/nics/nicAdd.jsx:68 #: src/components/networks/networkOverviewTab.jsx:247 +#: src/components/vm/nics/nicEdit.jsx:47 +#: src/components/vm/nics/vmNicsCard.jsx:351 +#: src/components/vm/nics/nicAdd.jsx:68 msgid "MAC address" msgstr "Dirección MAC" @@ -1422,7 +1418,7 @@ msgid "Manual connection" msgstr "Conexión manual" -#: src/components/networks/createNetworkDialog.jsx:248 +#: src/components/networks/createNetworkDialog.jsx:250 msgid "Mask or prefix length" msgstr "Máscara o longitud del prefijo" @@ -1465,8 +1461,8 @@ msgstr "Se expulsará de $0:" #: src/components/create-vm-dialog/createVmDialog.jsx:792 -#: src/components/vm/overview/vmOverviewCard.jsx:182 #: src/components/vm/vmUsageCard.jsx:58 +#: src/components/vm/overview/vmOverviewCard.jsx:182 msgid "Memory" msgstr "Memoria" @@ -1486,8 +1482,8 @@ msgid "MiB" msgstr "MiB" -#: src/components/vm/vmActions.jsx:425 #: src/components/vm/vmMigrateDialog.jsx:210 +#: src/components/vm/vmActions.jsx:425 msgid "Migrate" msgstr "Migrar" @@ -1509,7 +1505,7 @@ msgid "Model" msgstr "Modelo" -#: src/components/vm/nics/vmNicsCard.jsx:331 +#: src/components/vm/nics/vmNicsCard.jsx:338 msgid "Model type" msgstr "Tipo de modelo" @@ -1535,21 +1531,21 @@ msgid "NAT to $0" msgstr "NAT para $0" -#: src/components/vm/nics/vmNicsCard.jsx:301 +#: src/components/vm/nics/vmNicsCard.jsx:308 msgid "NIC $0 of VM $1 failed to change state" msgstr "NIC $0 de la VM $1 falló al cambiar de estado" #: src/components/create-vm-dialog/createVmDialog.jsx:260 -#: src/components/storagePools/storagePoolList.jsx:68 -#: src/components/storagePools/storageVolumeCreateBody.jsx:38 #: src/components/storagePools/storagePoolVolumesTab.jsx:78 +#: src/components/storagePools/storageVolumeCreateBody.jsx:38 +#: src/components/storagePools/storagePoolList.jsx:68 #: src/components/storagePools/createStoragePoolDialog.jsx:45 -#: src/components/vms/hostvmslist.jsx:144 +#: src/components/networks/createNetworkDialog.jsx:126 +#: src/components/networks/networkList.jsx:67 #: src/components/vm/vmCloneDialog.jsx:93 #: src/components/vm/snapshots/vmSnapshotsCreateModal.jsx:38 #: src/components/vm/snapshots/vmSnapshotsCard.jsx:85 -#: src/components/networks/networkList.jsx:67 -#: src/components/networks/createNetworkDialog.jsx:126 +#: src/components/vms/hostvmslist.jsx:144 msgid "Name" msgstr "Nombre" @@ -1568,8 +1564,8 @@ msgstr "Nombre no debe estar vacío" #: src/components/storagePools/createStoragePoolDialog.jsx:51 -#: src/components/vm/snapshots/vmSnapshotsCreateModal.jsx:97 #: src/components/networks/createNetworkDialog.jsx:53 +#: src/components/vm/snapshots/vmSnapshotsCreateModal.jsx:97 msgid "Name should not be empty" msgstr "Nombre no debería estar vacío" @@ -1609,11 +1605,11 @@ msgid "Network interface" msgstr "Interfaz de red" -#: src/components/vm/nics/vmNicsCard.jsx:446 +#: src/components/vm/nics/vmNicsCard.jsx:469 msgid "Network interface $0 could not be removed" msgstr "No se pudo quitar la interfaz de red $0" -#: src/components/vm/nics/vmNicsCard.jsx:447 +#: src/components/vm/nics/vmNicsCard.jsx:470 msgid "Network interface $0 will be removed from $1" msgstr "Se quitará la interfaz de red $0 de $1" @@ -1687,7 +1683,7 @@ msgid "No network devices" msgstr "No hay dispositivos de red" -#: src/components/vm/nics/vmNicsCard.jsx:542 +#: src/components/vm/nics/vmNicsCard.jsx:565 msgid "No network interfaces defined for this VM" msgstr "No se han definido interfaces de red para esta MV" @@ -1733,7 +1729,7 @@ msgid "No virtual networks" msgstr "No hay redes virtuales" -#: src/components/storagePools/storagePoolDelete.jsx:185 +#: src/components/storagePools/storagePoolDelete.jsx:184 msgid "No volumes exist in this storage pool." msgstr "No hay volúmenes en este grupo de almacenamiento." @@ -1745,7 +1741,7 @@ "La red no persistente no se puede eliminar. Dejará de existir cuando está " "desactivado." -#: src/components/storagePools/storagePoolDelete.jsx:228 +#: src/components/storagePools/storagePoolDelete.jsx:227 msgid "" "Non-persistent storage pool cannot be deleted. It ceases to exists when it's " "deactivated." @@ -1785,9 +1781,9 @@ "Hay dominios que están utilizando uno o más volúmenes de los que se han " "seleccionado. Desmonte primero los discos para poder eliminar los volúmenes." -#: src/components/vm/overview/bootOrder.jsx:368 -#: src/components/vm/overview/memoryModal.jsx:145 #: src/components/vm/nics/nicEdit.jsx:44 +#: src/components/vm/overview/memoryModal.jsx:145 +#: src/components/vm/overview/bootOrder.jsx:368 msgid "Only editable when the guest is shut off" msgstr "Solo se puede editar cuando el huésped esté apagado" @@ -1840,7 +1836,7 @@ msgid "Path to file on host's file system" msgstr "Ruta al archivo en el sistema de archivos del anfitrión" -#: src/helpers.js:283 src/components/vm/vmActions.jsx:209 +#: src/components/vm/vmActions.jsx:209 src/helpers.js:283 msgid "Pause" msgstr "Pausar" @@ -1891,13 +1887,13 @@ #: src/components/vm/consoles/consoles.jsx:40 msgid "Please start the virtual machine to access its console." -msgstr "Por favor arranque la maquina virtual para acceder a su consola." +msgstr "Por favor, arranque la máquina virtual para acceder a su consola." #: src/components/vm/disks/vmDiskColumns.jsx:42 -#: src/components/vm/disks/mediaEject.jsx:85 #: src/components/vm/disks/diskAdd.jsx:151 -#: src/components/vm/overview/bootOrder.jsx:99 +#: src/components/vm/disks/mediaEject.jsx:85 #: src/components/vm/deleteDialog.jsx:68 +#: src/components/vm/overview/bootOrder.jsx:99 msgid "Pool" msgstr "Grupo" @@ -1919,9 +1915,9 @@ msgstr "Las MVs están utilizando un grupo de volúmenes: " #: src/components/vm/disks/vmDiskColumns.jsx:45 +#: src/components/vm/nics/vmNicsCard.jsx:162 #: src/components/vm/overview/bootOrder.jsx:102 #: src/components/vm/overview/bootOrder.jsx:118 -#: src/components/vm/nics/vmNicsCard.jsx:162 msgid "Port" msgstr "Puerto" @@ -1937,7 +1933,7 @@ msgid "Prefix" msgstr "Prefijo" -#: src/components/networks/createNetworkDialog.jsx:278 +#: src/components/networks/createNetworkDialog.jsx:280 msgid "Prefix length" msgstr "Longitud del prefijo" @@ -1957,11 +1953,11 @@ msgid "Private" msgstr "Privado" -#: src/components/vm/overview/bootOrder.jsx:131 -#: src/components/vm/overview/bootOrder.jsx:146 -#: src/components/vm/hostdevs/hostDevAdd.jsx:128 #: src/components/vm/hostdevs/hostDevCard.jsx:237 #: src/components/vm/hostdevs/hostDevCard.jsx:243 +#: src/components/vm/hostdevs/hostDevAdd.jsx:128 +#: src/components/vm/overview/bootOrder.jsx:131 +#: src/components/vm/overview/bootOrder.jsx:146 msgid "Product" msgstr "Producto" @@ -1970,9 +1966,9 @@ msgstr "Perfil" #: src/components/vm/disks/vmDiskColumns.jsx:41 +#: src/components/vm/hostdevs/hostDevCard.jsx:114 #: src/components/vm/overview/bootOrder.jsx:98 #: src/components/vm/overview/bootOrder.jsx:159 -#: src/components/vm/hostdevs/hostDevCard.jsx:114 msgid "Protocol" msgstr "Protocolo" @@ -2000,8 +1996,8 @@ msgid "Range" msgstr "Rango" -#: src/components/vm/disks/vmDisksCard.jsx:216 #: src/components/vm/disks/diskEdit.jsx:123 +#: src/components/vm/disks/vmDisksCard.jsx:216 msgid "Read-only" msgstr "Solo lectura" @@ -2011,10 +2007,8 @@ msgstr "Reiniciar" #: src/components/vm/vmActions.jsx:331 -#, fuzzy -#| msgid "Reboot" msgid "Reboot $0?" -msgstr "Reiniciar" +msgstr "¿Reiniciar $0?" #: src/components/create-vm-dialog/createVmDialog.jsx:339 msgid "Remote URL" @@ -2024,17 +2018,17 @@ msgid "Remote viewer details" msgstr "Detalles del visor remoto" -#: src/components/vm/disks/vmDiskColumns.jsx:146 -#: src/components/vm/disks/vmDiskColumns.jsx:212 -#: src/components/vm/overview/vsock.jsx:241 -#: src/components/vm/overview/watchdog.jsx:191 +#: src/components/networks/networkOverviewTab.jsx:70 #: src/components/vm/filesystems/vmFilesystemsCard.jsx:59 #: src/components/vm/filesystems/vmFilesystemsCard.jsx:68 -#: src/components/vm/nics/vmNicsCard.jsx:448 -#: src/components/vm/nics/vmNicsCard.jsx:457 +#: src/components/vm/disks/vmDiskColumns.jsx:146 +#: src/components/vm/disks/vmDiskColumns.jsx:212 +#: src/components/vm/nics/vmNicsCard.jsx:471 +#: src/components/vm/nics/vmNicsCard.jsx:480 #: src/components/vm/hostdevs/hostDevCard.jsx:253 #: src/components/vm/hostdevs/hostDevCard.jsx:259 -#: src/components/networks/networkOverviewTab.jsx:70 +#: src/components/vm/overview/watchdog.jsx:191 +#: src/components/vm/overview/vsock.jsx:241 msgid "Remove" msgstr "Eliminar" @@ -2056,7 +2050,7 @@ msgid "Remove host device from VM?" msgstr "¿Quitar el dispositivo del anfitrión de la MV?" -#: src/components/vm/nics/vmNicsCard.jsx:445 +#: src/components/vm/nics/vmNicsCard.jsx:468 msgid "Remove network interface?" msgstr "¿Quitar la interfaz de red?" @@ -2087,8 +2081,8 @@ msgid "Resume" msgstr "Reanudar" -#: src/components/vm/snapshots/vmSnapshotsCard.jsx:168 #: src/components/vm/snapshots/vmSnapshotsRevertModal.jsx:92 +#: src/components/vm/snapshots/vmSnapshotsCard.jsx:168 msgid "Revert" msgstr "Revertir" @@ -2122,8 +2116,8 @@ msgid "Run" msgstr "Ejecutar" -#: src/components/vm/overview/vmOverviewCard.jsx:111 #: src/components/networks/networkOverviewTab.jsx:124 +#: src/components/vm/overview/vmOverviewCard.jsx:111 msgid "Run when host boots" msgstr "Ejecutar cuando el anfitrión arranque" @@ -2144,12 +2138,12 @@ msgstr "Puerto SPICE" #: src/components/vm/disks/diskEdit.jsx:267 -#: src/components/vm/overview/bootOrder.jsx:315 -#: src/components/vm/overview/vsock.jsx:196 +#: src/components/vm/nics/nicEdit.jsx:182 +#: src/components/vm/overview/firmware.jsx:69 #: src/components/vm/overview/watchdog.jsx:154 #: src/components/vm/overview/memoryModal.jsx:156 -#: src/components/vm/overview/firmware.jsx:69 -#: src/components/vm/nics/nicEdit.jsx:182 +#: src/components/vm/overview/bootOrder.jsx:315 +#: src/components/vm/overview/vsock.jsx:196 msgid "Save" msgstr "Guardar" @@ -2166,10 +2160,8 @@ msgstr "Enviar interrupción no enmascarable" #: src/components/vm/vmActions.jsx:308 -#, fuzzy -#| msgid "Send non-maskable interrupt" msgid "Send non-maskable interrupt to $0?" -msgstr "Enviar interrupción no enmascarable" +msgstr "¿Enviar interrupción no enmascarable a $0?" #: src/components/vm/disks/vmDiskColumns.jsx:102 msgid "Serial" @@ -2221,8 +2213,8 @@ msgid "Shared storage" msgstr "Almacenamiento compartido" -#: src/components/vm/disks/diskAdd.jsx:212 #: src/components/vm/filesystems/vmFilesystemsCard.jsx:241 +#: src/components/vm/disks/diskAdd.jsx:212 msgid "Show additional options" msgstr "Mostrar opciones adicionales" @@ -2240,10 +2232,8 @@ msgstr "Apagar" #: src/components/vm/vmActions.jsx:236 src/components/vm/vmActions.jsx:267 -#, fuzzy -#| msgid "Shut down" msgid "Shut down $0?" -msgstr "Apagar" +msgstr "¿Apagar $0?" #: src/helpers.js:228 msgid "Shut off" @@ -2253,21 +2243,21 @@ msgid "Shut off the VM in order to edit firmware configuration" msgstr "Apague la MV para modificar la configuración del firmware" -#: src/helpers.js:227 src/components/vm/snapshots/vmSnapshotsCard.jsx:119 +#: src/components/vm/snapshots/vmSnapshotsCard.jsx:119 src/helpers.js:227 msgid "Shutting down" msgstr "Apagándose" -#: src/components/storagePools/storagePoolList.jsx:69 -#: src/components/storagePools/storageVolumeCreateBody.jsx:83 #: src/components/storagePools/storagePoolVolumesTab.jsx:78 +#: src/components/storagePools/storageVolumeCreateBody.jsx:83 +#: src/components/storagePools/storagePoolList.jsx:69 msgid "Size" msgstr "Tamaño" -#: src/components/vm/overview/bootOrder.jsx:147 -#: src/components/vm/hostdevs/hostDevAdd.jsx:101 #: src/components/vm/hostdevs/hostDevCard.jsx:101 #: src/components/vm/hostdevs/hostDevCard.jsx:108 #: src/components/vm/hostdevs/hostDevCard.jsx:238 +#: src/components/vm/hostdevs/hostDevAdd.jsx:101 +#: src/components/vm/overview/bootOrder.jsx:147 msgid "Slot" msgstr "Ranura" @@ -2300,10 +2290,10 @@ "Algunos cambios de configuración sólo toman efecto tras un inicio desde cero:" #: src/components/storagePools/storagePoolOverviewTab.jsx:51 -#: src/components/vm/disks/vmDisksCard.jsx:190 #: src/components/vm/disks/diskAdd.jsx:753 #: src/components/vm/disks/diskAdd.jsx:789 -#: src/components/vm/nics/vmNicsCard.jsx:384 +#: src/components/vm/disks/vmDisksCard.jsx:190 +#: src/components/vm/nics/vmNicsCard.jsx:407 #: src/components/vm/nics/nicBody.jsx:197 #: src/components/vm/hostdevs/hostDevCard.jsx:219 msgid "Source" @@ -2317,10 +2307,10 @@ msgid "Source must not be empty" msgstr "Origen no debe estar vacío" -#: src/components/storagePools/storagePoolOverviewTab.jsx:41 -#: src/components/storagePools/storagePoolOverviewTab.jsx:46 #: src/components/storagePools/createStoragePoolDialog.jsx:171 #: src/components/storagePools/createStoragePoolDialog.jsx:188 +#: src/components/storagePools/storagePoolOverviewTab.jsx:41 +#: src/components/storagePools/storagePoolOverviewTab.jsx:46 #: src/components/vm/filesystems/vmFilesystemsCard.jsx:48 #: src/components/vm/filesystems/vmFilesystemsCard.jsx:65 #: src/components/vm/filesystems/vmFilesystemsCard.jsx:204 @@ -2340,7 +2330,7 @@ msgid "Source volume group" msgstr "Origen del grupo de volumen" -#: src/components/networks/createNetworkDialog.jsx:218 +#: src/components/networks/createNetworkDialog.jsx:219 msgid "Start" msgstr "Iniciar" @@ -2358,11 +2348,11 @@ msgstr "Puesta en marcha" #: src/components/storagePools/storagePoolList.jsx:71 +#: src/components/networks/networkList.jsx:71 +#: src/components/vm/nics/vmNicsCard.jsx:412 +#: src/components/vm/overview/vmOverviewCard.jsx:168 #: src/components/vms/hostvmslist.jsx:106 #: src/components/vms/hostvmslist.jsx:146 -#: src/components/vm/overview/vmOverviewCard.jsx:168 -#: src/components/vm/nics/vmNicsCard.jsx:389 -#: src/components/networks/networkList.jsx:71 msgid "State" msgstr "Estado" @@ -2453,23 +2443,21 @@ msgstr "Sistema" #: src/components/vm/nics/vmNicsCard.jsx:189 -#, fuzzy -#| msgid "Host device" msgid "TAP device" -msgstr "Dispositivo del anfitrión" +msgstr "Dispositivo TAP" #: src/components/vm/hostdevs/hostDevAdd.jsx:126 msgid "Table of selectable host devices" msgstr "Tabla con los dispositivos del anfitrión seleccionables" #: src/components/vm/disks/vmDiskColumns.jsx:150 -#: src/components/vm/overview/bootOrder.jsx:153 #: src/components/vm/hostdevs/hostDevCard.jsx:109 +#: src/components/vm/overview/bootOrder.jsx:153 msgid "Target" msgstr "Objetivo" -#: src/components/storagePools/storagePoolOverviewTab.jsx:61 #: src/components/storagePools/createStoragePoolDialog.jsx:103 +#: src/components/storagePools/storagePoolOverviewTab.jsx:61 msgid "Target path" msgstr "Ruta de destino" @@ -2491,8 +2479,8 @@ "La MV $0 está ejecutándose y se forzará su apagado antes de la eliminación." #: src/components/vm/disks/vmDiskColumns.jsx:220 -#: src/components/vm/nics/vmNicsCard.jsx:458 -#: src/components/vm/nics/vmNicsCard.jsx:466 +#: src/components/vm/nics/vmNicsCard.jsx:481 +#: src/components/vm/nics/vmNicsCard.jsx:489 msgid "The VM needs to be running or shut off to detach this device" msgstr "" "La máquina virtual necesita ejecutarse o apagarse para desmontar este " @@ -2615,17 +2603,17 @@ msgid "Troubleshoot" msgstr "Soporte" -#: src/components/storagePools/storagePoolOverviewTab.jsx:76 #: src/components/storagePools/createStoragePoolDialog.jsx:81 +#: src/components/storagePools/storagePoolOverviewTab.jsx:76 +#: src/components/vm/nics/vmNicsCard.jsx:325 +#: src/components/vm/hostdevs/hostDevCard.jsx:179 +#: src/components/vm/hostdevs/hostDevAdd.jsx:47 #: src/components/vm/overview/bootOrder.jsx:116 #: src/components/vm/overview/bootOrder.jsx:129 #: src/components/vm/overview/bootOrder.jsx:144 #: src/components/vm/overview/bootOrder.jsx:151 #: src/components/vm/overview/bootOrder.jsx:158 #: src/components/vm/overview/bootOrder.jsx:164 -#: src/components/vm/nics/vmNicsCard.jsx:318 -#: src/components/vm/hostdevs/hostDevAdd.jsx:47 -#: src/components/vm/hostdevs/hostDevCard.jsx:179 msgid "Type" msgstr "Tipo" @@ -2669,7 +2657,7 @@ msgid "Unit" msgstr "Unidad" -#: src/components/vm/nics/vmNicsCard.jsx:356 +#: src/components/vm/nics/vmNicsCard.jsx:377 msgid "Unknown" msgstr "Desconocido" @@ -2677,16 +2665,16 @@ msgid "Unknown firmware" msgstr "Firmware desconocido" -#: src/components/vm/overview/bootOrder.jsx:135 -#: src/components/vm/overview/bootOrder.jsx:136 #: src/components/vm/hostdevs/hostDevCard.jsx:92 #: src/components/vm/hostdevs/hostDevCard.jsx:93 +#: src/components/vm/overview/bootOrder.jsx:135 +#: src/components/vm/overview/bootOrder.jsx:136 msgid "Unspecified" msgstr "Desconocido" #: src/components/vm/confirmDialog.jsx:70 msgid "Uptime" -msgstr "" +msgstr "Tiempo en línea" #: src/components/vm/disks/diskEdit.jsx:44 msgid "Url" @@ -2835,21 +2823,21 @@ msgid "Valid token" msgstr "Token válido" -#: src/components/vm/overview/bootOrder.jsx:130 -#: src/components/vm/overview/bootOrder.jsx:145 -#: src/components/vm/hostdevs/hostDevAdd.jsx:128 #: src/components/vm/hostdevs/hostDevCard.jsx:209 #: src/components/vm/hostdevs/hostDevCard.jsx:236 #: src/components/vm/hostdevs/hostDevCard.jsx:242 +#: src/components/vm/hostdevs/hostDevAdd.jsx:128 +#: src/components/vm/overview/bootOrder.jsx:130 +#: src/components/vm/overview/bootOrder.jsx:145 msgid "Vendor" msgstr "Proveedor" #: src/components/storagePools/storagePoolList.jsx:52 -#: src/components/vms/hostvmslist.jsx:138 -#: src/components/vms/hostvmslist.jsx:141 +#: src/components/networks/networkList.jsx:51 #: src/components/vm/vmDetailsPage.jsx:87 -#: src/components/vm/vmDetailsPage.jsx:247 -#: src/components/networks/networkList.jsx:51 src/manifest.json:0 +#: src/components/vm/vmDetailsPage.jsx:249 +#: src/components/vms/hostvmslist.jsx:138 +#: src/components/vms/hostvmslist.jsx:141 src/manifest.json:0 msgid "Virtual machines" msgstr "Máquinas virtuales" @@ -2861,7 +2849,7 @@ msgid "Virtual network" msgstr "Red virtual" -#: src/components/networks/createNetworkDialog.jsx:375 +#: src/components/networks/createNetworkDialog.jsx:377 msgid "Virtual network failed to be created" msgstr "La red virtual falló al crearse" @@ -2881,10 +2869,10 @@ #: src/components/create-vm-dialog/createVmDialog.jsx:900 #: src/components/vm/disks/vmDiskColumns.jsx:43 -#: src/components/vm/disks/mediaEject.jsx:89 #: src/components/vm/disks/diskAdd.jsx:117 -#: src/components/vm/overview/bootOrder.jsx:100 +#: src/components/vm/disks/mediaEject.jsx:89 #: src/components/vm/deleteDialog.jsx:65 +#: src/components/vm/overview/bootOrder.jsx:100 msgid "Volume" msgstr "Volumen" @@ -2904,13 +2892,13 @@ msgid "Vsock" msgstr "Vsock" -#: src/components/vm/overview/bootOrder.jsx:160 #: src/components/vm/hostdevs/hostDevCard.jsx:115 +#: src/components/vm/overview/bootOrder.jsx:160 msgid "WWPN" msgstr "WWPN" -#: src/components/common/needsShutdown.jsx:114 #: src/components/vm/overview/vmOverviewCard.jsx:208 +#: src/components/common/needsShutdown.jsx:114 msgid "Watchdog" msgstr "Watchdog" @@ -2924,13 +2912,13 @@ "dispositivo watchdog virtual, el sistema anfitrión debe tener un driver " "adicional y ejecutar un servicio watchdog." -#: src/components/vm/disks/vmDisksCard.jsx:216 #: src/components/vm/disks/diskEdit.jsx:132 +#: src/components/vm/disks/vmDisksCard.jsx:216 msgid "Writeable" msgstr "Puede escribirse" -#: src/components/vm/disks/vmDisksCard.jsx:216 #: src/components/vm/disks/diskEdit.jsx:141 +#: src/components/vm/disks/vmDisksCard.jsx:216 msgid "Writeable and shared" msgstr "Puede escribirse y está compartido" @@ -2947,8 +2935,8 @@ msgid "active" msgstr "activo" -#: src/components/vm/overview/vsock.jsx:293 #: src/components/vm/overview/watchdog.jsx:242 +#: src/components/vm/overview/vsock.jsx:293 msgid "add" msgstr "añadir" @@ -2964,7 +2952,7 @@ msgid "cdrom" msgstr "cdrom" -#: src/helpers.js:244 src/components/vm/overview/cpuModal.jsx:321 +#: src/components/vm/overview/cpuModal.jsx:321 src/helpers.js:244 msgid "custom" msgstr "personalizado" @@ -2984,11 +2972,11 @@ msgid "down" msgstr "apagado" -#: src/components/vm/overview/bootOrder.jsx:361 #: src/components/vm/overview/vmOverviewCard.jsx:122 #: src/components/vm/overview/vmOverviewCard.jsx:130 -#: src/components/vm/overview/vsock.jsx:293 #: src/components/vm/overview/watchdog.jsx:242 +#: src/components/vm/overview/bootOrder.jsx:361 +#: src/components/vm/overview/vsock.jsx:293 msgid "edit" msgstr "editar" @@ -3035,17 +3023,16 @@ #: src/components/storagePools/storagePool.jsx:63 #: src/components/networks/network.jsx:62 #, fuzzy -#| msgid "active" msgid "inactive" msgstr "activa" -#: src/components/vm/nics/vmNicsCard.jsx:362 +#: src/components/vm/nics/vmNicsCard.jsx:385 msgid "inet" -msgstr "" +msgstr "inet" -#: src/components/vm/nics/vmNicsCard.jsx:370 +#: src/components/vm/nics/vmNicsCard.jsx:393 msgid "inet6" -msgstr "" +msgstr "inet6" #: src/manifest.json:0 msgid "iso" @@ -3059,11 +3046,11 @@ msgid "mcast" msgstr "mcast" -#: src/components/common/machinesConnectionSelector.jsx:82 -#: src/components/vm/overview/vsock.jsx:226 #: src/components/vm/filesystems/vmFilesystemsCard.jsx:194 #: src/components/vm/nics/nicBody.jsx:110 #: src/components/vm/vmDetailsPage.jsx:202 +#: src/components/vm/overview/vsock.jsx:226 +#: src/components/common/machinesConnectionSelector.jsx:82 msgid "more info" msgstr "más información" @@ -3080,9 +3067,9 @@ msgid "network" msgstr "red" -#: src/helpers.js:273 src/components/storagePools/storagePoolOverviewTab.jsx:67 +#: src/components/storagePools/storagePoolOverviewTab.jsx:67 #: src/components/storagePools/storagePoolOverviewTab.jsx:72 -#: src/components/networks/networkOverviewTab.jsx:115 +#: src/components/networks/networkOverviewTab.jsx:115 src/helpers.js:273 msgid "no" msgstr "no" @@ -3090,9 +3077,9 @@ msgid "no state saved" msgstr "no hay estado almacenado" -#: src/components/vm/overview/vsock.jsx:275 -#: src/components/vm/overview/watchdog.jsx:238 #: src/components/networks/networkOverviewTab.jsx:293 +#: src/components/vm/overview/watchdog.jsx:238 +#: src/components/vm/overview/vsock.jsx:275 msgid "none" msgstr "ninguna" @@ -3196,9 +3183,9 @@ msgid "vsock requires special software" msgstr "vsock requiere software especial" -#: src/helpers.js:272 src/components/storagePools/storagePoolOverviewTab.jsx:67 +#: src/components/storagePools/storagePoolOverviewTab.jsx:67 #: src/components/storagePools/storagePoolOverviewTab.jsx:72 -#: src/components/networks/networkOverviewTab.jsx:115 +#: src/components/networks/networkOverviewTab.jsx:115 src/helpers.js:272 msgid "yes" msgstr "sí" @@ -3262,7 +3249,6 @@ #~ msgstr "Conectándose al servicio de virtualización" #, fuzzy -#~| msgid "Connecting to virtualization service" #~ msgid "Failed to enable virtualization service" #~ msgstr "Conectándose al servicio de virtualización" @@ -3270,7 +3256,6 @@ #~ msgstr "Iniciar libvirt" #, fuzzy -#~| msgid "Blocked" #~ msgid "Block" #~ msgstr "Bloqueado" diff -Nru cockpit-machines-295/po/fi.po cockpit-machines-298/po/fi.po --- cockpit-machines-295/po/fi.po 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/po/fi.po 2023-09-04 12:22:47.000000000 +0000 @@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-18 03:14+0000\n" -"PO-Revision-Date: 2023-06-21 19:20+0000\n" +"POT-Creation-Date: 2023-09-05 02:50+0000\n" +"PO-Revision-Date: 2023-07-29 19:21+0000\n" "Last-Translator: Jan Kuparinen \n" "Language-Team: Finnish \n" @@ -18,7 +18,7 @@ "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1\n" -"X-Generator: Weblate 4.18.1\n" +"X-Generator: Weblate 4.18.2\n" #: src/components/create-vm-dialog/createVmDialog.jsx:827 msgid "$0 $1 available at default location" @@ -65,8 +65,8 @@ msgid "$0 network" msgstr "$0 verkko" -#: src/components/vm/overview/vmOverviewCard.jsx:145 #: src/components/vm/vmUsageCard.jsx:47 +#: src/components/vm/overview/vmOverviewCard.jsx:145 msgid "$0 vCPU" msgid_plural "$0 vCPUs" msgstr[0] "$0 vCPU" @@ -84,8 +84,8 @@ "Kopio virtuaalikoneesta suoritetaan kohteessa ja katoaa, kun se sammutetaan. " "Samaan aikaan isäntäkone säilyttää kopion virtuaalikoneen kokoonpanosta." -#: src/components/vm/disks/vmDisksCard.jsx:188 #: src/components/vm/disks/diskEdit.jsx:115 +#: src/components/vm/disks/vmDisksCard.jsx:188 msgid "Access" msgstr "Pääsy" @@ -102,12 +102,12 @@ msgid "Activate the storage pool to administer volumes" msgstr "Aktivoi varastointivaranto taltioiden hallitsemiseksi" +#: src/components/networks/networkOverviewTab.jsx:236 #: src/components/vm/disks/diskAdd.jsx:863 -#: src/components/vm/overview/vsock.jsx:196 -#: src/components/vm/overview/watchdog.jsx:154 #: src/components/vm/nics/nicAdd.jsx:213 #: src/components/vm/hostdevs/hostDevAdd.jsx:229 -#: src/components/networks/networkOverviewTab.jsx:236 +#: src/components/vm/overview/watchdog.jsx:154 +#: src/components/vm/overview/vsock.jsx:196 msgid "Add" msgstr "Lisää" @@ -115,13 +115,13 @@ msgid "Add a DHCP static host entry" msgstr "Lisää staattinen DHCP-merkintä" -#: src/components/vm/disks/vmDisksCard.jsx:75 #: src/components/vm/disks/diskAdd.jsx:853 +#: src/components/vm/disks/vmDisksCard.jsx:75 msgid "Add disk" msgstr "Lisää levy" -#: src/components/vm/hostdevs/hostDevAdd.jsx:244 #: src/components/vm/hostdevs/hostDevCard.jsx:148 +#: src/components/vm/hostdevs/hostDevAdd.jsx:244 msgid "Add host device" msgstr "Lisää isäntälaite" @@ -163,10 +163,10 @@ msgid "Additional" msgstr "Ylimääräinen" -#: src/components/vm/nics/vmNicsCard.jsx:154 -#: src/components/vm/consoles/desktopConsole.jsx:47 #: src/components/networks/networkOverviewTab.jsx:142 #: src/components/networks/networkOverviewTab.jsx:162 +#: src/components/vm/nics/vmNicsCard.jsx:154 +#: src/components/vm/consoles/desktopConsole.jsx:47 msgid "Address" msgstr "Osoite" @@ -197,7 +197,7 @@ "Sallitut merkit: latinalaiset perusaakkoset, numerot ja vain nämä välimerkit " "(-, _, +, .)" -#: src/components/storagePools/storagePoolDelete.jsx:176 +#: src/components/storagePools/storagePoolDelete.jsx:175 msgid "Also delete all volumes inside this pool:" msgstr "Poista myös tämän varannon sisäiset taltiot:" @@ -238,8 +238,8 @@ msgstr "Automatisointi" #: src/components/storagePools/storagePoolOverviewTab.jsx:71 -#: src/components/vm/overview/vmOverviewCard.jsx:200 #: src/components/networks/networkOverviewTab.jsx:119 +#: src/components/vm/overview/vmOverviewCard.jsx:200 msgid "Autostart" msgstr "Automaattikäynnistys" @@ -255,18 +255,18 @@ msgid "Boot order settings could not be saved" msgstr "Käynnistysjärjestysasetuksia ei voitu tallentaa" -#: src/components/vm/disks/vmDisksCard.jsx:186 -#: src/components/vm/disks/diskAdd.jsx:227 #: src/components/vm/disks/diskEdit.jsx:90 +#: src/components/vm/disks/diskAdd.jsx:227 +#: src/components/vm/disks/vmDisksCard.jsx:186 +#: src/components/vm/hostdevs/hostDevCard.jsx:99 +#: src/components/vm/hostdevs/hostDevCard.jsx:107 +#: src/components/vm/hostdevs/hostDevCard.jsx:247 +#: src/components/vm/hostdevs/hostDevAdd.jsx:89 #: src/components/vm/overview/bootOrder.jsx:105 #: src/components/vm/overview/bootOrder.jsx:117 #: src/components/vm/overview/bootOrder.jsx:135 #: src/components/vm/overview/bootOrder.jsx:138 #: src/components/vm/overview/bootOrder.jsx:152 -#: src/components/vm/hostdevs/hostDevAdd.jsx:89 -#: src/components/vm/hostdevs/hostDevCard.jsx:99 -#: src/components/vm/hostdevs/hostDevCard.jsx:107 -#: src/components/vm/hostdevs/hostDevCard.jsx:247 msgid "Bus" msgstr "Väylä" @@ -274,9 +274,9 @@ msgid "CD/DVD disc" msgstr "CD/DVD-levy" -#: src/components/common/needsShutdown.jsx:110 -#: src/components/vm/overview/vmOverviewCard.jsx:187 #: src/components/vm/vmUsageCard.jsx:69 +#: src/components/vm/overview/vmOverviewCard.jsx:187 +#: src/components/common/needsShutdown.jsx:110 msgid "CPU" msgstr "Suoritin" @@ -284,38 +284,38 @@ msgid "CPU mode could not be saved" msgstr "CPU:n moodia ei voitu tallentaa" +#: src/components/vm/disks/diskEdit.jsx:60 #: src/components/vm/disks/vmDiskColumns.jsx:101 #: src/components/vm/disks/diskAdd.jsx:216 -#: src/components/vm/disks/diskEdit.jsx:60 msgid "Cache" msgstr "Välimuisti" #: src/components/create-vm-dialog/createVmDialog.jsx:1392 -#: src/components/common/deleteResource.jsx:91 -#: src/components/storagePools/storagePoolDelete.jsx:206 -#: src/components/storagePools/createStoragePoolDialog.jsx:443 #: src/components/storagePools/storageVolumeCreate.jsx:110 +#: src/components/storagePools/createStoragePoolDialog.jsx:443 +#: src/components/storagePools/storagePoolDelete.jsx:205 +#: src/components/networks/createNetworkDialog.jsx:421 +#: src/components/networks/networkOverviewTab.jsx:239 +#: src/components/vm/filesystems/vmFilesystemsCard.jsx:174 #: src/components/vm/vmCloneDialog.jsx:83 -#: src/components/vm/disks/mediaEject.jsx:110 -#: src/components/vm/disks/diskAdd.jsx:866 +#: src/components/vm/snapshots/vmSnapshotsRevertModal.jsx:102 +#: src/components/vm/snapshots/vmSnapshotsCreateModal.jsx:147 #: src/components/vm/disks/diskEdit.jsx:270 -#: src/components/vm/overview/bootOrder.jsx:318 -#: src/components/vm/overview/vsock.jsx:244 -#: src/components/vm/overview/watchdog.jsx:194 -#: src/components/vm/overview/memoryModal.jsx:159 -#: src/components/vm/overview/cpuModal.jsx:338 -#: src/components/vm/overview/firmware.jsx:72 -#: src/components/vm/confirmDialog.jsx:54 -#: src/components/vm/filesystems/vmFilesystemsCard.jsx:174 +#: src/components/vm/disks/diskAdd.jsx:866 +#: src/components/vm/disks/mediaEject.jsx:110 #: src/components/vm/vmRenameDialog.jsx:71 #: src/components/vm/deleteDialog.jsx:174 -#: src/components/vm/snapshots/vmSnapshotsCreateModal.jsx:147 -#: src/components/vm/snapshots/vmSnapshotsRevertModal.jsx:102 -#: src/components/vm/vmMigrateDialog.jsx:213 #: src/components/vm/nics/nicEdit.jsx:185 src/components/vm/nics/nicAdd.jsx:216 +#: src/components/vm/confirmDialog.jsx:54 #: src/components/vm/hostdevs/hostDevAdd.jsx:234 -#: src/components/networks/createNetworkDialog.jsx:419 -#: src/components/networks/networkOverviewTab.jsx:239 +#: src/components/vm/vmMigrateDialog.jsx:213 +#: src/components/vm/overview/firmware.jsx:72 +#: src/components/vm/overview/watchdog.jsx:194 +#: src/components/vm/overview/memoryModal.jsx:159 +#: src/components/vm/overview/bootOrder.jsx:318 +#: src/components/vm/overview/vsock.jsx:244 +#: src/components/vm/overview/cpuModal.jsx:338 +#: src/components/common/deleteResource.jsx:91 msgid "Cancel" msgstr "Peru" @@ -407,12 +407,12 @@ msgid "Connecting" msgstr "Yhdistetään" -#: src/components/common/machinesConnectionSelector.jsx:39 #: src/components/storagePools/storagePoolList.jsx:70 -#: src/components/vms/hostvmslist.jsx:145 -#: src/components/vm/overview/vmOverviewCard.jsx:163 -#: src/components/networks/networkList.jsx:69 #: src/components/networks/createNetworkDialog.jsx:41 +#: src/components/networks/networkList.jsx:69 +#: src/components/vm/overview/vmOverviewCard.jsx:163 +#: src/components/common/machinesConnectionSelector.jsx:39 +#: src/components/vms/hostvmslist.jsx:145 msgid "Connection" msgstr "Yhteys" @@ -454,10 +454,10 @@ msgid "Crashed" msgstr "Kaatui" -#: src/components/storagePools/createStoragePoolDialog.jsx:440 #: src/components/storagePools/storageVolumeCreate.jsx:107 +#: src/components/storagePools/createStoragePoolDialog.jsx:440 +#: src/components/networks/createNetworkDialog.jsx:418 #: src/components/vm/snapshots/vmSnapshotsCreateModal.jsx:144 -#: src/components/networks/createNetworkDialog.jsx:416 msgid "Create" msgstr "Luo" @@ -515,8 +515,8 @@ msgid "Create storage volume" msgstr "Luo varastointitaltio" -#: src/components/networks/createNetworkDialog.jsx:409 -#: src/components/networks/createNetworkDialog.jsx:437 +#: src/components/networks/createNetworkDialog.jsx:411 +#: src/components/networks/createNetworkDialog.jsx:439 msgid "Create virtual network" msgstr "Luo virtuaaliverkko" @@ -576,15 +576,16 @@ msgid "Deactivate" msgstr "Deaktivoi" +#: src/components/storagePools/storagePoolDelete.jsx:202 +#: src/components/storagePools/storagePoolDelete.jsx:238 +#: src/components/storagePools/storagePoolDelete.jsx:248 +#: src/components/networks/network.jsx:150 +#: src/components/networks/network.jsx:153 +#: src/components/vm/deleteDialog.jsx:171 src/components/vm/vmActions.jsx:451 +#: src/components/vm/vmActions.jsx:459 #: src/components/common/deleteResource.jsx:79 #: src/components/common/deleteResource.jsx:133 #: src/components/common/deleteResource.jsx:144 -#: src/components/storagePools/storagePoolDelete.jsx:203 -#: src/components/storagePools/storagePoolDelete.jsx:239 -#: src/components/storagePools/storagePoolDelete.jsx:249 -#: src/components/vm/deleteDialog.jsx:171 src/components/vm/vmActions.jsx:451 -#: src/components/vm/vmActions.jsx:459 src/components/networks/network.jsx:150 -#: src/components/networks/network.jsx:153 msgid "Delete" msgstr "Poista" @@ -592,7 +593,7 @@ msgid "Delete $0 VM?" msgstr "Poista $0 VM?" -#: src/components/storagePools/storagePoolDelete.jsx:195 +#: src/components/storagePools/storagePoolDelete.jsx:194 msgid "Delete $0 storage pool?" msgstr "Poista varastointivaranto $0?" @@ -614,7 +615,7 @@ msgid "Delete snapshot?" msgstr "Poista tilannevedos ?" -#: src/components/storagePools/storagePoolDelete.jsx:186 +#: src/components/storagePools/storagePoolDelete.jsx:185 msgid "" "Deleting an inactive storage pool will only undefine the pool. Its content " "will not be deleted." @@ -656,19 +657,19 @@ msgid "Details" msgstr "Yksityiskohdat" +#: src/components/networks/createNetworkDialog.jsx:160 +#: src/components/networks/networkList.jsx:68 #: src/components/vm/disks/vmDiskColumns.jsx:40 -#: src/components/vm/disks/vmDisksCard.jsx:172 #: src/components/vm/disks/diskAdd.jsx:354 +#: src/components/vm/disks/vmDisksCard.jsx:172 +#: src/components/vm/hostdevs/hostDevCard.jsx:98 +#: src/components/vm/hostdevs/hostDevCard.jsx:246 +#: src/components/vm/hostdevs/hostDevAdd.jsx:88 +#: src/components/vm/hostdevs/hostDevAdd.jsx:123 #: src/components/vm/overview/bootOrder.jsx:97 #: src/components/vm/overview/bootOrder.jsx:104 #: src/components/vm/overview/bootOrder.jsx:136 #: src/components/vm/overview/bootOrder.jsx:139 -#: src/components/vm/hostdevs/hostDevAdd.jsx:88 -#: src/components/vm/hostdevs/hostDevAdd.jsx:123 -#: src/components/vm/hostdevs/hostDevCard.jsx:98 -#: src/components/vm/hostdevs/hostDevCard.jsx:246 -#: src/components/networks/networkList.jsx:68 -#: src/components/networks/createNetworkDialog.jsx:160 msgid "Device" msgstr "Laite" @@ -676,8 +677,8 @@ msgid "Devices" msgstr "Laitteet" -#: src/components/vm/consoles/serialConsole.jsx:94 #: src/components/vm/consoles/vnc.jsx:170 +#: src/components/vm/consoles/serialConsole.jsx:94 msgid "Disconnect" msgstr "Katkaise yhteys" @@ -726,8 +727,8 @@ msgid "Disk images can be stored in user home directory" msgstr "Levykuvat voidaan tallentaa käyttäjän kotihakemistoon" -#: src/components/vm/disks/diskAdd.jsx:716 #: src/components/vm/disks/diskEdit.jsx:218 +#: src/components/vm/disks/diskAdd.jsx:716 msgid "Disk settings could not be saved" msgstr "Levyn asetuksia ei voitu tallentaa" @@ -787,7 +788,7 @@ msgstr "Kuolemassa" #: src/components/vm/disks/diskEdit.jsx:166 -#: src/components/vm/nics/vmNicsCard.jsx:430 +#: src/components/vm/nics/vmNicsCard.jsx:453 msgid "Edit" msgstr "Muokkaa" @@ -803,12 +804,12 @@ msgid "Edit watchdog device type" msgstr "Muokkaa vahtikoiran laitetyyppiä" -#: src/components/vm/nics/vmNicsCard.jsx:418 +#: src/components/vm/nics/vmNicsCard.jsx:441 msgid "Editing network interfaces of transient guests is not allowed" msgstr "" "Väliaikaisten vieraskoneiden verkkoliitäntöjen muokkaaminen ei ole sallittua" -#: src/components/vm/nics/vmNicsCard.jsx:424 +#: src/components/vm/nics/vmNicsCard.jsx:447 msgid "Editing transient network interfaces is not allowed" msgstr "Väliaikaisten verkkoliitäntöjen muokkaaminen ei ole sallittua" @@ -829,7 +830,7 @@ msgid "Enable virtualization support in BIOS/EFI settings." msgstr "Ota virtualisointituki käyttöön BIOS:in/EFI:n asetuksissa." -#: src/components/networks/createNetworkDialog.jsx:224 +#: src/components/networks/createNetworkDialog.jsx:226 msgid "End" msgstr "Loppu" @@ -994,8 +995,8 @@ "kirjoitettavat levykuvat siirretään. Käyttämätön tallennustila pysyy " "alkuperäisenä siirron jälkeen." -#: src/components/vm/overview/vmOverviewCard.jsx:159 #: src/components/networks/networkOverviewTab.jsx:110 +#: src/components/vm/overview/vmOverviewCard.jsx:159 msgid "General" msgstr "Yleinen" @@ -1031,13 +1032,13 @@ msgid "Hardware virtualization is disabled" msgstr "Laitteistovirtualisointi on pois käytöstä" -#: src/components/vm/disks/diskAdd.jsx:212 #: src/components/vm/filesystems/vmFilesystemsCard.jsx:241 +#: src/components/vm/disks/diskAdd.jsx:212 msgid "Hide additional options" msgstr "Piilota lisävaihtoehdot" -#: src/components/storagePools/storagePoolOverviewTab.jsx:34 #: src/components/storagePools/createStoragePoolDialog.jsx:121 +#: src/components/storagePools/storagePoolOverviewTab.jsx:34 #: src/components/vm/disks/vmDiskColumns.jsx:44 #: src/components/vm/overview/bootOrder.jsx:101 msgid "Host" @@ -1079,8 +1080,8 @@ msgid "IP" msgstr "IP" -#: src/components/vm/nics/vmNicsCard.jsx:350 #: src/components/networks/networkOverviewTab.jsx:254 +#: src/components/vm/nics/vmNicsCard.jsx:357 msgid "IP address" msgstr "IP-osoite" @@ -1092,7 +1093,7 @@ msgid "IP configuration" msgstr "IP-määritykset" -#: src/components/networks/createNetworkDialog.jsx:241 +#: src/components/networks/createNetworkDialog.jsx:243 #: src/components/networks/networkOverviewTab.jsx:138 msgid "IPv4 address" msgstr "IPv4-osoite" @@ -1117,7 +1118,7 @@ msgid "IPv4 only" msgstr "IPv4 vain" -#: src/components/networks/createNetworkDialog.jsx:271 +#: src/components/networks/createNetworkDialog.jsx:273 #: src/components/networks/networkOverviewTab.jsx:158 msgid "IPv6 address" msgstr "IPv6-osoite" @@ -1307,7 +1308,7 @@ msgid "Libvirt or hypervisor does not support UEFI" msgstr "Libvirt tai hypervisori ei tue UEFI:a" -#: src/components/vm/nics/vmNicsCard.jsx:421 +#: src/components/vm/nics/vmNicsCard.jsx:444 msgid "Loading available network devices" msgstr "Ladataan käytettävissä olevat verkkolaitteet" @@ -1327,14 +1328,15 @@ msgid "Location" msgstr "Sijainti" -#: src/components/vm/overview/bootOrder.jsx:111 #: src/components/networks/networkOverviewTab.jsx:68 +#: src/components/vm/overview/bootOrder.jsx:111 msgid "MAC" msgstr "MAC" -#: src/components/vm/nics/vmNicsCard.jsx:344 -#: src/components/vm/nics/nicEdit.jsx:47 src/components/vm/nics/nicAdd.jsx:68 #: src/components/networks/networkOverviewTab.jsx:247 +#: src/components/vm/nics/nicEdit.jsx:47 +#: src/components/vm/nics/vmNicsCard.jsx:351 +#: src/components/vm/nics/nicAdd.jsx:68 msgid "MAC address" msgstr "MAC-osoite" @@ -1366,7 +1368,7 @@ msgid "Manual connection" msgstr "Manuaalinen yhteys" -#: src/components/networks/createNetworkDialog.jsx:248 +#: src/components/networks/createNetworkDialog.jsx:250 msgid "Mask or prefix length" msgstr "Peitteen tai etuliitteen pituus" @@ -1408,8 +1410,8 @@ msgstr "Media poistetaan $0:sta:" #: src/components/create-vm-dialog/createVmDialog.jsx:792 -#: src/components/vm/overview/vmOverviewCard.jsx:182 #: src/components/vm/vmUsageCard.jsx:58 +#: src/components/vm/overview/vmOverviewCard.jsx:182 msgid "Memory" msgstr "Muisti" @@ -1429,8 +1431,8 @@ msgid "MiB" msgstr "Mit" -#: src/components/vm/vmActions.jsx:425 #: src/components/vm/vmMigrateDialog.jsx:210 +#: src/components/vm/vmActions.jsx:425 msgid "Migrate" msgstr "Migratoi" @@ -1452,7 +1454,7 @@ msgid "Model" msgstr "Malli" -#: src/components/vm/nics/vmNicsCard.jsx:331 +#: src/components/vm/nics/vmNicsCard.jsx:338 msgid "Model type" msgstr "Mallityyppi" @@ -1478,21 +1480,21 @@ msgid "NAT to $0" msgstr "NAT $0:een" -#: src/components/vm/nics/vmNicsCard.jsx:301 +#: src/components/vm/nics/vmNicsCard.jsx:308 msgid "NIC $0 of VM $1 failed to change state" msgstr "Virtuaalikoneen $1 verkkokortti $0 ei muuttanut tilaa" #: src/components/create-vm-dialog/createVmDialog.jsx:260 -#: src/components/storagePools/storagePoolList.jsx:68 -#: src/components/storagePools/storageVolumeCreateBody.jsx:38 #: src/components/storagePools/storagePoolVolumesTab.jsx:78 +#: src/components/storagePools/storageVolumeCreateBody.jsx:38 +#: src/components/storagePools/storagePoolList.jsx:68 #: src/components/storagePools/createStoragePoolDialog.jsx:45 -#: src/components/vms/hostvmslist.jsx:144 +#: src/components/networks/createNetworkDialog.jsx:126 +#: src/components/networks/networkList.jsx:67 #: src/components/vm/vmCloneDialog.jsx:93 #: src/components/vm/snapshots/vmSnapshotsCreateModal.jsx:38 #: src/components/vm/snapshots/vmSnapshotsCard.jsx:85 -#: src/components/networks/networkList.jsx:67 -#: src/components/networks/createNetworkDialog.jsx:126 +#: src/components/vms/hostvmslist.jsx:144 msgid "Name" msgstr "Nimi" @@ -1511,8 +1513,8 @@ msgstr "Nimi ei saa olla tyhjä" #: src/components/storagePools/createStoragePoolDialog.jsx:51 -#: src/components/vm/snapshots/vmSnapshotsCreateModal.jsx:97 #: src/components/networks/createNetworkDialog.jsx:53 +#: src/components/vm/snapshots/vmSnapshotsCreateModal.jsx:97 msgid "Name should not be empty" msgstr "Nime ei tulisi olla tyhjä" @@ -1552,11 +1554,11 @@ msgid "Network interface" msgstr "verkkoliitäntä" -#: src/components/vm/nics/vmNicsCard.jsx:446 +#: src/components/vm/nics/vmNicsCard.jsx:469 msgid "Network interface $0 could not be removed" msgstr "Verkkoliitäntää $0 ei voitu poistaa" -#: src/components/vm/nics/vmNicsCard.jsx:447 +#: src/components/vm/nics/vmNicsCard.jsx:470 msgid "Network interface $0 will be removed from $1" msgstr "Verkkoliitäntä $0 poistetaan kohdasta $1" @@ -1627,7 +1629,7 @@ msgid "No network devices" msgstr "Ei verkkolaitteita" -#: src/components/vm/nics/vmNicsCard.jsx:542 +#: src/components/vm/nics/vmNicsCard.jsx:565 msgid "No network interfaces defined for this VM" msgstr "Tälle virtuaalikoneelle ei ole määritetty verkkoliitäntöjä" @@ -1671,7 +1673,7 @@ msgid "No virtual networks" msgstr "Ei virtuaaliverkkoja" -#: src/components/storagePools/storagePoolDelete.jsx:185 +#: src/components/storagePools/storagePoolDelete.jsx:184 msgid "No volumes exist in this storage pool." msgstr "Tässä tallennusvarannossa ei ole taltioita." @@ -1683,7 +1685,7 @@ "Ei-pysyvää verkkoa ei voida poistaa. Se lakkaa olemasta, kun se " "deaktivoidaan." -#: src/components/storagePools/storagePoolDelete.jsx:228 +#: src/components/storagePools/storagePoolDelete.jsx:227 msgid "" "Non-persistent storage pool cannot be deleted. It ceases to exists when it's " "deactivated." @@ -1723,9 +1725,9 @@ "Toimialueet käyttävät yhtä tai useampaa valittua taltiota. Irrota levyt " "ensin, jotta taltio voidaan poistaa." -#: src/components/vm/overview/bootOrder.jsx:368 -#: src/components/vm/overview/memoryModal.jsx:145 #: src/components/vm/nics/nicEdit.jsx:44 +#: src/components/vm/overview/memoryModal.jsx:145 +#: src/components/vm/overview/bootOrder.jsx:368 msgid "Only editable when the guest is shut off" msgstr "Muokattavissa vain, kun vieras on sammutettuna" @@ -1778,7 +1780,7 @@ msgid "Path to file on host's file system" msgstr "Polku tiedostoon isännän tiedostojärjestelmässä" -#: src/helpers.js:283 src/components/vm/vmActions.jsx:209 +#: src/components/vm/vmActions.jsx:209 src/helpers.js:283 msgid "Pause" msgstr "Keskeytä" @@ -1828,10 +1830,10 @@ msgstr "Käynnistä virtuaalikone päästäksesi sen konsoliin." #: src/components/vm/disks/vmDiskColumns.jsx:42 -#: src/components/vm/disks/mediaEject.jsx:85 #: src/components/vm/disks/diskAdd.jsx:151 -#: src/components/vm/overview/bootOrder.jsx:99 +#: src/components/vm/disks/mediaEject.jsx:85 #: src/components/vm/deleteDialog.jsx:68 +#: src/components/vm/overview/bootOrder.jsx:99 msgid "Pool" msgstr "Varanto" @@ -1852,9 +1854,9 @@ msgstr "Varannon taltioita käyttävät virtuaalikoneet " #: src/components/vm/disks/vmDiskColumns.jsx:45 +#: src/components/vm/nics/vmNicsCard.jsx:162 #: src/components/vm/overview/bootOrder.jsx:102 #: src/components/vm/overview/bootOrder.jsx:118 -#: src/components/vm/nics/vmNicsCard.jsx:162 msgid "Port" msgstr "Portti" @@ -1870,7 +1872,7 @@ msgid "Prefix" msgstr "Etuliite" -#: src/components/networks/createNetworkDialog.jsx:278 +#: src/components/networks/createNetworkDialog.jsx:280 msgid "Prefix length" msgstr "Etuliitteen pituus" @@ -1890,11 +1892,11 @@ msgid "Private" msgstr "Yksityinen" -#: src/components/vm/overview/bootOrder.jsx:131 -#: src/components/vm/overview/bootOrder.jsx:146 -#: src/components/vm/hostdevs/hostDevAdd.jsx:128 #: src/components/vm/hostdevs/hostDevCard.jsx:237 #: src/components/vm/hostdevs/hostDevCard.jsx:243 +#: src/components/vm/hostdevs/hostDevAdd.jsx:128 +#: src/components/vm/overview/bootOrder.jsx:131 +#: src/components/vm/overview/bootOrder.jsx:146 msgid "Product" msgstr "Tuote" @@ -1903,9 +1905,9 @@ msgstr "Profiili" #: src/components/vm/disks/vmDiskColumns.jsx:41 +#: src/components/vm/hostdevs/hostDevCard.jsx:114 #: src/components/vm/overview/bootOrder.jsx:98 #: src/components/vm/overview/bootOrder.jsx:159 -#: src/components/vm/hostdevs/hostDevCard.jsx:114 msgid "Protocol" msgstr "Protokolla" @@ -1932,8 +1934,8 @@ msgid "Range" msgstr "Alue" -#: src/components/vm/disks/vmDisksCard.jsx:216 #: src/components/vm/disks/diskEdit.jsx:123 +#: src/components/vm/disks/vmDisksCard.jsx:216 msgid "Read-only" msgstr "Vain luku" @@ -1956,17 +1958,17 @@ msgid "Remote viewer details" msgstr "Etäkatseluohjelman yksityiskohdat" -#: src/components/vm/disks/vmDiskColumns.jsx:146 -#: src/components/vm/disks/vmDiskColumns.jsx:212 -#: src/components/vm/overview/vsock.jsx:241 -#: src/components/vm/overview/watchdog.jsx:191 +#: src/components/networks/networkOverviewTab.jsx:70 #: src/components/vm/filesystems/vmFilesystemsCard.jsx:59 #: src/components/vm/filesystems/vmFilesystemsCard.jsx:68 -#: src/components/vm/nics/vmNicsCard.jsx:448 -#: src/components/vm/nics/vmNicsCard.jsx:457 +#: src/components/vm/disks/vmDiskColumns.jsx:146 +#: src/components/vm/disks/vmDiskColumns.jsx:212 +#: src/components/vm/nics/vmNicsCard.jsx:471 +#: src/components/vm/nics/vmNicsCard.jsx:480 #: src/components/vm/hostdevs/hostDevCard.jsx:253 #: src/components/vm/hostdevs/hostDevCard.jsx:259 -#: src/components/networks/networkOverviewTab.jsx:70 +#: src/components/vm/overview/watchdog.jsx:191 +#: src/components/vm/overview/vsock.jsx:241 msgid "Remove" msgstr "Poista" @@ -1986,7 +1988,7 @@ msgid "Remove host device from VM?" msgstr "Poista isäntälaite VM:stä?" -#: src/components/vm/nics/vmNicsCard.jsx:445 +#: src/components/vm/nics/vmNicsCard.jsx:468 msgid "Remove network interface?" msgstr "Poista verkkoliitäntä?" @@ -2017,8 +2019,8 @@ msgid "Resume" msgstr "Palauta" -#: src/components/vm/snapshots/vmSnapshotsCard.jsx:168 #: src/components/vm/snapshots/vmSnapshotsRevertModal.jsx:92 +#: src/components/vm/snapshots/vmSnapshotsCard.jsx:168 msgid "Revert" msgstr "Palaa" @@ -2052,8 +2054,8 @@ msgid "Run" msgstr "Suorita" -#: src/components/vm/overview/vmOverviewCard.jsx:111 #: src/components/networks/networkOverviewTab.jsx:124 +#: src/components/vm/overview/vmOverviewCard.jsx:111 msgid "Run when host boots" msgstr "Suorita, kun isäntä käynnistyy" @@ -2074,12 +2076,12 @@ msgstr "SPICE-portti" #: src/components/vm/disks/diskEdit.jsx:267 -#: src/components/vm/overview/bootOrder.jsx:315 -#: src/components/vm/overview/vsock.jsx:196 +#: src/components/vm/nics/nicEdit.jsx:182 +#: src/components/vm/overview/firmware.jsx:69 #: src/components/vm/overview/watchdog.jsx:154 #: src/components/vm/overview/memoryModal.jsx:156 -#: src/components/vm/overview/firmware.jsx:69 -#: src/components/vm/nics/nicEdit.jsx:182 +#: src/components/vm/overview/bootOrder.jsx:315 +#: src/components/vm/overview/vsock.jsx:196 msgid "Save" msgstr "Tallenna" @@ -2150,8 +2152,8 @@ msgid "Shared storage" msgstr "Jaettu tallennustila" -#: src/components/vm/disks/diskAdd.jsx:212 #: src/components/vm/filesystems/vmFilesystemsCard.jsx:241 +#: src/components/vm/disks/diskAdd.jsx:212 msgid "Show additional options" msgstr "Näytä lisävaihtoehdot" @@ -2182,21 +2184,21 @@ msgid "Shut off the VM in order to edit firmware configuration" msgstr "Sammuta virtuaalikone, jotta voit muokata laiteohjelmiston kokoonpanoa" -#: src/helpers.js:227 src/components/vm/snapshots/vmSnapshotsCard.jsx:119 +#: src/components/vm/snapshots/vmSnapshotsCard.jsx:119 src/helpers.js:227 msgid "Shutting down" msgstr "Sammutetaan" -#: src/components/storagePools/storagePoolList.jsx:69 -#: src/components/storagePools/storageVolumeCreateBody.jsx:83 #: src/components/storagePools/storagePoolVolumesTab.jsx:78 +#: src/components/storagePools/storageVolumeCreateBody.jsx:83 +#: src/components/storagePools/storagePoolList.jsx:69 msgid "Size" msgstr "Koko" -#: src/components/vm/overview/bootOrder.jsx:147 -#: src/components/vm/hostdevs/hostDevAdd.jsx:101 #: src/components/vm/hostdevs/hostDevCard.jsx:101 #: src/components/vm/hostdevs/hostDevCard.jsx:108 #: src/components/vm/hostdevs/hostDevCard.jsx:238 +#: src/components/vm/hostdevs/hostDevAdd.jsx:101 +#: src/components/vm/overview/bootOrder.jsx:147 msgid "Slot" msgstr "Aukko" @@ -2229,10 +2231,10 @@ msgstr "" #: src/components/storagePools/storagePoolOverviewTab.jsx:51 -#: src/components/vm/disks/vmDisksCard.jsx:190 #: src/components/vm/disks/diskAdd.jsx:753 #: src/components/vm/disks/diskAdd.jsx:789 -#: src/components/vm/nics/vmNicsCard.jsx:384 +#: src/components/vm/disks/vmDisksCard.jsx:190 +#: src/components/vm/nics/vmNicsCard.jsx:407 #: src/components/vm/nics/nicBody.jsx:197 #: src/components/vm/hostdevs/hostDevCard.jsx:219 msgid "Source" @@ -2246,10 +2248,10 @@ msgid "Source must not be empty" msgstr "Lähde ei saa olla tyhjä" -#: src/components/storagePools/storagePoolOverviewTab.jsx:41 -#: src/components/storagePools/storagePoolOverviewTab.jsx:46 #: src/components/storagePools/createStoragePoolDialog.jsx:171 #: src/components/storagePools/createStoragePoolDialog.jsx:188 +#: src/components/storagePools/storagePoolOverviewTab.jsx:41 +#: src/components/storagePools/storagePoolOverviewTab.jsx:46 #: src/components/vm/filesystems/vmFilesystemsCard.jsx:48 #: src/components/vm/filesystems/vmFilesystemsCard.jsx:65 #: src/components/vm/filesystems/vmFilesystemsCard.jsx:204 @@ -2269,7 +2271,7 @@ msgid "Source volume group" msgstr "Lähteen taltioryhmä" -#: src/components/networks/createNetworkDialog.jsx:218 +#: src/components/networks/createNetworkDialog.jsx:219 msgid "Start" msgstr "Käynnistä" @@ -2287,11 +2289,11 @@ msgstr "Aloittaa" #: src/components/storagePools/storagePoolList.jsx:71 +#: src/components/networks/networkList.jsx:71 +#: src/components/vm/nics/vmNicsCard.jsx:412 +#: src/components/vm/overview/vmOverviewCard.jsx:168 #: src/components/vms/hostvmslist.jsx:106 #: src/components/vms/hostvmslist.jsx:146 -#: src/components/vm/overview/vmOverviewCard.jsx:168 -#: src/components/vm/nics/vmNicsCard.jsx:389 -#: src/components/networks/networkList.jsx:71 msgid "State" msgstr "Tila" @@ -2389,13 +2391,13 @@ msgstr "Taulukko valittavista olevista isäntälaitteista" #: src/components/vm/disks/vmDiskColumns.jsx:150 -#: src/components/vm/overview/bootOrder.jsx:153 #: src/components/vm/hostdevs/hostDevCard.jsx:109 +#: src/components/vm/overview/bootOrder.jsx:153 msgid "Target" msgstr "Kohde" -#: src/components/storagePools/storagePoolOverviewTab.jsx:61 #: src/components/storagePools/createStoragePoolDialog.jsx:103 +#: src/components/storagePools/storagePoolOverviewTab.jsx:61 msgid "Target path" msgstr "Kohteen polku" @@ -2417,8 +2419,8 @@ "Virtuaalikone $0 on käynnissä ja se pakotetaan pois päältä ennen poistamista." #: src/components/vm/disks/vmDiskColumns.jsx:220 -#: src/components/vm/nics/vmNicsCard.jsx:458 -#: src/components/vm/nics/vmNicsCard.jsx:466 +#: src/components/vm/nics/vmNicsCard.jsx:481 +#: src/components/vm/nics/vmNicsCard.jsx:489 msgid "The VM needs to be running or shut off to detach this device" msgstr "" "Virtuaalikoneen on oltava käynnissä tai sammutettuna laitteen irrottamiseksi" @@ -2534,17 +2536,17 @@ msgid "Troubleshoot" msgstr "Vianetsintä" -#: src/components/storagePools/storagePoolOverviewTab.jsx:76 #: src/components/storagePools/createStoragePoolDialog.jsx:81 +#: src/components/storagePools/storagePoolOverviewTab.jsx:76 +#: src/components/vm/nics/vmNicsCard.jsx:325 +#: src/components/vm/hostdevs/hostDevCard.jsx:179 +#: src/components/vm/hostdevs/hostDevAdd.jsx:47 #: src/components/vm/overview/bootOrder.jsx:116 #: src/components/vm/overview/bootOrder.jsx:129 #: src/components/vm/overview/bootOrder.jsx:144 #: src/components/vm/overview/bootOrder.jsx:151 #: src/components/vm/overview/bootOrder.jsx:158 #: src/components/vm/overview/bootOrder.jsx:164 -#: src/components/vm/nics/vmNicsCard.jsx:318 -#: src/components/vm/hostdevs/hostDevAdd.jsx:47 -#: src/components/vm/hostdevs/hostDevCard.jsx:179 msgid "Type" msgstr "Tyyppi" @@ -2584,7 +2586,7 @@ msgid "Unit" msgstr "Yksikkö" -#: src/components/vm/nics/vmNicsCard.jsx:356 +#: src/components/vm/nics/vmNicsCard.jsx:377 msgid "Unknown" msgstr "Tuntematon" @@ -2592,16 +2594,16 @@ msgid "Unknown firmware" msgstr "Tuntematon laiteohjelmisto" -#: src/components/vm/overview/bootOrder.jsx:135 -#: src/components/vm/overview/bootOrder.jsx:136 #: src/components/vm/hostdevs/hostDevCard.jsx:92 #: src/components/vm/hostdevs/hostDevCard.jsx:93 +#: src/components/vm/overview/bootOrder.jsx:135 +#: src/components/vm/overview/bootOrder.jsx:136 msgid "Unspecified" msgstr "Määrittämätön" #: src/components/vm/confirmDialog.jsx:70 msgid "Uptime" -msgstr "" +msgstr "Toiminta-aika" #: src/components/vm/disks/diskEdit.jsx:44 msgid "Url" @@ -2750,21 +2752,21 @@ msgid "Valid token" msgstr "Kelvollinen tokeni" -#: src/components/vm/overview/bootOrder.jsx:130 -#: src/components/vm/overview/bootOrder.jsx:145 -#: src/components/vm/hostdevs/hostDevAdd.jsx:128 #: src/components/vm/hostdevs/hostDevCard.jsx:209 #: src/components/vm/hostdevs/hostDevCard.jsx:236 #: src/components/vm/hostdevs/hostDevCard.jsx:242 +#: src/components/vm/hostdevs/hostDevAdd.jsx:128 +#: src/components/vm/overview/bootOrder.jsx:130 +#: src/components/vm/overview/bootOrder.jsx:145 msgid "Vendor" msgstr "Toimittaja" #: src/components/storagePools/storagePoolList.jsx:52 -#: src/components/vms/hostvmslist.jsx:138 -#: src/components/vms/hostvmslist.jsx:141 +#: src/components/networks/networkList.jsx:51 #: src/components/vm/vmDetailsPage.jsx:87 -#: src/components/vm/vmDetailsPage.jsx:247 -#: src/components/networks/networkList.jsx:51 src/manifest.json:0 +#: src/components/vm/vmDetailsPage.jsx:249 +#: src/components/vms/hostvmslist.jsx:138 +#: src/components/vms/hostvmslist.jsx:141 src/manifest.json:0 msgid "Virtual machines" msgstr "Virtuaalikoneet" @@ -2776,7 +2778,7 @@ msgid "Virtual network" msgstr "Virtuaaliverkko" -#: src/components/networks/createNetworkDialog.jsx:375 +#: src/components/networks/createNetworkDialog.jsx:377 msgid "Virtual network failed to be created" msgstr "Virtuaaliverkon luominen epäonnistui" @@ -2793,10 +2795,10 @@ #: src/components/create-vm-dialog/createVmDialog.jsx:900 #: src/components/vm/disks/vmDiskColumns.jsx:43 -#: src/components/vm/disks/mediaEject.jsx:89 #: src/components/vm/disks/diskAdd.jsx:117 -#: src/components/vm/overview/bootOrder.jsx:100 +#: src/components/vm/disks/mediaEject.jsx:89 #: src/components/vm/deleteDialog.jsx:65 +#: src/components/vm/overview/bootOrder.jsx:100 msgid "Volume" msgstr "Taltio" @@ -2816,13 +2818,13 @@ msgid "Vsock" msgstr "" -#: src/components/vm/overview/bootOrder.jsx:160 #: src/components/vm/hostdevs/hostDevCard.jsx:115 +#: src/components/vm/overview/bootOrder.jsx:160 msgid "WWPN" msgstr "WWPN" -#: src/components/common/needsShutdown.jsx:114 #: src/components/vm/overview/vmOverviewCard.jsx:208 +#: src/components/common/needsShutdown.jsx:114 msgid "Watchdog" msgstr "Vahtikoira" @@ -2836,13 +2838,13 @@ "virtuaalisen vahtikoiralaitteen käyttämiseksi vierasjärjestelmässä on oltava " "myös ylimääräinen ajuri ja käynnissä oleva vahtikoirapalvelu." -#: src/components/vm/disks/vmDisksCard.jsx:216 #: src/components/vm/disks/diskEdit.jsx:132 +#: src/components/vm/disks/vmDisksCard.jsx:216 msgid "Writeable" msgstr "Kirjoitettava" -#: src/components/vm/disks/vmDisksCard.jsx:216 #: src/components/vm/disks/diskEdit.jsx:141 +#: src/components/vm/disks/vmDisksCard.jsx:216 msgid "Writeable and shared" msgstr "Kirjoitettava ja jaettu" @@ -2859,8 +2861,8 @@ msgid "active" msgstr "aktiivinen" -#: src/components/vm/overview/vsock.jsx:293 #: src/components/vm/overview/watchdog.jsx:242 +#: src/components/vm/overview/vsock.jsx:293 msgid "add" msgstr "lisää" @@ -2876,7 +2878,7 @@ msgid "cdrom" msgstr "cd-rom" -#: src/helpers.js:244 src/components/vm/overview/cpuModal.jsx:321 +#: src/components/vm/overview/cpuModal.jsx:321 src/helpers.js:244 msgid "custom" msgstr "mukautettu" @@ -2896,11 +2898,11 @@ msgid "down" msgstr "alas" -#: src/components/vm/overview/bootOrder.jsx:361 #: src/components/vm/overview/vmOverviewCard.jsx:122 #: src/components/vm/overview/vmOverviewCard.jsx:130 -#: src/components/vm/overview/vsock.jsx:293 #: src/components/vm/overview/watchdog.jsx:242 +#: src/components/vm/overview/bootOrder.jsx:361 +#: src/components/vm/overview/vsock.jsx:293 msgid "edit" msgstr "muokkaa" @@ -2949,11 +2951,11 @@ msgid "inactive" msgstr "ei aktiivinen" -#: src/components/vm/nics/vmNicsCard.jsx:362 +#: src/components/vm/nics/vmNicsCard.jsx:385 msgid "inet" msgstr "" -#: src/components/vm/nics/vmNicsCard.jsx:370 +#: src/components/vm/nics/vmNicsCard.jsx:393 msgid "inet6" msgstr "" @@ -2969,11 +2971,11 @@ msgid "mcast" msgstr "monilähetys" -#: src/components/common/machinesConnectionSelector.jsx:82 -#: src/components/vm/overview/vsock.jsx:226 #: src/components/vm/filesystems/vmFilesystemsCard.jsx:194 #: src/components/vm/nics/nicBody.jsx:110 #: src/components/vm/vmDetailsPage.jsx:202 +#: src/components/vm/overview/vsock.jsx:226 +#: src/components/common/machinesConnectionSelector.jsx:82 msgid "more info" msgstr "lisätietoja" @@ -2990,9 +2992,9 @@ msgid "network" msgstr "verkko" -#: src/helpers.js:273 src/components/storagePools/storagePoolOverviewTab.jsx:67 +#: src/components/storagePools/storagePoolOverviewTab.jsx:67 #: src/components/storagePools/storagePoolOverviewTab.jsx:72 -#: src/components/networks/networkOverviewTab.jsx:115 +#: src/components/networks/networkOverviewTab.jsx:115 src/helpers.js:273 msgid "no" msgstr "ei" @@ -3000,9 +3002,9 @@ msgid "no state saved" msgstr "ei tilaa tallennettuna" -#: src/components/vm/overview/vsock.jsx:275 -#: src/components/vm/overview/watchdog.jsx:238 #: src/components/networks/networkOverviewTab.jsx:293 +#: src/components/vm/overview/watchdog.jsx:238 +#: src/components/vm/overview/vsock.jsx:275 msgid "none" msgstr "Ei mitään" @@ -3104,9 +3106,9 @@ msgid "vsock requires special software" msgstr "" -#: src/helpers.js:272 src/components/storagePools/storagePoolOverviewTab.jsx:67 +#: src/components/storagePools/storagePoolOverviewTab.jsx:67 #: src/components/storagePools/storagePoolOverviewTab.jsx:72 -#: src/components/networks/networkOverviewTab.jsx:115 +#: src/components/networks/networkOverviewTab.jsx:115 src/helpers.js:272 msgid "yes" msgstr "kyllä" diff -Nru cockpit-machines-295/po/fr.po cockpit-machines-298/po/fr.po --- cockpit-machines-295/po/fr.po 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/po/fr.po 2023-09-04 12:22:47.000000000 +0000 @@ -21,7 +21,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-18 03:14+0000\n" +"POT-Creation-Date: 2023-09-05 02:50+0000\n" "PO-Revision-Date: 2023-06-01 10:20+0000\n" "Last-Translator: Ludek Janda \n" "Language-Team: French \n" "Language-Team: Hebrew \n" "Language-Team: Italian \n" +"POT-Creation-Date: 2023-09-05 02:50+0000\n" +"PO-Revision-Date: 2023-08-30 06:15+0000\n" +"Last-Translator: Keiko Moriguchi \n" "Language-Team: Japanese \n" "Language: ja\n" @@ -22,7 +22,7 @@ "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0\n" -"X-Generator: Weblate 4.17\n" +"X-Generator: Weblate 4.18.2\n" #: src/components/create-vm-dialog/createVmDialog.jsx:827 msgid "$0 $1 available at default location" @@ -35,7 +35,7 @@ #: src/components/vm/overview/cpuModal.jsx:331 msgid "$0 CPU details" -msgstr "$0 の CPU の詳細" +msgstr "$0 CPU の詳細" #: src/components/aggregateStatusCards.jsx:75 msgid "$0 Network" @@ -49,7 +49,7 @@ #: src/components/create-vm-dialog/createVmDialog.jsx:1214 msgid "$0 does not support unattended installation." -msgstr "$0 無人インストールはサポートしません。" +msgstr "$0 は無人インストールはサポートしません。" #: src/components/vm/consoles/desktopConsole.jsx:61 msgid "" @@ -67,8 +67,8 @@ msgid "$0 network" msgstr "$0 ネットワーク" -#: src/components/vm/overview/vmOverviewCard.jsx:145 #: src/components/vm/vmUsageCard.jsx:47 +#: src/components/vm/overview/vmOverviewCard.jsx:145 msgid "$0 vCPU" msgid_plural "$0 vCPUs" msgstr[0] "$0 vCPU" @@ -85,8 +85,8 @@ "仮想マシンのコピーは移行先で実行され、シャットダウンしても消えます。一方、作" "成元のホストは仮想マシン設定のコピーを保持します。" -#: src/components/vm/disks/vmDisksCard.jsx:188 #: src/components/vm/disks/diskEdit.jsx:115 +#: src/components/vm/disks/vmDisksCard.jsx:188 msgid "Access" msgstr "アクセス" @@ -103,12 +103,12 @@ msgid "Activate the storage pool to administer volumes" msgstr "ストレージプールをアクティベートしてボリュームを管理" +#: src/components/networks/networkOverviewTab.jsx:236 #: src/components/vm/disks/diskAdd.jsx:863 -#: src/components/vm/overview/vsock.jsx:196 -#: src/components/vm/overview/watchdog.jsx:154 #: src/components/vm/nics/nicAdd.jsx:213 #: src/components/vm/hostdevs/hostDevAdd.jsx:229 -#: src/components/networks/networkOverviewTab.jsx:236 +#: src/components/vm/overview/watchdog.jsx:154 +#: src/components/vm/overview/vsock.jsx:196 msgid "Add" msgstr "追加する" @@ -116,13 +116,13 @@ msgid "Add a DHCP static host entry" msgstr "DHCP 静的ホストエントリーの追加" -#: src/components/vm/disks/vmDisksCard.jsx:75 #: src/components/vm/disks/diskAdd.jsx:853 +#: src/components/vm/disks/vmDisksCard.jsx:75 msgid "Add disk" msgstr "ディスクの追加" -#: src/components/vm/hostdevs/hostDevAdd.jsx:244 #: src/components/vm/hostdevs/hostDevCard.jsx:148 +#: src/components/vm/hostdevs/hostDevAdd.jsx:244 msgid "Add host device" msgstr "ホストデバイスの追加" @@ -162,10 +162,10 @@ msgid "Additional" msgstr "追加" -#: src/components/vm/nics/vmNicsCard.jsx:154 -#: src/components/vm/consoles/desktopConsole.jsx:47 #: src/components/networks/networkOverviewTab.jsx:142 #: src/components/networks/networkOverviewTab.jsx:162 +#: src/components/vm/nics/vmNicsCard.jsx:154 +#: src/components/vm/consoles/desktopConsole.jsx:47 msgid "Address" msgstr "アドレス" @@ -196,7 +196,7 @@ "使用できる文字: 基本的なラテン語のアルファベット、数字、一部の句読点 (-、" "_、+、.)" -#: src/components/storagePools/storagePoolDelete.jsx:176 +#: src/components/storagePools/storagePoolDelete.jsx:175 msgid "Also delete all volumes inside this pool:" msgstr "このプール内のボリュームをすべて削除します:" @@ -237,8 +237,8 @@ msgstr "自動化" #: src/components/storagePools/storagePoolOverviewTab.jsx:71 -#: src/components/vm/overview/vmOverviewCard.jsx:200 #: src/components/networks/networkOverviewTab.jsx:119 +#: src/components/vm/overview/vmOverviewCard.jsx:200 msgid "Autostart" msgstr "自動起動" @@ -254,18 +254,18 @@ msgid "Boot order settings could not be saved" msgstr "ブート順序の設定は保存できませんでした" -#: src/components/vm/disks/vmDisksCard.jsx:186 -#: src/components/vm/disks/diskAdd.jsx:227 #: src/components/vm/disks/diskEdit.jsx:90 +#: src/components/vm/disks/diskAdd.jsx:227 +#: src/components/vm/disks/vmDisksCard.jsx:186 +#: src/components/vm/hostdevs/hostDevCard.jsx:99 +#: src/components/vm/hostdevs/hostDevCard.jsx:107 +#: src/components/vm/hostdevs/hostDevCard.jsx:247 +#: src/components/vm/hostdevs/hostDevAdd.jsx:89 #: src/components/vm/overview/bootOrder.jsx:105 #: src/components/vm/overview/bootOrder.jsx:117 #: src/components/vm/overview/bootOrder.jsx:135 #: src/components/vm/overview/bootOrder.jsx:138 #: src/components/vm/overview/bootOrder.jsx:152 -#: src/components/vm/hostdevs/hostDevAdd.jsx:89 -#: src/components/vm/hostdevs/hostDevCard.jsx:99 -#: src/components/vm/hostdevs/hostDevCard.jsx:107 -#: src/components/vm/hostdevs/hostDevCard.jsx:247 msgid "Bus" msgstr "バス" @@ -273,9 +273,9 @@ msgid "CD/DVD disc" msgstr "CD/DVD ディスク" -#: src/components/common/needsShutdown.jsx:110 -#: src/components/vm/overview/vmOverviewCard.jsx:187 #: src/components/vm/vmUsageCard.jsx:69 +#: src/components/vm/overview/vmOverviewCard.jsx:187 +#: src/components/common/needsShutdown.jsx:110 msgid "CPU" msgstr "CPU" @@ -283,50 +283,48 @@ msgid "CPU mode could not be saved" msgstr "CPU モードを保存できませんでした" +#: src/components/vm/disks/diskEdit.jsx:60 #: src/components/vm/disks/vmDiskColumns.jsx:101 #: src/components/vm/disks/diskAdd.jsx:216 -#: src/components/vm/disks/diskEdit.jsx:60 msgid "Cache" msgstr "キャッシュ" #: src/components/create-vm-dialog/createVmDialog.jsx:1392 -#: src/components/common/deleteResource.jsx:91 -#: src/components/storagePools/storagePoolDelete.jsx:206 -#: src/components/storagePools/createStoragePoolDialog.jsx:443 #: src/components/storagePools/storageVolumeCreate.jsx:110 +#: src/components/storagePools/createStoragePoolDialog.jsx:443 +#: src/components/storagePools/storagePoolDelete.jsx:205 +#: src/components/networks/createNetworkDialog.jsx:421 +#: src/components/networks/networkOverviewTab.jsx:239 +#: src/components/vm/filesystems/vmFilesystemsCard.jsx:174 #: src/components/vm/vmCloneDialog.jsx:83 -#: src/components/vm/disks/mediaEject.jsx:110 -#: src/components/vm/disks/diskAdd.jsx:866 +#: src/components/vm/snapshots/vmSnapshotsRevertModal.jsx:102 +#: src/components/vm/snapshots/vmSnapshotsCreateModal.jsx:147 #: src/components/vm/disks/diskEdit.jsx:270 -#: src/components/vm/overview/bootOrder.jsx:318 -#: src/components/vm/overview/vsock.jsx:244 -#: src/components/vm/overview/watchdog.jsx:194 -#: src/components/vm/overview/memoryModal.jsx:159 -#: src/components/vm/overview/cpuModal.jsx:338 -#: src/components/vm/overview/firmware.jsx:72 -#: src/components/vm/confirmDialog.jsx:54 -#: src/components/vm/filesystems/vmFilesystemsCard.jsx:174 +#: src/components/vm/disks/diskAdd.jsx:866 +#: src/components/vm/disks/mediaEject.jsx:110 #: src/components/vm/vmRenameDialog.jsx:71 #: src/components/vm/deleteDialog.jsx:174 -#: src/components/vm/snapshots/vmSnapshotsCreateModal.jsx:147 -#: src/components/vm/snapshots/vmSnapshotsRevertModal.jsx:102 -#: src/components/vm/vmMigrateDialog.jsx:213 #: src/components/vm/nics/nicEdit.jsx:185 src/components/vm/nics/nicAdd.jsx:216 +#: src/components/vm/confirmDialog.jsx:54 #: src/components/vm/hostdevs/hostDevAdd.jsx:234 -#: src/components/networks/createNetworkDialog.jsx:419 -#: src/components/networks/networkOverviewTab.jsx:239 +#: src/components/vm/vmMigrateDialog.jsx:213 +#: src/components/vm/overview/firmware.jsx:72 +#: src/components/vm/overview/watchdog.jsx:194 +#: src/components/vm/overview/memoryModal.jsx:159 +#: src/components/vm/overview/bootOrder.jsx:318 +#: src/components/vm/overview/vsock.jsx:244 +#: src/components/vm/overview/cpuModal.jsx:338 +#: src/components/common/deleteResource.jsx:91 msgid "Cancel" msgstr "取り消し" #: src/components/vm/overview/vsock.jsx:203 msgid "Cannot edit vsock device on a transient VM" -msgstr "" +msgstr "一時的な VM では vsock デバイスを編集できません" #: src/components/vm/overview/watchdog.jsx:161 -#, fuzzy -#| msgid "Edit watchdog device type" msgid "Cannot edit watchdog device on a transient VM" -msgstr "ウォッチドッグデバイスタイプの編集" +msgstr "一時的な VM では ウォッチドッグデバイスを編集できません" #: src/components/vm/disks/vmDisksCard.jsx:184 msgid "Capacity" @@ -410,12 +408,12 @@ msgid "Connecting" msgstr "接続中" -#: src/components/common/machinesConnectionSelector.jsx:39 #: src/components/storagePools/storagePoolList.jsx:70 -#: src/components/vms/hostvmslist.jsx:145 -#: src/components/vm/overview/vmOverviewCard.jsx:163 -#: src/components/networks/networkList.jsx:69 #: src/components/networks/createNetworkDialog.jsx:41 +#: src/components/networks/networkList.jsx:69 +#: src/components/vm/overview/vmOverviewCard.jsx:163 +#: src/components/common/machinesConnectionSelector.jsx:39 +#: src/components/vms/hostvmslist.jsx:145 msgid "Connection" msgstr "接続" @@ -457,10 +455,10 @@ msgid "Crashed" msgstr "クラッシュした" -#: src/components/storagePools/createStoragePoolDialog.jsx:440 #: src/components/storagePools/storageVolumeCreate.jsx:107 +#: src/components/storagePools/createStoragePoolDialog.jsx:440 +#: src/components/networks/createNetworkDialog.jsx:418 #: src/components/vm/snapshots/vmSnapshotsCreateModal.jsx:144 -#: src/components/networks/createNetworkDialog.jsx:416 msgid "Create" msgstr "作成" @@ -520,8 +518,8 @@ msgid "Create storage volume" msgstr "ストレージボリュームの作成" -#: src/components/networks/createNetworkDialog.jsx:409 -#: src/components/networks/createNetworkDialog.jsx:437 +#: src/components/networks/createNetworkDialog.jsx:411 +#: src/components/networks/createNetworkDialog.jsx:439 msgid "Create virtual network" msgstr "仮想ネットワークの作成" @@ -581,15 +579,16 @@ msgid "Deactivate" msgstr "非アクティブ化" +#: src/components/storagePools/storagePoolDelete.jsx:202 +#: src/components/storagePools/storagePoolDelete.jsx:238 +#: src/components/storagePools/storagePoolDelete.jsx:248 +#: src/components/networks/network.jsx:150 +#: src/components/networks/network.jsx:153 +#: src/components/vm/deleteDialog.jsx:171 src/components/vm/vmActions.jsx:451 +#: src/components/vm/vmActions.jsx:459 #: src/components/common/deleteResource.jsx:79 #: src/components/common/deleteResource.jsx:133 #: src/components/common/deleteResource.jsx:144 -#: src/components/storagePools/storagePoolDelete.jsx:203 -#: src/components/storagePools/storagePoolDelete.jsx:239 -#: src/components/storagePools/storagePoolDelete.jsx:249 -#: src/components/vm/deleteDialog.jsx:171 src/components/vm/vmActions.jsx:451 -#: src/components/vm/vmActions.jsx:459 src/components/networks/network.jsx:150 -#: src/components/networks/network.jsx:153 msgid "Delete" msgstr "削除" @@ -597,7 +596,7 @@ msgid "Delete $0 VM?" msgstr "$0 仮想マシンを削除しますか?" -#: src/components/storagePools/storagePoolDelete.jsx:195 +#: src/components/storagePools/storagePoolDelete.jsx:194 msgid "Delete $0 storage pool?" msgstr "$0 ストレージプールを削除しますか?" @@ -618,7 +617,7 @@ msgid "Delete snapshot?" msgstr "スナップショットを削除しますか?" -#: src/components/storagePools/storagePoolDelete.jsx:186 +#: src/components/storagePools/storagePoolDelete.jsx:185 msgid "" "Deleting an inactive storage pool will only undefine the pool. Its content " "will not be deleted." @@ -657,19 +656,19 @@ msgid "Details" msgstr "詳細" +#: src/components/networks/createNetworkDialog.jsx:160 +#: src/components/networks/networkList.jsx:68 #: src/components/vm/disks/vmDiskColumns.jsx:40 -#: src/components/vm/disks/vmDisksCard.jsx:172 #: src/components/vm/disks/diskAdd.jsx:354 +#: src/components/vm/disks/vmDisksCard.jsx:172 +#: src/components/vm/hostdevs/hostDevCard.jsx:98 +#: src/components/vm/hostdevs/hostDevCard.jsx:246 +#: src/components/vm/hostdevs/hostDevAdd.jsx:88 +#: src/components/vm/hostdevs/hostDevAdd.jsx:123 #: src/components/vm/overview/bootOrder.jsx:97 #: src/components/vm/overview/bootOrder.jsx:104 #: src/components/vm/overview/bootOrder.jsx:136 #: src/components/vm/overview/bootOrder.jsx:139 -#: src/components/vm/hostdevs/hostDevAdd.jsx:88 -#: src/components/vm/hostdevs/hostDevAdd.jsx:123 -#: src/components/vm/hostdevs/hostDevCard.jsx:98 -#: src/components/vm/hostdevs/hostDevCard.jsx:246 -#: src/components/networks/networkList.jsx:68 -#: src/components/networks/createNetworkDialog.jsx:160 msgid "Device" msgstr "デバイス" @@ -677,8 +676,8 @@ msgid "Devices" msgstr "デバイス" -#: src/components/vm/consoles/serialConsole.jsx:94 #: src/components/vm/consoles/vnc.jsx:170 +#: src/components/vm/consoles/serialConsole.jsx:94 msgid "Disconnect" msgstr "切断" @@ -727,8 +726,8 @@ msgid "Disk images can be stored in user home directory" msgstr "ディスクイメージはユーザーのホームディレクトリーに保存できます" -#: src/components/vm/disks/diskAdd.jsx:716 #: src/components/vm/disks/diskEdit.jsx:218 +#: src/components/vm/disks/diskAdd.jsx:716 msgid "Disk settings could not be saved" msgstr "ディスク設定を保存できませんでした" @@ -787,7 +786,7 @@ msgstr "終了中" #: src/components/vm/disks/diskEdit.jsx:166 -#: src/components/vm/nics/vmNicsCard.jsx:430 +#: src/components/vm/nics/vmNicsCard.jsx:453 msgid "Edit" msgstr "編集" @@ -803,11 +802,11 @@ msgid "Edit watchdog device type" msgstr "ウォッチドッグデバイスタイプの編集" -#: src/components/vm/nics/vmNicsCard.jsx:418 +#: src/components/vm/nics/vmNicsCard.jsx:441 msgid "Editing network interfaces of transient guests is not allowed" msgstr "一時的なゲストのネットワークインターフェースの編集は許可されていません" -#: src/components/vm/nics/vmNicsCard.jsx:424 +#: src/components/vm/nics/vmNicsCard.jsx:447 msgid "Editing transient network interfaces is not allowed" msgstr "一時的なネットワークインターフェースの編集は許可されていません" @@ -828,7 +827,7 @@ msgid "Enable virtualization support in BIOS/EFI settings." msgstr "BIOS/EFI 設定で仮想化サポートを有効にしてください。" -#: src/components/networks/createNetworkDialog.jsx:224 +#: src/components/networks/createNetworkDialog.jsx:226 msgid "End" msgstr "末尾" @@ -948,10 +947,8 @@ msgstr "再起動の強制" #: src/components/vm/vmActions.jsx:351 -#, fuzzy -#| msgid "Force reboot" msgid "Force reboot $0?" -msgstr "再起動の強制" +msgstr "再起動の強制 $0?" #: src/components/vm/snapshots/vmSnapshotsRevertModal.jsx:99 msgid "Force revert" @@ -962,10 +959,8 @@ msgstr "シャットダウンの強制" #: src/components/vm/vmActions.jsx:287 -#, fuzzy -#| msgid "Force shut down" msgid "Force shut down $0?" -msgstr "シャットダウンの強制" +msgstr "シャットダウンの強制 $0?" #: src/components/storagePools/storageVolumeCreateBody.jsx:69 #: src/components/storagePools/createStoragePoolDialog.jsx:197 @@ -991,8 +986,8 @@ "き込み可能なディスクイメージのみが移行されます。未使用ストレージは、移行後も" "作成元に残ります。" -#: src/components/vm/overview/vmOverviewCard.jsx:159 #: src/components/networks/networkOverviewTab.jsx:110 +#: src/components/vm/overview/vmOverviewCard.jsx:159 msgid "General" msgstr "全般" @@ -1028,13 +1023,13 @@ msgid "Hardware virtualization is disabled" msgstr "ハードウェア仮想化が無効になっています" -#: src/components/vm/disks/diskAdd.jsx:212 #: src/components/vm/filesystems/vmFilesystemsCard.jsx:241 +#: src/components/vm/disks/diskAdd.jsx:212 msgid "Hide additional options" msgstr "その他のオプションを非表示にします" -#: src/components/storagePools/storagePoolOverviewTab.jsx:34 #: src/components/storagePools/createStoragePoolDialog.jsx:121 +#: src/components/storagePools/storagePoolOverviewTab.jsx:34 #: src/components/vm/disks/vmDiskColumns.jsx:44 #: src/components/vm/overview/bootOrder.jsx:101 msgid "Host" @@ -1076,8 +1071,8 @@ msgid "IP" msgstr "IP" -#: src/components/vm/nics/vmNicsCard.jsx:350 #: src/components/networks/networkOverviewTab.jsx:254 +#: src/components/vm/nics/vmNicsCard.jsx:357 msgid "IP address" msgstr "IP アドレス" @@ -1089,7 +1084,7 @@ msgid "IP configuration" msgstr "IP 設定" -#: src/components/networks/createNetworkDialog.jsx:241 +#: src/components/networks/createNetworkDialog.jsx:243 #: src/components/networks/networkOverviewTab.jsx:138 msgid "IPv4 address" msgstr "IPv4 アドレス" @@ -1116,7 +1111,7 @@ msgid "IPv4 only" msgstr "IPv4 のみ" -#: src/components/networks/createNetworkDialog.jsx:271 +#: src/components/networks/createNetworkDialog.jsx:273 #: src/components/networks/networkOverviewTab.jsx:158 msgid "IPv6 address" msgstr "IPv6 アドレス" @@ -1313,7 +1308,7 @@ msgid "Libvirt or hypervisor does not support UEFI" msgstr "libvirtまたはハイパーバイザーがUEFIをサポートしていません" -#: src/components/vm/nics/vmNicsCard.jsx:421 +#: src/components/vm/nics/vmNicsCard.jsx:444 msgid "Loading available network devices" msgstr "利用可能なネットワークデバイスの読み込み" @@ -1335,14 +1330,15 @@ msgid "Location" msgstr "場所" -#: src/components/vm/overview/bootOrder.jsx:111 #: src/components/networks/networkOverviewTab.jsx:68 +#: src/components/vm/overview/bootOrder.jsx:111 msgid "MAC" msgstr "MAC" -#: src/components/vm/nics/vmNicsCard.jsx:344 -#: src/components/vm/nics/nicEdit.jsx:47 src/components/vm/nics/nicAdd.jsx:68 #: src/components/networks/networkOverviewTab.jsx:247 +#: src/components/vm/nics/nicEdit.jsx:47 +#: src/components/vm/nics/vmNicsCard.jsx:351 +#: src/components/vm/nics/nicAdd.jsx:68 msgid "MAC address" msgstr "MAC アドレス" @@ -1374,7 +1370,7 @@ msgid "Manual connection" msgstr "手動接続" -#: src/components/networks/createNetworkDialog.jsx:248 +#: src/components/networks/createNetworkDialog.jsx:250 msgid "Mask or prefix length" msgstr "マスクまたはプレフィックス長" @@ -1415,8 +1411,8 @@ msgstr "メディアは $0 から取り出されます:" #: src/components/create-vm-dialog/createVmDialog.jsx:792 -#: src/components/vm/overview/vmOverviewCard.jsx:182 #: src/components/vm/vmUsageCard.jsx:58 +#: src/components/vm/overview/vmOverviewCard.jsx:182 msgid "Memory" msgstr "メモリー" @@ -1436,8 +1432,8 @@ msgid "MiB" msgstr "MiB" -#: src/components/vm/vmActions.jsx:425 #: src/components/vm/vmMigrateDialog.jsx:210 +#: src/components/vm/vmActions.jsx:425 msgid "Migrate" msgstr "移行" @@ -1459,7 +1455,7 @@ msgid "Model" msgstr "モデル" -#: src/components/vm/nics/vmNicsCard.jsx:331 +#: src/components/vm/nics/vmNicsCard.jsx:338 msgid "Model type" msgstr "モデルタイプ" @@ -1485,21 +1481,21 @@ msgid "NAT to $0" msgstr "$0 への NAT" -#: src/components/vm/nics/vmNicsCard.jsx:301 +#: src/components/vm/nics/vmNicsCard.jsx:308 msgid "NIC $0 of VM $1 failed to change state" msgstr "仮想マシン $1 の NIC $0 は、状態の変更に失敗しました" #: src/components/create-vm-dialog/createVmDialog.jsx:260 -#: src/components/storagePools/storagePoolList.jsx:68 -#: src/components/storagePools/storageVolumeCreateBody.jsx:38 #: src/components/storagePools/storagePoolVolumesTab.jsx:78 +#: src/components/storagePools/storageVolumeCreateBody.jsx:38 +#: src/components/storagePools/storagePoolList.jsx:68 #: src/components/storagePools/createStoragePoolDialog.jsx:45 -#: src/components/vms/hostvmslist.jsx:144 +#: src/components/networks/createNetworkDialog.jsx:126 +#: src/components/networks/networkList.jsx:67 #: src/components/vm/vmCloneDialog.jsx:93 #: src/components/vm/snapshots/vmSnapshotsCreateModal.jsx:38 #: src/components/vm/snapshots/vmSnapshotsCard.jsx:85 -#: src/components/networks/networkList.jsx:67 -#: src/components/networks/createNetworkDialog.jsx:126 +#: src/components/vms/hostvmslist.jsx:144 msgid "Name" msgstr "名前" @@ -1518,8 +1514,8 @@ msgstr "名前は空欄にできません" #: src/components/storagePools/createStoragePoolDialog.jsx:51 -#: src/components/vm/snapshots/vmSnapshotsCreateModal.jsx:97 #: src/components/networks/createNetworkDialog.jsx:53 +#: src/components/vm/snapshots/vmSnapshotsCreateModal.jsx:97 msgid "Name should not be empty" msgstr "名前は空欄にできません" @@ -1559,11 +1555,11 @@ msgid "Network interface" msgstr "ネットワークインターフェイス" -#: src/components/vm/nics/vmNicsCard.jsx:446 +#: src/components/vm/nics/vmNicsCard.jsx:469 msgid "Network interface $0 could not be removed" msgstr "ネットワークインターフェース $0 は削除できませんでした" -#: src/components/vm/nics/vmNicsCard.jsx:447 +#: src/components/vm/nics/vmNicsCard.jsx:470 msgid "Network interface $0 will be removed from $1" msgstr "ネットワークインターフェース $0 は、$1 から削除されます" @@ -1633,7 +1629,7 @@ msgid "No network devices" msgstr "ネットワークデバイスはありません" -#: src/components/vm/nics/vmNicsCard.jsx:542 +#: src/components/vm/nics/vmNicsCard.jsx:565 msgid "No network interfaces defined for this VM" msgstr "この仮想マシンにはネットワークインターフェースが定義されていません" @@ -1677,7 +1673,7 @@ msgid "No virtual networks" msgstr "仮想ネットワークはありません" -#: src/components/storagePools/storagePoolDelete.jsx:185 +#: src/components/storagePools/storagePoolDelete.jsx:184 msgid "No volumes exist in this storage pool." msgstr "このストレージプールにはボリュームが存在しません。" @@ -1689,7 +1685,7 @@ "非永続的なネットワークは削除できません。非アクティブ化されると、存在しなくな" "ります。" -#: src/components/storagePools/storagePoolDelete.jsx:228 +#: src/components/storagePools/storagePoolDelete.jsx:227 msgid "" "Non-persistent storage pool cannot be deleted. It ceases to exists when it's " "deactivated." @@ -1729,9 +1725,9 @@ "ひとつまたは複数の選択されたボリュームがドメインで使用されています。最初に" "ディスクを切断し、ボリュームが削除できるようにします。" -#: src/components/vm/overview/bootOrder.jsx:368 -#: src/components/vm/overview/memoryModal.jsx:145 #: src/components/vm/nics/nicEdit.jsx:44 +#: src/components/vm/overview/memoryModal.jsx:145 +#: src/components/vm/overview/bootOrder.jsx:368 msgid "Only editable when the guest is shut off" msgstr "ゲストがシャットオフされた場合のみ、編集可能です" @@ -1784,7 +1780,7 @@ msgid "Path to file on host's file system" msgstr "ホストファイルシステムのファイルへのパス" -#: src/helpers.js:283 src/components/vm/vmActions.jsx:209 +#: src/components/vm/vmActions.jsx:209 src/helpers.js:283 msgid "Pause" msgstr "一時停止" @@ -1835,10 +1831,10 @@ msgstr "仮想マシンを起動して、コンソールにアクセスしてください。" #: src/components/vm/disks/vmDiskColumns.jsx:42 -#: src/components/vm/disks/mediaEject.jsx:85 #: src/components/vm/disks/diskAdd.jsx:151 -#: src/components/vm/overview/bootOrder.jsx:99 +#: src/components/vm/disks/mediaEject.jsx:85 #: src/components/vm/deleteDialog.jsx:68 +#: src/components/vm/overview/bootOrder.jsx:99 msgid "Pool" msgstr "プール" @@ -1859,9 +1855,9 @@ msgstr "プールのボリュームは VM が使用します " #: src/components/vm/disks/vmDiskColumns.jsx:45 +#: src/components/vm/nics/vmNicsCard.jsx:162 #: src/components/vm/overview/bootOrder.jsx:102 #: src/components/vm/overview/bootOrder.jsx:118 -#: src/components/vm/nics/vmNicsCard.jsx:162 msgid "Port" msgstr "ポート" @@ -1877,7 +1873,7 @@ msgid "Prefix" msgstr "プレフィックス" -#: src/components/networks/createNetworkDialog.jsx:278 +#: src/components/networks/createNetworkDialog.jsx:280 msgid "Prefix length" msgstr "プレフィックス長" @@ -1897,11 +1893,11 @@ msgid "Private" msgstr "プライベート" -#: src/components/vm/overview/bootOrder.jsx:131 -#: src/components/vm/overview/bootOrder.jsx:146 -#: src/components/vm/hostdevs/hostDevAdd.jsx:128 #: src/components/vm/hostdevs/hostDevCard.jsx:237 #: src/components/vm/hostdevs/hostDevCard.jsx:243 +#: src/components/vm/hostdevs/hostDevAdd.jsx:128 +#: src/components/vm/overview/bootOrder.jsx:131 +#: src/components/vm/overview/bootOrder.jsx:146 msgid "Product" msgstr "製品" @@ -1910,9 +1906,9 @@ msgstr "プロファイル" #: src/components/vm/disks/vmDiskColumns.jsx:41 +#: src/components/vm/hostdevs/hostDevCard.jsx:114 #: src/components/vm/overview/bootOrder.jsx:98 #: src/components/vm/overview/bootOrder.jsx:159 -#: src/components/vm/hostdevs/hostDevCard.jsx:114 msgid "Protocol" msgstr "プロトコル" @@ -1939,8 +1935,8 @@ msgid "Range" msgstr "範囲" -#: src/components/vm/disks/vmDisksCard.jsx:216 #: src/components/vm/disks/diskEdit.jsx:123 +#: src/components/vm/disks/vmDisksCard.jsx:216 msgid "Read-only" msgstr "読み取り専用" @@ -1950,10 +1946,8 @@ msgstr "再起動" #: src/components/vm/vmActions.jsx:331 -#, fuzzy -#| msgid "Reboot" msgid "Reboot $0?" -msgstr "再起動" +msgstr "再起動 $0?" #: src/components/create-vm-dialog/createVmDialog.jsx:339 msgid "Remote URL" @@ -1963,17 +1957,17 @@ msgid "Remote viewer details" msgstr "リモートビューアーの詳細" -#: src/components/vm/disks/vmDiskColumns.jsx:146 -#: src/components/vm/disks/vmDiskColumns.jsx:212 -#: src/components/vm/overview/vsock.jsx:241 -#: src/components/vm/overview/watchdog.jsx:191 +#: src/components/networks/networkOverviewTab.jsx:70 #: src/components/vm/filesystems/vmFilesystemsCard.jsx:59 #: src/components/vm/filesystems/vmFilesystemsCard.jsx:68 -#: src/components/vm/nics/vmNicsCard.jsx:448 -#: src/components/vm/nics/vmNicsCard.jsx:457 +#: src/components/vm/disks/vmDiskColumns.jsx:146 +#: src/components/vm/disks/vmDiskColumns.jsx:212 +#: src/components/vm/nics/vmNicsCard.jsx:471 +#: src/components/vm/nics/vmNicsCard.jsx:480 #: src/components/vm/hostdevs/hostDevCard.jsx:253 #: src/components/vm/hostdevs/hostDevCard.jsx:259 -#: src/components/networks/networkOverviewTab.jsx:70 +#: src/components/vm/overview/watchdog.jsx:191 +#: src/components/vm/overview/vsock.jsx:241 msgid "Remove" msgstr "削除" @@ -1993,7 +1987,7 @@ msgid "Remove host device from VM?" msgstr "仮想マシンからホストデバイスを削除しますか?" -#: src/components/vm/nics/vmNicsCard.jsx:445 +#: src/components/vm/nics/vmNicsCard.jsx:468 msgid "Remove network interface?" msgstr "ネットワークインターフェースを削除しますか?" @@ -2024,8 +2018,8 @@ msgid "Resume" msgstr "再開" -#: src/components/vm/snapshots/vmSnapshotsCard.jsx:168 #: src/components/vm/snapshots/vmSnapshotsRevertModal.jsx:92 +#: src/components/vm/snapshots/vmSnapshotsCard.jsx:168 msgid "Revert" msgstr "元に戻す" @@ -2058,8 +2052,8 @@ msgid "Run" msgstr "実行" -#: src/components/vm/overview/vmOverviewCard.jsx:111 #: src/components/networks/networkOverviewTab.jsx:124 +#: src/components/vm/overview/vmOverviewCard.jsx:111 msgid "Run when host boots" msgstr "ホスト起動時に実行します" @@ -2080,12 +2074,12 @@ msgstr "SPICE ポート" #: src/components/vm/disks/diskEdit.jsx:267 -#: src/components/vm/overview/bootOrder.jsx:315 -#: src/components/vm/overview/vsock.jsx:196 +#: src/components/vm/nics/nicEdit.jsx:182 +#: src/components/vm/overview/firmware.jsx:69 #: src/components/vm/overview/watchdog.jsx:154 #: src/components/vm/overview/memoryModal.jsx:156 -#: src/components/vm/overview/firmware.jsx:69 -#: src/components/vm/nics/nicEdit.jsx:182 +#: src/components/vm/overview/bootOrder.jsx:315 +#: src/components/vm/overview/vsock.jsx:196 msgid "Save" msgstr "保存" @@ -2102,10 +2096,8 @@ msgstr "マスク不可割り込みを送信します" #: src/components/vm/vmActions.jsx:308 -#, fuzzy -#| msgid "Send non-maskable interrupt" msgid "Send non-maskable interrupt to $0?" -msgstr "マスク不可割り込みを送信します" +msgstr "マスク不可割り込みを $0? に送信します" #: src/components/vm/disks/vmDiskColumns.jsx:102 msgid "Serial" @@ -2157,8 +2149,8 @@ msgid "Shared storage" msgstr "共有ストレージ" -#: src/components/vm/disks/diskAdd.jsx:212 #: src/components/vm/filesystems/vmFilesystemsCard.jsx:241 +#: src/components/vm/disks/diskAdd.jsx:212 msgid "Show additional options" msgstr "その他のオプションを表示します" @@ -2176,10 +2168,8 @@ msgstr "シャットダウン" #: src/components/vm/vmActions.jsx:236 src/components/vm/vmActions.jsx:267 -#, fuzzy -#| msgid "Shut down" msgid "Shut down $0?" -msgstr "シャットダウン" +msgstr "シャットダウン $0?" #: src/helpers.js:228 msgid "Shut off" @@ -2189,21 +2179,21 @@ msgid "Shut off the VM in order to edit firmware configuration" msgstr "ファームウェア設定を編集するためにVMをシャットオフ" -#: src/helpers.js:227 src/components/vm/snapshots/vmSnapshotsCard.jsx:119 +#: src/components/vm/snapshots/vmSnapshotsCard.jsx:119 src/helpers.js:227 msgid "Shutting down" msgstr "シャットダウン中" -#: src/components/storagePools/storagePoolList.jsx:69 -#: src/components/storagePools/storageVolumeCreateBody.jsx:83 #: src/components/storagePools/storagePoolVolumesTab.jsx:78 +#: src/components/storagePools/storageVolumeCreateBody.jsx:83 +#: src/components/storagePools/storagePoolList.jsx:69 msgid "Size" msgstr "サイズ" -#: src/components/vm/overview/bootOrder.jsx:147 -#: src/components/vm/hostdevs/hostDevAdd.jsx:101 #: src/components/vm/hostdevs/hostDevCard.jsx:101 #: src/components/vm/hostdevs/hostDevCard.jsx:108 #: src/components/vm/hostdevs/hostDevCard.jsx:238 +#: src/components/vm/hostdevs/hostDevAdd.jsx:101 +#: src/components/vm/overview/bootOrder.jsx:147 msgid "Slot" msgstr "スロット" @@ -2236,10 +2226,10 @@ msgstr "一部の設定変更は、再起動後にのみ有効になります:" #: src/components/storagePools/storagePoolOverviewTab.jsx:51 -#: src/components/vm/disks/vmDisksCard.jsx:190 #: src/components/vm/disks/diskAdd.jsx:753 #: src/components/vm/disks/diskAdd.jsx:789 -#: src/components/vm/nics/vmNicsCard.jsx:384 +#: src/components/vm/disks/vmDisksCard.jsx:190 +#: src/components/vm/nics/vmNicsCard.jsx:407 #: src/components/vm/nics/nicBody.jsx:197 #: src/components/vm/hostdevs/hostDevCard.jsx:219 msgid "Source" @@ -2253,10 +2243,10 @@ msgid "Source must not be empty" msgstr "ソースは空欄にできません" -#: src/components/storagePools/storagePoolOverviewTab.jsx:41 -#: src/components/storagePools/storagePoolOverviewTab.jsx:46 #: src/components/storagePools/createStoragePoolDialog.jsx:171 #: src/components/storagePools/createStoragePoolDialog.jsx:188 +#: src/components/storagePools/storagePoolOverviewTab.jsx:41 +#: src/components/storagePools/storagePoolOverviewTab.jsx:46 #: src/components/vm/filesystems/vmFilesystemsCard.jsx:48 #: src/components/vm/filesystems/vmFilesystemsCard.jsx:65 #: src/components/vm/filesystems/vmFilesystemsCard.jsx:204 @@ -2276,7 +2266,7 @@ msgid "Source volume group" msgstr "ソースボリュームグループ" -#: src/components/networks/createNetworkDialog.jsx:218 +#: src/components/networks/createNetworkDialog.jsx:219 msgid "Start" msgstr "開始日" @@ -2294,11 +2284,11 @@ msgstr "起動" #: src/components/storagePools/storagePoolList.jsx:71 +#: src/components/networks/networkList.jsx:71 +#: src/components/vm/nics/vmNicsCard.jsx:412 +#: src/components/vm/overview/vmOverviewCard.jsx:168 #: src/components/vms/hostvmslist.jsx:106 #: src/components/vms/hostvmslist.jsx:146 -#: src/components/vm/overview/vmOverviewCard.jsx:168 -#: src/components/vm/nics/vmNicsCard.jsx:389 -#: src/components/networks/networkList.jsx:71 msgid "State" msgstr "状態" @@ -2389,23 +2379,21 @@ msgstr "システム" #: src/components/vm/nics/vmNicsCard.jsx:189 -#, fuzzy -#| msgid "Host device" msgid "TAP device" -msgstr "ホストデバイス" +msgstr "TAP デバイス" #: src/components/vm/hostdevs/hostDevAdd.jsx:126 msgid "Table of selectable host devices" msgstr "選択可能なホストデバイスの表" #: src/components/vm/disks/vmDiskColumns.jsx:150 -#: src/components/vm/overview/bootOrder.jsx:153 #: src/components/vm/hostdevs/hostDevCard.jsx:109 +#: src/components/vm/overview/bootOrder.jsx:153 msgid "Target" msgstr "ターゲット" -#: src/components/storagePools/storagePoolOverviewTab.jsx:61 #: src/components/storagePools/createStoragePoolDialog.jsx:103 +#: src/components/storagePools/storagePoolOverviewTab.jsx:61 msgid "Target path" msgstr "ターゲットパス" @@ -2426,8 +2414,8 @@ msgstr "仮想マシン $0 が実行中で、削除前に強制的にオフになります。" #: src/components/vm/disks/vmDiskColumns.jsx:220 -#: src/components/vm/nics/vmNicsCard.jsx:458 -#: src/components/vm/nics/vmNicsCard.jsx:466 +#: src/components/vm/nics/vmNicsCard.jsx:481 +#: src/components/vm/nics/vmNicsCard.jsx:489 msgid "The VM needs to be running or shut off to detach this device" msgstr "" "このデバイスを切断するには、VM を実行するか、シャットオフする必要があります" @@ -2542,17 +2530,17 @@ msgid "Troubleshoot" msgstr "トラブルシュート" -#: src/components/storagePools/storagePoolOverviewTab.jsx:76 #: src/components/storagePools/createStoragePoolDialog.jsx:81 +#: src/components/storagePools/storagePoolOverviewTab.jsx:76 +#: src/components/vm/nics/vmNicsCard.jsx:325 +#: src/components/vm/hostdevs/hostDevCard.jsx:179 +#: src/components/vm/hostdevs/hostDevAdd.jsx:47 #: src/components/vm/overview/bootOrder.jsx:116 #: src/components/vm/overview/bootOrder.jsx:129 #: src/components/vm/overview/bootOrder.jsx:144 #: src/components/vm/overview/bootOrder.jsx:151 #: src/components/vm/overview/bootOrder.jsx:158 #: src/components/vm/overview/bootOrder.jsx:164 -#: src/components/vm/nics/vmNicsCard.jsx:318 -#: src/components/vm/hostdevs/hostDevAdd.jsx:47 -#: src/components/vm/hostdevs/hostDevCard.jsx:179 msgid "Type" msgstr "タイプ" @@ -2592,7 +2580,7 @@ msgid "Unit" msgstr "単位" -#: src/components/vm/nics/vmNicsCard.jsx:356 +#: src/components/vm/nics/vmNicsCard.jsx:377 msgid "Unknown" msgstr "不明" @@ -2600,16 +2588,16 @@ msgid "Unknown firmware" msgstr "不明なファームウェア" -#: src/components/vm/overview/bootOrder.jsx:135 -#: src/components/vm/overview/bootOrder.jsx:136 #: src/components/vm/hostdevs/hostDevCard.jsx:92 #: src/components/vm/hostdevs/hostDevCard.jsx:93 +#: src/components/vm/overview/bootOrder.jsx:135 +#: src/components/vm/overview/bootOrder.jsx:136 msgid "Unspecified" msgstr "指定なし" #: src/components/vm/confirmDialog.jsx:70 msgid "Uptime" -msgstr "" +msgstr "稼働時間" #: src/components/vm/disks/diskEdit.jsx:44 msgid "Url" @@ -2754,21 +2742,21 @@ msgid "Valid token" msgstr "有効なトークン" -#: src/components/vm/overview/bootOrder.jsx:130 -#: src/components/vm/overview/bootOrder.jsx:145 -#: src/components/vm/hostdevs/hostDevAdd.jsx:128 #: src/components/vm/hostdevs/hostDevCard.jsx:209 #: src/components/vm/hostdevs/hostDevCard.jsx:236 #: src/components/vm/hostdevs/hostDevCard.jsx:242 +#: src/components/vm/hostdevs/hostDevAdd.jsx:128 +#: src/components/vm/overview/bootOrder.jsx:130 +#: src/components/vm/overview/bootOrder.jsx:145 msgid "Vendor" msgstr "ベンダー" #: src/components/storagePools/storagePoolList.jsx:52 -#: src/components/vms/hostvmslist.jsx:138 -#: src/components/vms/hostvmslist.jsx:141 +#: src/components/networks/networkList.jsx:51 #: src/components/vm/vmDetailsPage.jsx:87 -#: src/components/vm/vmDetailsPage.jsx:247 -#: src/components/networks/networkList.jsx:51 src/manifest.json:0 +#: src/components/vm/vmDetailsPage.jsx:249 +#: src/components/vms/hostvmslist.jsx:138 +#: src/components/vms/hostvmslist.jsx:141 src/manifest.json:0 msgid "Virtual machines" msgstr "仮想マシン" @@ -2780,7 +2768,7 @@ msgid "Virtual network" msgstr "仮想ネットワーク" -#: src/components/networks/createNetworkDialog.jsx:375 +#: src/components/networks/createNetworkDialog.jsx:377 msgid "Virtual network failed to be created" msgstr "仮想ネットワークの作成に失敗しました" @@ -2800,10 +2788,10 @@ #: src/components/create-vm-dialog/createVmDialog.jsx:900 #: src/components/vm/disks/vmDiskColumns.jsx:43 -#: src/components/vm/disks/mediaEject.jsx:89 #: src/components/vm/disks/diskAdd.jsx:117 -#: src/components/vm/overview/bootOrder.jsx:100 +#: src/components/vm/disks/mediaEject.jsx:89 #: src/components/vm/deleteDialog.jsx:65 +#: src/components/vm/overview/bootOrder.jsx:100 msgid "Volume" msgstr "音量" @@ -2823,13 +2811,13 @@ msgid "Vsock" msgstr "Vsock" -#: src/components/vm/overview/bootOrder.jsx:160 #: src/components/vm/hostdevs/hostDevCard.jsx:115 +#: src/components/vm/overview/bootOrder.jsx:160 msgid "WWPN" msgstr "WWPN" -#: src/components/common/needsShutdown.jsx:114 #: src/components/vm/overview/vmOverviewCard.jsx:208 +#: src/components/common/needsShutdown.jsx:114 msgid "Watchdog" msgstr "ウォッチドッグ" @@ -2843,13 +2831,13 @@ "チドッグデバイスを使用するには、ゲストシステムに追加のドライバーと実行中の" "ウォッチドッグサービスも必要です。" -#: src/components/vm/disks/vmDisksCard.jsx:216 #: src/components/vm/disks/diskEdit.jsx:132 +#: src/components/vm/disks/vmDisksCard.jsx:216 msgid "Writeable" msgstr "書き込み可能" -#: src/components/vm/disks/vmDisksCard.jsx:216 #: src/components/vm/disks/diskEdit.jsx:141 +#: src/components/vm/disks/vmDisksCard.jsx:216 msgid "Writeable and shared" msgstr "書き込み可能で共有済み" @@ -2866,8 +2854,8 @@ msgid "active" msgstr "アクティブ" -#: src/components/vm/overview/vsock.jsx:293 #: src/components/vm/overview/watchdog.jsx:242 +#: src/components/vm/overview/vsock.jsx:293 msgid "add" msgstr "追加" @@ -2883,7 +2871,7 @@ msgid "cdrom" msgstr "cdrom" -#: src/helpers.js:244 src/components/vm/overview/cpuModal.jsx:321 +#: src/components/vm/overview/cpuModal.jsx:321 src/helpers.js:244 msgid "custom" msgstr "カスタム" @@ -2903,11 +2891,11 @@ msgid "down" msgstr "下へ" -#: src/components/vm/overview/bootOrder.jsx:361 #: src/components/vm/overview/vmOverviewCard.jsx:122 #: src/components/vm/overview/vmOverviewCard.jsx:130 -#: src/components/vm/overview/vsock.jsx:293 #: src/components/vm/overview/watchdog.jsx:242 +#: src/components/vm/overview/bootOrder.jsx:361 +#: src/components/vm/overview/vsock.jsx:293 msgid "edit" msgstr "編集" @@ -2956,13 +2944,13 @@ msgid "inactive" msgstr "非アクティブ" -#: src/components/vm/nics/vmNicsCard.jsx:362 +#: src/components/vm/nics/vmNicsCard.jsx:385 msgid "inet" -msgstr "" +msgstr "inet" -#: src/components/vm/nics/vmNicsCard.jsx:370 +#: src/components/vm/nics/vmNicsCard.jsx:393 msgid "inet6" -msgstr "" +msgstr "inet6" #: src/manifest.json:0 msgid "iso" @@ -2976,11 +2964,11 @@ msgid "mcast" msgstr "mcast" -#: src/components/common/machinesConnectionSelector.jsx:82 -#: src/components/vm/overview/vsock.jsx:226 #: src/components/vm/filesystems/vmFilesystemsCard.jsx:194 #: src/components/vm/nics/nicBody.jsx:110 #: src/components/vm/vmDetailsPage.jsx:202 +#: src/components/vm/overview/vsock.jsx:226 +#: src/components/common/machinesConnectionSelector.jsx:82 msgid "more info" msgstr "詳細情報" @@ -2997,9 +2985,9 @@ msgid "network" msgstr "ネットワーク" -#: src/helpers.js:273 src/components/storagePools/storagePoolOverviewTab.jsx:67 +#: src/components/storagePools/storagePoolOverviewTab.jsx:67 #: src/components/storagePools/storagePoolOverviewTab.jsx:72 -#: src/components/networks/networkOverviewTab.jsx:115 +#: src/components/networks/networkOverviewTab.jsx:115 src/helpers.js:273 msgid "no" msgstr "いいえ" @@ -3007,9 +2995,9 @@ msgid "no state saved" msgstr "保存されている状態がありません" -#: src/components/vm/overview/vsock.jsx:275 -#: src/components/vm/overview/watchdog.jsx:238 #: src/components/networks/networkOverviewTab.jsx:293 +#: src/components/vm/overview/watchdog.jsx:238 +#: src/components/vm/overview/vsock.jsx:275 msgid "none" msgstr "なし" @@ -3111,9 +3099,9 @@ msgid "vsock requires special software" msgstr "vsock には特別なソフトウェアが必要です" -#: src/helpers.js:272 src/components/storagePools/storagePoolOverviewTab.jsx:67 +#: src/components/storagePools/storagePoolOverviewTab.jsx:67 #: src/components/storagePools/storagePoolOverviewTab.jsx:72 -#: src/components/networks/networkOverviewTab.jsx:115 +#: src/components/networks/networkOverviewTab.jsx:115 src/helpers.js:272 msgid "yes" msgstr "はい" diff -Nru cockpit-machines-295/po/ka.po cockpit-machines-298/po/ka.po --- cockpit-machines-295/po/ka.po 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/po/ka.po 2023-09-04 12:22:47.000000000 +0000 @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE_VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-18 03:14+0000\n" +"POT-Creation-Date: 2023-09-05 02:50+0000\n" "PO-Revision-Date: 2023-07-05 14:21+0000\n" "Last-Translator: Temuri Doghonadze \n" "Language-Team: Georgian \n" "Language-Team: Korean \n" "Language-Team: Norwegian Bokmål \n" "Language-Team: Dutch \n" "Language-Team: Polish \n" "Language-Team: Russian \n" "Language-Team: Swedish \n" "Language-Team: Turkish \n" "Language-Team: Ukrainian \n" +"POT-Creation-Date: 2023-09-05 02:50+0000\n" +"PO-Revision-Date: 2023-09-06 00:24+0000\n" +"Last-Translator: Tony Fu \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_CN\n" @@ -29,11 +29,11 @@ "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0\n" -"X-Generator: Weblate 4.17\n" +"X-Generator: Weblate 4.18.2\n" #: src/components/create-vm-dialog/createVmDialog.jsx:827 msgid "$0 $1 available at default location" -msgstr "$0 $1 位于默认位置" +msgstr "$0 $1 在默认位置可用" #: src/components/create-vm-dialog/createVmDialog.jsx:240 #: src/components/create-vm-dialog/createVmDialog.jsx:773 @@ -74,8 +74,8 @@ msgid "$0 network" msgstr "$0 网络" -#: src/components/vm/overview/vmOverviewCard.jsx:145 #: src/components/vm/vmUsageCard.jsx:47 +#: src/components/vm/overview/vmOverviewCard.jsx:145 msgid "$0 vCPU" msgid_plural "$0 vCPUs" msgstr[0] "$0 vCPU" @@ -92,8 +92,8 @@ "一个虚拟机的副本将在目标上运行,并在其关闭时消失。同时,原始主机会保留其虚拟" "机配置的副本。" -#: src/components/vm/disks/vmDisksCard.jsx:188 #: src/components/vm/disks/diskEdit.jsx:115 +#: src/components/vm/disks/vmDisksCard.jsx:188 msgid "Access" msgstr "访问" @@ -110,12 +110,12 @@ msgid "Activate the storage pool to administer volumes" msgstr "激活存储池以管理卷" +#: src/components/networks/networkOverviewTab.jsx:236 #: src/components/vm/disks/diskAdd.jsx:863 -#: src/components/vm/overview/vsock.jsx:196 -#: src/components/vm/overview/watchdog.jsx:154 #: src/components/vm/nics/nicAdd.jsx:213 #: src/components/vm/hostdevs/hostDevAdd.jsx:229 -#: src/components/networks/networkOverviewTab.jsx:236 +#: src/components/vm/overview/watchdog.jsx:154 +#: src/components/vm/overview/vsock.jsx:196 msgid "Add" msgstr "添加" @@ -123,13 +123,13 @@ msgid "Add a DHCP static host entry" msgstr "添加一个DHCP静态主机条目" -#: src/components/vm/disks/vmDisksCard.jsx:75 #: src/components/vm/disks/diskAdd.jsx:853 +#: src/components/vm/disks/vmDisksCard.jsx:75 msgid "Add disk" msgstr "添加磁盘" -#: src/components/vm/hostdevs/hostDevAdd.jsx:244 #: src/components/vm/hostdevs/hostDevCard.jsx:148 +#: src/components/vm/hostdevs/hostDevAdd.jsx:244 msgid "Add host device" msgstr "添加主机设备" @@ -169,10 +169,10 @@ msgid "Additional" msgstr "额外" -#: src/components/vm/nics/vmNicsCard.jsx:154 -#: src/components/vm/consoles/desktopConsole.jsx:47 #: src/components/networks/networkOverviewTab.jsx:142 #: src/components/networks/networkOverviewTab.jsx:162 +#: src/components/vm/nics/vmNicsCard.jsx:154 +#: src/components/vm/consoles/desktopConsole.jsx:47 msgid "Address" msgstr "地址" @@ -200,7 +200,7 @@ "(-, _, +, .)" msgstr "允许的字符:基本的拉丁字母、数字和有限的标点(-、_、+、.)" -#: src/components/storagePools/storagePoolDelete.jsx:176 +#: src/components/storagePools/storagePoolDelete.jsx:175 msgid "Also delete all volumes inside this pool:" msgstr "同时删除这个池中的所有卷:" @@ -239,8 +239,8 @@ msgstr "自动化" #: src/components/storagePools/storagePoolOverviewTab.jsx:71 -#: src/components/vm/overview/vmOverviewCard.jsx:200 #: src/components/networks/networkOverviewTab.jsx:119 +#: src/components/vm/overview/vmOverviewCard.jsx:200 msgid "Autostart" msgstr "自动启动" @@ -256,18 +256,18 @@ msgid "Boot order settings could not be saved" msgstr "无法保存启动顺序" -#: src/components/vm/disks/vmDisksCard.jsx:186 -#: src/components/vm/disks/diskAdd.jsx:227 #: src/components/vm/disks/diskEdit.jsx:90 +#: src/components/vm/disks/diskAdd.jsx:227 +#: src/components/vm/disks/vmDisksCard.jsx:186 +#: src/components/vm/hostdevs/hostDevCard.jsx:99 +#: src/components/vm/hostdevs/hostDevCard.jsx:107 +#: src/components/vm/hostdevs/hostDevCard.jsx:247 +#: src/components/vm/hostdevs/hostDevAdd.jsx:89 #: src/components/vm/overview/bootOrder.jsx:105 #: src/components/vm/overview/bootOrder.jsx:117 #: src/components/vm/overview/bootOrder.jsx:135 #: src/components/vm/overview/bootOrder.jsx:138 #: src/components/vm/overview/bootOrder.jsx:152 -#: src/components/vm/hostdevs/hostDevAdd.jsx:89 -#: src/components/vm/hostdevs/hostDevCard.jsx:99 -#: src/components/vm/hostdevs/hostDevCard.jsx:107 -#: src/components/vm/hostdevs/hostDevCard.jsx:247 msgid "Bus" msgstr "总线" @@ -275,9 +275,9 @@ msgid "CD/DVD disc" msgstr "CD/DVD 盘" -#: src/components/common/needsShutdown.jsx:110 -#: src/components/vm/overview/vmOverviewCard.jsx:187 #: src/components/vm/vmUsageCard.jsx:69 +#: src/components/vm/overview/vmOverviewCard.jsx:187 +#: src/components/common/needsShutdown.jsx:110 msgid "CPU" msgstr "CPU" @@ -285,50 +285,48 @@ msgid "CPU mode could not be saved" msgstr "无法保存 CPU 模式" +#: src/components/vm/disks/diskEdit.jsx:60 #: src/components/vm/disks/vmDiskColumns.jsx:101 #: src/components/vm/disks/diskAdd.jsx:216 -#: src/components/vm/disks/diskEdit.jsx:60 msgid "Cache" msgstr "缓存" #: src/components/create-vm-dialog/createVmDialog.jsx:1392 -#: src/components/common/deleteResource.jsx:91 -#: src/components/storagePools/storagePoolDelete.jsx:206 -#: src/components/storagePools/createStoragePoolDialog.jsx:443 #: src/components/storagePools/storageVolumeCreate.jsx:110 +#: src/components/storagePools/createStoragePoolDialog.jsx:443 +#: src/components/storagePools/storagePoolDelete.jsx:205 +#: src/components/networks/createNetworkDialog.jsx:421 +#: src/components/networks/networkOverviewTab.jsx:239 +#: src/components/vm/filesystems/vmFilesystemsCard.jsx:174 #: src/components/vm/vmCloneDialog.jsx:83 -#: src/components/vm/disks/mediaEject.jsx:110 -#: src/components/vm/disks/diskAdd.jsx:866 +#: src/components/vm/snapshots/vmSnapshotsRevertModal.jsx:102 +#: src/components/vm/snapshots/vmSnapshotsCreateModal.jsx:147 #: src/components/vm/disks/diskEdit.jsx:270 -#: src/components/vm/overview/bootOrder.jsx:318 -#: src/components/vm/overview/vsock.jsx:244 -#: src/components/vm/overview/watchdog.jsx:194 -#: src/components/vm/overview/memoryModal.jsx:159 -#: src/components/vm/overview/cpuModal.jsx:338 -#: src/components/vm/overview/firmware.jsx:72 -#: src/components/vm/confirmDialog.jsx:54 -#: src/components/vm/filesystems/vmFilesystemsCard.jsx:174 +#: src/components/vm/disks/diskAdd.jsx:866 +#: src/components/vm/disks/mediaEject.jsx:110 #: src/components/vm/vmRenameDialog.jsx:71 #: src/components/vm/deleteDialog.jsx:174 -#: src/components/vm/snapshots/vmSnapshotsCreateModal.jsx:147 -#: src/components/vm/snapshots/vmSnapshotsRevertModal.jsx:102 -#: src/components/vm/vmMigrateDialog.jsx:213 #: src/components/vm/nics/nicEdit.jsx:185 src/components/vm/nics/nicAdd.jsx:216 +#: src/components/vm/confirmDialog.jsx:54 #: src/components/vm/hostdevs/hostDevAdd.jsx:234 -#: src/components/networks/createNetworkDialog.jsx:419 -#: src/components/networks/networkOverviewTab.jsx:239 +#: src/components/vm/vmMigrateDialog.jsx:213 +#: src/components/vm/overview/firmware.jsx:72 +#: src/components/vm/overview/watchdog.jsx:194 +#: src/components/vm/overview/memoryModal.jsx:159 +#: src/components/vm/overview/bootOrder.jsx:318 +#: src/components/vm/overview/vsock.jsx:244 +#: src/components/vm/overview/cpuModal.jsx:338 +#: src/components/common/deleteResource.jsx:91 msgid "Cancel" msgstr "取消" #: src/components/vm/overview/vsock.jsx:203 msgid "Cannot edit vsock device on a transient VM" -msgstr "" +msgstr "无法编辑临时虚拟机上的 vsock 设备" #: src/components/vm/overview/watchdog.jsx:161 -#, fuzzy -#| msgid "Edit watchdog device type" msgid "Cannot edit watchdog device on a transient VM" -msgstr "编辑 watchdog 设备类型" +msgstr "无法编辑临时虚拟机上的 watchdog 设置" #: src/components/vm/disks/vmDisksCard.jsx:184 msgid "Capacity" @@ -410,12 +408,12 @@ msgid "Connecting" msgstr "连接中" -#: src/components/common/machinesConnectionSelector.jsx:39 #: src/components/storagePools/storagePoolList.jsx:70 -#: src/components/vms/hostvmslist.jsx:145 -#: src/components/vm/overview/vmOverviewCard.jsx:163 -#: src/components/networks/networkList.jsx:69 #: src/components/networks/createNetworkDialog.jsx:41 +#: src/components/networks/networkList.jsx:69 +#: src/components/vm/overview/vmOverviewCard.jsx:163 +#: src/components/common/machinesConnectionSelector.jsx:39 +#: src/components/vms/hostvmslist.jsx:145 msgid "Connection" msgstr "连接" @@ -457,10 +455,10 @@ msgid "Crashed" msgstr "已崩溃" -#: src/components/storagePools/createStoragePoolDialog.jsx:440 #: src/components/storagePools/storageVolumeCreate.jsx:107 +#: src/components/storagePools/createStoragePoolDialog.jsx:440 +#: src/components/networks/createNetworkDialog.jsx:418 #: src/components/vm/snapshots/vmSnapshotsCreateModal.jsx:144 -#: src/components/networks/createNetworkDialog.jsx:416 msgid "Create" msgstr "创建" @@ -518,8 +516,8 @@ msgid "Create storage volume" msgstr "创建存储卷" -#: src/components/networks/createNetworkDialog.jsx:409 -#: src/components/networks/createNetworkDialog.jsx:437 +#: src/components/networks/createNetworkDialog.jsx:411 +#: src/components/networks/createNetworkDialog.jsx:439 msgid "Create virtual network" msgstr "创建虚拟网络" @@ -579,15 +577,16 @@ msgid "Deactivate" msgstr "取消激活" +#: src/components/storagePools/storagePoolDelete.jsx:202 +#: src/components/storagePools/storagePoolDelete.jsx:238 +#: src/components/storagePools/storagePoolDelete.jsx:248 +#: src/components/networks/network.jsx:150 +#: src/components/networks/network.jsx:153 +#: src/components/vm/deleteDialog.jsx:171 src/components/vm/vmActions.jsx:451 +#: src/components/vm/vmActions.jsx:459 #: src/components/common/deleteResource.jsx:79 #: src/components/common/deleteResource.jsx:133 #: src/components/common/deleteResource.jsx:144 -#: src/components/storagePools/storagePoolDelete.jsx:203 -#: src/components/storagePools/storagePoolDelete.jsx:239 -#: src/components/storagePools/storagePoolDelete.jsx:249 -#: src/components/vm/deleteDialog.jsx:171 src/components/vm/vmActions.jsx:451 -#: src/components/vm/vmActions.jsx:459 src/components/networks/network.jsx:150 -#: src/components/networks/network.jsx:153 msgid "Delete" msgstr "删除" @@ -595,7 +594,7 @@ msgid "Delete $0 VM?" msgstr "删除 $0 虚拟机?" -#: src/components/storagePools/storagePoolDelete.jsx:195 +#: src/components/storagePools/storagePoolDelete.jsx:194 msgid "Delete $0 storage pool?" msgstr "删除 $0 存储池?" @@ -616,7 +615,7 @@ msgid "Delete snapshot?" msgstr "删除快照?" -#: src/components/storagePools/storagePoolDelete.jsx:186 +#: src/components/storagePools/storagePoolDelete.jsx:185 msgid "" "Deleting an inactive storage pool will only undefine the pool. Its content " "will not be deleted." @@ -652,19 +651,19 @@ msgid "Details" msgstr "详情" +#: src/components/networks/createNetworkDialog.jsx:160 +#: src/components/networks/networkList.jsx:68 #: src/components/vm/disks/vmDiskColumns.jsx:40 -#: src/components/vm/disks/vmDisksCard.jsx:172 #: src/components/vm/disks/diskAdd.jsx:354 +#: src/components/vm/disks/vmDisksCard.jsx:172 +#: src/components/vm/hostdevs/hostDevCard.jsx:98 +#: src/components/vm/hostdevs/hostDevCard.jsx:246 +#: src/components/vm/hostdevs/hostDevAdd.jsx:88 +#: src/components/vm/hostdevs/hostDevAdd.jsx:123 #: src/components/vm/overview/bootOrder.jsx:97 #: src/components/vm/overview/bootOrder.jsx:104 #: src/components/vm/overview/bootOrder.jsx:136 #: src/components/vm/overview/bootOrder.jsx:139 -#: src/components/vm/hostdevs/hostDevAdd.jsx:88 -#: src/components/vm/hostdevs/hostDevAdd.jsx:123 -#: src/components/vm/hostdevs/hostDevCard.jsx:98 -#: src/components/vm/hostdevs/hostDevCard.jsx:246 -#: src/components/networks/networkList.jsx:68 -#: src/components/networks/createNetworkDialog.jsx:160 msgid "Device" msgstr "设备" @@ -672,8 +671,8 @@ msgid "Devices" msgstr "设备" -#: src/components/vm/consoles/serialConsole.jsx:94 #: src/components/vm/consoles/vnc.jsx:170 +#: src/components/vm/consoles/serialConsole.jsx:94 msgid "Disconnect" msgstr "断开" @@ -722,8 +721,8 @@ msgid "Disk images can be stored in user home directory" msgstr "磁盘镜像可以存储在用户主目录中" -#: src/components/vm/disks/diskAdd.jsx:716 #: src/components/vm/disks/diskEdit.jsx:218 +#: src/components/vm/disks/diskAdd.jsx:716 msgid "Disk settings could not be saved" msgstr "磁盘设置不能被保存" @@ -781,7 +780,7 @@ msgstr "停止工作" #: src/components/vm/disks/diskEdit.jsx:166 -#: src/components/vm/nics/vmNicsCard.jsx:430 +#: src/components/vm/nics/vmNicsCard.jsx:453 msgid "Edit" msgstr "编辑" @@ -797,11 +796,11 @@ msgid "Edit watchdog device type" msgstr "编辑 watchdog 设备类型" -#: src/components/vm/nics/vmNicsCard.jsx:418 +#: src/components/vm/nics/vmNicsCard.jsx:441 msgid "Editing network interfaces of transient guests is not allowed" msgstr "不允许编辑临时客户机的网络接口" -#: src/components/vm/nics/vmNicsCard.jsx:424 +#: src/components/vm/nics/vmNicsCard.jsx:447 msgid "Editing transient network interfaces is not allowed" msgstr "不允许编辑临时网络接口" @@ -822,7 +821,7 @@ msgid "Enable virtualization support in BIOS/EFI settings." msgstr "在 BIOS/EFI 设置中启用虚拟化支持。" -#: src/components/networks/createNetworkDialog.jsx:224 +#: src/components/networks/createNetworkDialog.jsx:226 msgid "End" msgstr "结束" @@ -942,10 +941,8 @@ msgstr "强制重启" #: src/components/vm/vmActions.jsx:351 -#, fuzzy -#| msgid "Force reboot" msgid "Force reboot $0?" -msgstr "强制重启" +msgstr "强制重启 $0?" #: src/components/vm/snapshots/vmSnapshotsRevertModal.jsx:99 msgid "Force revert" @@ -956,10 +953,8 @@ msgstr "强制关机" #: src/components/vm/vmActions.jsx:287 -#, fuzzy -#| msgid "Force shut down" msgid "Force shut down $0?" -msgstr "强制关机" +msgstr "强制关闭 $0?" #: src/components/storagePools/storageVolumeCreateBody.jsx:69 #: src/components/storagePools/createStoragePoolDialog.jsx:197 @@ -984,8 +979,8 @@ "完整的磁盘镜像和域的内存将被迁移。只有非共享的、可写入磁盘的镜像才会被迁移。" "迁移后,未使用的存储将保留在原始系统上。" -#: src/components/vm/overview/vmOverviewCard.jsx:159 #: src/components/networks/networkOverviewTab.jsx:110 +#: src/components/vm/overview/vmOverviewCard.jsx:159 msgid "General" msgstr "通用" @@ -1021,13 +1016,13 @@ msgid "Hardware virtualization is disabled" msgstr "硬件虚拟化被禁用" -#: src/components/vm/disks/diskAdd.jsx:212 #: src/components/vm/filesystems/vmFilesystemsCard.jsx:241 +#: src/components/vm/disks/diskAdd.jsx:212 msgid "Hide additional options" msgstr "隐藏额外操作" -#: src/components/storagePools/storagePoolOverviewTab.jsx:34 #: src/components/storagePools/createStoragePoolDialog.jsx:121 +#: src/components/storagePools/storagePoolOverviewTab.jsx:34 #: src/components/vm/disks/vmDiskColumns.jsx:44 #: src/components/vm/overview/bootOrder.jsx:101 msgid "Host" @@ -1069,8 +1064,8 @@ msgid "IP" msgstr "IP" -#: src/components/vm/nics/vmNicsCard.jsx:350 #: src/components/networks/networkOverviewTab.jsx:254 +#: src/components/vm/nics/vmNicsCard.jsx:357 msgid "IP address" msgstr "IP 地址" @@ -1082,7 +1077,7 @@ msgid "IP configuration" msgstr "IP 配置" -#: src/components/networks/createNetworkDialog.jsx:241 +#: src/components/networks/createNetworkDialog.jsx:243 #: src/components/networks/networkOverviewTab.jsx:138 msgid "IPv4 address" msgstr "IPv4 地址" @@ -1107,7 +1102,7 @@ msgid "IPv4 only" msgstr "仅 IPv4" -#: src/components/networks/createNetworkDialog.jsx:271 +#: src/components/networks/createNetworkDialog.jsx:273 #: src/components/networks/networkOverviewTab.jsx:158 msgid "IPv6 address" msgstr "IPv6 地址" @@ -1293,7 +1288,7 @@ msgid "Libvirt or hypervisor does not support UEFI" msgstr "Libvirt 或虚拟机管理器不支持 UEFI" -#: src/components/vm/nics/vmNicsCard.jsx:421 +#: src/components/vm/nics/vmNicsCard.jsx:444 msgid "Loading available network devices" msgstr "加载可用的网络设备" @@ -1313,14 +1308,15 @@ msgid "Location" msgstr "位置" -#: src/components/vm/overview/bootOrder.jsx:111 #: src/components/networks/networkOverviewTab.jsx:68 +#: src/components/vm/overview/bootOrder.jsx:111 msgid "MAC" msgstr "MAC" -#: src/components/vm/nics/vmNicsCard.jsx:344 -#: src/components/vm/nics/nicEdit.jsx:47 src/components/vm/nics/nicAdd.jsx:68 #: src/components/networks/networkOverviewTab.jsx:247 +#: src/components/vm/nics/nicEdit.jsx:47 +#: src/components/vm/nics/vmNicsCard.jsx:351 +#: src/components/vm/nics/nicAdd.jsx:68 msgid "MAC address" msgstr "MAC 地址" @@ -1352,7 +1348,7 @@ msgid "Manual connection" msgstr "手动连接" -#: src/components/networks/createNetworkDialog.jsx:248 +#: src/components/networks/createNetworkDialog.jsx:250 msgid "Mask or prefix length" msgstr "掩码或前缀长度" @@ -1391,8 +1387,8 @@ msgstr "介质将从 $0 中弹出:" #: src/components/create-vm-dialog/createVmDialog.jsx:792 -#: src/components/vm/overview/vmOverviewCard.jsx:182 #: src/components/vm/vmUsageCard.jsx:58 +#: src/components/vm/overview/vmOverviewCard.jsx:182 msgid "Memory" msgstr "内存" @@ -1412,8 +1408,8 @@ msgid "MiB" msgstr "MiB" -#: src/components/vm/vmActions.jsx:425 #: src/components/vm/vmMigrateDialog.jsx:210 +#: src/components/vm/vmActions.jsx:425 msgid "Migrate" msgstr "迁移" @@ -1435,7 +1431,7 @@ msgid "Model" msgstr "型号" -#: src/components/vm/nics/vmNicsCard.jsx:331 +#: src/components/vm/nics/vmNicsCard.jsx:338 msgid "Model type" msgstr "型号类型" @@ -1461,21 +1457,21 @@ msgid "NAT to $0" msgstr "NAT 到 $0" -#: src/components/vm/nics/vmNicsCard.jsx:301 +#: src/components/vm/nics/vmNicsCard.jsx:308 msgid "NIC $0 of VM $1 failed to change state" msgstr "VM $1 的 NIC $0 无法改变状态" #: src/components/create-vm-dialog/createVmDialog.jsx:260 -#: src/components/storagePools/storagePoolList.jsx:68 -#: src/components/storagePools/storageVolumeCreateBody.jsx:38 #: src/components/storagePools/storagePoolVolumesTab.jsx:78 +#: src/components/storagePools/storageVolumeCreateBody.jsx:38 +#: src/components/storagePools/storagePoolList.jsx:68 #: src/components/storagePools/createStoragePoolDialog.jsx:45 -#: src/components/vms/hostvmslist.jsx:144 +#: src/components/networks/createNetworkDialog.jsx:126 +#: src/components/networks/networkList.jsx:67 #: src/components/vm/vmCloneDialog.jsx:93 #: src/components/vm/snapshots/vmSnapshotsCreateModal.jsx:38 #: src/components/vm/snapshots/vmSnapshotsCard.jsx:85 -#: src/components/networks/networkList.jsx:67 -#: src/components/networks/createNetworkDialog.jsx:126 +#: src/components/vms/hostvmslist.jsx:144 msgid "Name" msgstr "名称" @@ -1494,8 +1490,8 @@ msgstr "名称不能为空" #: src/components/storagePools/createStoragePoolDialog.jsx:51 -#: src/components/vm/snapshots/vmSnapshotsCreateModal.jsx:97 #: src/components/networks/createNetworkDialog.jsx:53 +#: src/components/vm/snapshots/vmSnapshotsCreateModal.jsx:97 msgid "Name should not be empty" msgstr "名称不应为空" @@ -1535,11 +1531,11 @@ msgid "Network interface" msgstr "网络接口" -#: src/components/vm/nics/vmNicsCard.jsx:446 +#: src/components/vm/nics/vmNicsCard.jsx:469 msgid "Network interface $0 could not be removed" msgstr "无法删除网络接口 $0" -#: src/components/vm/nics/vmNicsCard.jsx:447 +#: src/components/vm/nics/vmNicsCard.jsx:470 msgid "Network interface $0 will be removed from $1" msgstr "网络接口 $0 将从 $1 中删除" @@ -1609,7 +1605,7 @@ msgid "No network devices" msgstr "没有网络设备" -#: src/components/vm/nics/vmNicsCard.jsx:542 +#: src/components/vm/nics/vmNicsCard.jsx:565 msgid "No network interfaces defined for this VM" msgstr "没有为此 VM 定义网络接口" @@ -1653,7 +1649,7 @@ msgid "No virtual networks" msgstr "没有虚拟网络" -#: src/components/storagePools/storagePoolDelete.jsx:185 +#: src/components/storagePools/storagePoolDelete.jsx:184 msgid "No volumes exist in this storage pool." msgstr "这个存储池中没有卷。" @@ -1663,7 +1659,7 @@ "deactivated." msgstr "非持久性网络无法删除。停用后它不再存在。" -#: src/components/storagePools/storagePoolDelete.jsx:228 +#: src/components/storagePools/storagePoolDelete.jsx:227 msgid "" "Non-persistent storage pool cannot be deleted. It ceases to exists when it's " "deactivated." @@ -1699,9 +1695,9 @@ "allow volume deletion." msgstr "一个或多个卷被域使用。需要先分离磁盘后才可以删除卷。" -#: src/components/vm/overview/bootOrder.jsx:368 -#: src/components/vm/overview/memoryModal.jsx:145 #: src/components/vm/nics/nicEdit.jsx:44 +#: src/components/vm/overview/memoryModal.jsx:145 +#: src/components/vm/overview/bootOrder.jsx:368 msgid "Only editable when the guest is shut off" msgstr "只有在客户机关闭后才可以编辑" @@ -1754,7 +1750,7 @@ msgid "Path to file on host's file system" msgstr "到主机文件系统上的文件的路径" -#: src/helpers.js:283 src/components/vm/vmActions.jsx:209 +#: src/components/vm/vmActions.jsx:209 src/helpers.js:283 msgid "Pause" msgstr "暂停" @@ -1804,10 +1800,10 @@ msgstr "请启动虚拟机来访问其控制台。" #: src/components/vm/disks/vmDiskColumns.jsx:42 -#: src/components/vm/disks/mediaEject.jsx:85 #: src/components/vm/disks/diskAdd.jsx:151 -#: src/components/vm/overview/bootOrder.jsx:99 +#: src/components/vm/disks/mediaEject.jsx:85 #: src/components/vm/deleteDialog.jsx:68 +#: src/components/vm/overview/bootOrder.jsx:99 msgid "Pool" msgstr "池" @@ -1828,9 +1824,9 @@ msgstr "池的卷被 VM 使用 " #: src/components/vm/disks/vmDiskColumns.jsx:45 +#: src/components/vm/nics/vmNicsCard.jsx:162 #: src/components/vm/overview/bootOrder.jsx:102 #: src/components/vm/overview/bootOrder.jsx:118 -#: src/components/vm/nics/vmNicsCard.jsx:162 msgid "Port" msgstr "端口" @@ -1846,7 +1842,7 @@ msgid "Prefix" msgstr "前缀" -#: src/components/networks/createNetworkDialog.jsx:278 +#: src/components/networks/createNetworkDialog.jsx:280 msgid "Prefix length" msgstr "前缀长度" @@ -1864,11 +1860,11 @@ msgid "Private" msgstr "私有" -#: src/components/vm/overview/bootOrder.jsx:131 -#: src/components/vm/overview/bootOrder.jsx:146 -#: src/components/vm/hostdevs/hostDevAdd.jsx:128 #: src/components/vm/hostdevs/hostDevCard.jsx:237 #: src/components/vm/hostdevs/hostDevCard.jsx:243 +#: src/components/vm/hostdevs/hostDevAdd.jsx:128 +#: src/components/vm/overview/bootOrder.jsx:131 +#: src/components/vm/overview/bootOrder.jsx:146 msgid "Product" msgstr "产品" @@ -1877,9 +1873,9 @@ msgstr "配置集" #: src/components/vm/disks/vmDiskColumns.jsx:41 +#: src/components/vm/hostdevs/hostDevCard.jsx:114 #: src/components/vm/overview/bootOrder.jsx:98 #: src/components/vm/overview/bootOrder.jsx:159 -#: src/components/vm/hostdevs/hostDevCard.jsx:114 msgid "Protocol" msgstr "协议" @@ -1905,8 +1901,8 @@ msgid "Range" msgstr "范围" -#: src/components/vm/disks/vmDisksCard.jsx:216 #: src/components/vm/disks/diskEdit.jsx:123 +#: src/components/vm/disks/vmDisksCard.jsx:216 msgid "Read-only" msgstr "只读" @@ -1916,10 +1912,8 @@ msgstr "重启" #: src/components/vm/vmActions.jsx:331 -#, fuzzy -#| msgid "Reboot" msgid "Reboot $0?" -msgstr "重启" +msgstr "重启 $0?" #: src/components/create-vm-dialog/createVmDialog.jsx:339 msgid "Remote URL" @@ -1929,17 +1923,17 @@ msgid "Remote viewer details" msgstr "Remote viewer 详情" -#: src/components/vm/disks/vmDiskColumns.jsx:146 -#: src/components/vm/disks/vmDiskColumns.jsx:212 -#: src/components/vm/overview/vsock.jsx:241 -#: src/components/vm/overview/watchdog.jsx:191 +#: src/components/networks/networkOverviewTab.jsx:70 #: src/components/vm/filesystems/vmFilesystemsCard.jsx:59 #: src/components/vm/filesystems/vmFilesystemsCard.jsx:68 -#: src/components/vm/nics/vmNicsCard.jsx:448 -#: src/components/vm/nics/vmNicsCard.jsx:457 +#: src/components/vm/disks/vmDiskColumns.jsx:146 +#: src/components/vm/disks/vmDiskColumns.jsx:212 +#: src/components/vm/nics/vmNicsCard.jsx:471 +#: src/components/vm/nics/vmNicsCard.jsx:480 #: src/components/vm/hostdevs/hostDevCard.jsx:253 #: src/components/vm/hostdevs/hostDevCard.jsx:259 -#: src/components/networks/networkOverviewTab.jsx:70 +#: src/components/vm/overview/watchdog.jsx:191 +#: src/components/vm/overview/vsock.jsx:241 msgid "Remove" msgstr "删除" @@ -1959,7 +1953,7 @@ msgid "Remove host device from VM?" msgstr "从虚拟机中删除主机设备?" -#: src/components/vm/nics/vmNicsCard.jsx:445 +#: src/components/vm/nics/vmNicsCard.jsx:468 msgid "Remove network interface?" msgstr "删除网络接口?" @@ -1988,8 +1982,8 @@ msgid "Resume" msgstr "恢复" -#: src/components/vm/snapshots/vmSnapshotsCard.jsx:168 #: src/components/vm/snapshots/vmSnapshotsRevertModal.jsx:92 +#: src/components/vm/snapshots/vmSnapshotsCard.jsx:168 msgid "Revert" msgstr "恢复" @@ -2022,8 +2016,8 @@ msgid "Run" msgstr "运行" -#: src/components/vm/overview/vmOverviewCard.jsx:111 #: src/components/networks/networkOverviewTab.jsx:124 +#: src/components/vm/overview/vmOverviewCard.jsx:111 msgid "Run when host boots" msgstr "在主机引导时运行" @@ -2044,12 +2038,12 @@ msgstr "SPICE 端口" #: src/components/vm/disks/diskEdit.jsx:267 -#: src/components/vm/overview/bootOrder.jsx:315 -#: src/components/vm/overview/vsock.jsx:196 +#: src/components/vm/nics/nicEdit.jsx:182 +#: src/components/vm/overview/firmware.jsx:69 #: src/components/vm/overview/watchdog.jsx:154 #: src/components/vm/overview/memoryModal.jsx:156 -#: src/components/vm/overview/firmware.jsx:69 -#: src/components/vm/nics/nicEdit.jsx:182 +#: src/components/vm/overview/bootOrder.jsx:315 +#: src/components/vm/overview/vsock.jsx:196 msgid "Save" msgstr "保存" @@ -2066,10 +2060,8 @@ msgstr "发送不可屏蔽中断" #: src/components/vm/vmActions.jsx:308 -#, fuzzy -#| msgid "Send non-maskable interrupt" msgid "Send non-maskable interrupt to $0?" -msgstr "发送不可屏蔽中断" +msgstr "向 $0 发送不可屏蔽中断?" #: src/components/vm/disks/vmDiskColumns.jsx:102 msgid "Serial" @@ -2118,8 +2110,8 @@ msgid "Shared storage" msgstr "共享的存储" -#: src/components/vm/disks/diskAdd.jsx:212 #: src/components/vm/filesystems/vmFilesystemsCard.jsx:241 +#: src/components/vm/disks/diskAdd.jsx:212 msgid "Show additional options" msgstr "显示额外操作" @@ -2137,10 +2129,8 @@ msgstr "关机" #: src/components/vm/vmActions.jsx:236 src/components/vm/vmActions.jsx:267 -#, fuzzy -#| msgid "Shut down" msgid "Shut down $0?" -msgstr "关机" +msgstr "关闭 $0?" #: src/helpers.js:228 msgid "Shut off" @@ -2150,21 +2140,21 @@ msgid "Shut off the VM in order to edit firmware configuration" msgstr "关闭 VM 以编辑固件配置" -#: src/helpers.js:227 src/components/vm/snapshots/vmSnapshotsCard.jsx:119 +#: src/components/vm/snapshots/vmSnapshotsCard.jsx:119 src/helpers.js:227 msgid "Shutting down" msgstr "正在关机" -#: src/components/storagePools/storagePoolList.jsx:69 -#: src/components/storagePools/storageVolumeCreateBody.jsx:83 #: src/components/storagePools/storagePoolVolumesTab.jsx:78 +#: src/components/storagePools/storageVolumeCreateBody.jsx:83 +#: src/components/storagePools/storagePoolList.jsx:69 msgid "Size" msgstr "大小" -#: src/components/vm/overview/bootOrder.jsx:147 -#: src/components/vm/hostdevs/hostDevAdd.jsx:101 #: src/components/vm/hostdevs/hostDevCard.jsx:101 #: src/components/vm/hostdevs/hostDevCard.jsx:108 #: src/components/vm/hostdevs/hostDevCard.jsx:238 +#: src/components/vm/hostdevs/hostDevAdd.jsx:101 +#: src/components/vm/overview/bootOrder.jsx:147 msgid "Slot" msgstr "插槽" @@ -2195,10 +2185,10 @@ msgstr "一些配置更改只有在全新引导后才会生效:" #: src/components/storagePools/storagePoolOverviewTab.jsx:51 -#: src/components/vm/disks/vmDisksCard.jsx:190 #: src/components/vm/disks/diskAdd.jsx:753 #: src/components/vm/disks/diskAdd.jsx:789 -#: src/components/vm/nics/vmNicsCard.jsx:384 +#: src/components/vm/disks/vmDisksCard.jsx:190 +#: src/components/vm/nics/vmNicsCard.jsx:407 #: src/components/vm/nics/nicBody.jsx:197 #: src/components/vm/hostdevs/hostDevCard.jsx:219 msgid "Source" @@ -2212,10 +2202,10 @@ msgid "Source must not be empty" msgstr "源不能为空" -#: src/components/storagePools/storagePoolOverviewTab.jsx:41 -#: src/components/storagePools/storagePoolOverviewTab.jsx:46 #: src/components/storagePools/createStoragePoolDialog.jsx:171 #: src/components/storagePools/createStoragePoolDialog.jsx:188 +#: src/components/storagePools/storagePoolOverviewTab.jsx:41 +#: src/components/storagePools/storagePoolOverviewTab.jsx:46 #: src/components/vm/filesystems/vmFilesystemsCard.jsx:48 #: src/components/vm/filesystems/vmFilesystemsCard.jsx:65 #: src/components/vm/filesystems/vmFilesystemsCard.jsx:204 @@ -2235,7 +2225,7 @@ msgid "Source volume group" msgstr "源卷组" -#: src/components/networks/createNetworkDialog.jsx:218 +#: src/components/networks/createNetworkDialog.jsx:219 msgid "Start" msgstr "启动" @@ -2253,11 +2243,11 @@ msgstr "启动" #: src/components/storagePools/storagePoolList.jsx:71 +#: src/components/networks/networkList.jsx:71 +#: src/components/vm/nics/vmNicsCard.jsx:412 +#: src/components/vm/overview/vmOverviewCard.jsx:168 #: src/components/vms/hostvmslist.jsx:106 #: src/components/vms/hostvmslist.jsx:146 -#: src/components/vm/overview/vmOverviewCard.jsx:168 -#: src/components/vm/nics/vmNicsCard.jsx:389 -#: src/components/networks/networkList.jsx:71 msgid "State" msgstr "状态" @@ -2344,23 +2334,21 @@ msgstr "系统" #: src/components/vm/nics/vmNicsCard.jsx:189 -#, fuzzy -#| msgid "Host device" msgid "TAP device" -msgstr "主机设备" +msgstr "TAP 设备" #: src/components/vm/hostdevs/hostDevAdd.jsx:126 msgid "Table of selectable host devices" msgstr "可选择的主机设备表" #: src/components/vm/disks/vmDiskColumns.jsx:150 -#: src/components/vm/overview/bootOrder.jsx:153 #: src/components/vm/hostdevs/hostDevCard.jsx:109 +#: src/components/vm/overview/bootOrder.jsx:153 msgid "Target" msgstr "目标" -#: src/components/storagePools/storagePoolOverviewTab.jsx:61 #: src/components/storagePools/createStoragePoolDialog.jsx:103 +#: src/components/storagePools/storagePoolOverviewTab.jsx:61 msgid "Target path" msgstr "目标路径" @@ -2381,8 +2369,8 @@ msgstr "虚拟机 $0 正在运行,在删除前将被强制关闭。" #: src/components/vm/disks/vmDiskColumns.jsx:220 -#: src/components/vm/nics/vmNicsCard.jsx:458 -#: src/components/vm/nics/vmNicsCard.jsx:466 +#: src/components/vm/nics/vmNicsCard.jsx:481 +#: src/components/vm/nics/vmNicsCard.jsx:489 msgid "The VM needs to be running or shut off to detach this device" msgstr "虚拟机需要运行或关闭才能分离该设备" @@ -2486,17 +2474,17 @@ msgid "Troubleshoot" msgstr "排错" -#: src/components/storagePools/storagePoolOverviewTab.jsx:76 #: src/components/storagePools/createStoragePoolDialog.jsx:81 +#: src/components/storagePools/storagePoolOverviewTab.jsx:76 +#: src/components/vm/nics/vmNicsCard.jsx:325 +#: src/components/vm/hostdevs/hostDevCard.jsx:179 +#: src/components/vm/hostdevs/hostDevAdd.jsx:47 #: src/components/vm/overview/bootOrder.jsx:116 #: src/components/vm/overview/bootOrder.jsx:129 #: src/components/vm/overview/bootOrder.jsx:144 #: src/components/vm/overview/bootOrder.jsx:151 #: src/components/vm/overview/bootOrder.jsx:158 #: src/components/vm/overview/bootOrder.jsx:164 -#: src/components/vm/nics/vmNicsCard.jsx:318 -#: src/components/vm/hostdevs/hostDevAdd.jsx:47 -#: src/components/vm/hostdevs/hostDevCard.jsx:179 msgid "Type" msgstr "类型" @@ -2536,7 +2524,7 @@ msgid "Unit" msgstr "单位" -#: src/components/vm/nics/vmNicsCard.jsx:356 +#: src/components/vm/nics/vmNicsCard.jsx:377 msgid "Unknown" msgstr "未知" @@ -2544,16 +2532,16 @@ msgid "Unknown firmware" msgstr "未知固件" -#: src/components/vm/overview/bootOrder.jsx:135 -#: src/components/vm/overview/bootOrder.jsx:136 #: src/components/vm/hostdevs/hostDevCard.jsx:92 #: src/components/vm/hostdevs/hostDevCard.jsx:93 +#: src/components/vm/overview/bootOrder.jsx:135 +#: src/components/vm/overview/bootOrder.jsx:136 msgid "Unspecified" msgstr "未指定" #: src/components/vm/confirmDialog.jsx:70 msgid "Uptime" -msgstr "" +msgstr "Uptime" #: src/components/vm/disks/diskEdit.jsx:44 msgid "Url" @@ -2695,21 +2683,21 @@ msgid "Valid token" msgstr "有效令牌" -#: src/components/vm/overview/bootOrder.jsx:130 -#: src/components/vm/overview/bootOrder.jsx:145 -#: src/components/vm/hostdevs/hostDevAdd.jsx:128 #: src/components/vm/hostdevs/hostDevCard.jsx:209 #: src/components/vm/hostdevs/hostDevCard.jsx:236 #: src/components/vm/hostdevs/hostDevCard.jsx:242 +#: src/components/vm/hostdevs/hostDevAdd.jsx:128 +#: src/components/vm/overview/bootOrder.jsx:130 +#: src/components/vm/overview/bootOrder.jsx:145 msgid "Vendor" msgstr "厂商" #: src/components/storagePools/storagePoolList.jsx:52 -#: src/components/vms/hostvmslist.jsx:138 -#: src/components/vms/hostvmslist.jsx:141 +#: src/components/networks/networkList.jsx:51 #: src/components/vm/vmDetailsPage.jsx:87 -#: src/components/vm/vmDetailsPage.jsx:247 -#: src/components/networks/networkList.jsx:51 src/manifest.json:0 +#: src/components/vm/vmDetailsPage.jsx:249 +#: src/components/vms/hostvmslist.jsx:138 +#: src/components/vms/hostvmslist.jsx:141 src/manifest.json:0 msgid "Virtual machines" msgstr "虚拟机" @@ -2721,7 +2709,7 @@ msgid "Virtual network" msgstr "虚拟网络" -#: src/components/networks/createNetworkDialog.jsx:375 +#: src/components/networks/createNetworkDialog.jsx:377 msgid "Virtual network failed to be created" msgstr "虚拟网络创建失败" @@ -2740,10 +2728,10 @@ #: src/components/create-vm-dialog/createVmDialog.jsx:900 #: src/components/vm/disks/vmDiskColumns.jsx:43 -#: src/components/vm/disks/mediaEject.jsx:89 #: src/components/vm/disks/diskAdd.jsx:117 -#: src/components/vm/overview/bootOrder.jsx:100 +#: src/components/vm/disks/mediaEject.jsx:89 #: src/components/vm/deleteDialog.jsx:65 +#: src/components/vm/overview/bootOrder.jsx:100 msgid "Volume" msgstr "卷" @@ -2763,13 +2751,13 @@ msgid "Vsock" msgstr "Vsock" -#: src/components/vm/overview/bootOrder.jsx:160 #: src/components/vm/hostdevs/hostDevCard.jsx:115 +#: src/components/vm/overview/bootOrder.jsx:160 msgid "WWPN" msgstr "WWPN" -#: src/components/common/needsShutdown.jsx:114 #: src/components/vm/overview/vmOverviewCard.jsx:208 +#: src/components/common/needsShutdown.jsx:114 msgid "Watchdog" msgstr "监督者" @@ -2782,13 +2770,13 @@ "系统停止响应时 watchdogs 的行为。要使用此虚拟 watchdog 设备,客户端系统也需要" "有一个额外的驱动程序和一个正在运行的 watchdog 服务。" -#: src/components/vm/disks/vmDisksCard.jsx:216 #: src/components/vm/disks/diskEdit.jsx:132 +#: src/components/vm/disks/vmDisksCard.jsx:216 msgid "Writeable" msgstr "可写" -#: src/components/vm/disks/vmDisksCard.jsx:216 #: src/components/vm/disks/diskEdit.jsx:141 +#: src/components/vm/disks/vmDisksCard.jsx:216 msgid "Writeable and shared" msgstr "可写和共享" @@ -2805,8 +2793,8 @@ msgid "active" msgstr "激活" -#: src/components/vm/overview/vsock.jsx:293 #: src/components/vm/overview/watchdog.jsx:242 +#: src/components/vm/overview/vsock.jsx:293 msgid "add" msgstr "添加" @@ -2822,7 +2810,7 @@ msgid "cdrom" msgstr "光驱" -#: src/helpers.js:244 src/components/vm/overview/cpuModal.jsx:321 +#: src/components/vm/overview/cpuModal.jsx:321 src/helpers.js:244 msgid "custom" msgstr "自定义" @@ -2842,11 +2830,11 @@ msgid "down" msgstr "已关闭" -#: src/components/vm/overview/bootOrder.jsx:361 #: src/components/vm/overview/vmOverviewCard.jsx:122 #: src/components/vm/overview/vmOverviewCard.jsx:130 -#: src/components/vm/overview/vsock.jsx:293 #: src/components/vm/overview/watchdog.jsx:242 +#: src/components/vm/overview/bootOrder.jsx:361 +#: src/components/vm/overview/vsock.jsx:293 msgid "edit" msgstr "编辑" @@ -2895,13 +2883,13 @@ msgid "inactive" msgstr "未激活" -#: src/components/vm/nics/vmNicsCard.jsx:362 +#: src/components/vm/nics/vmNicsCard.jsx:385 msgid "inet" -msgstr "" +msgstr "inet" -#: src/components/vm/nics/vmNicsCard.jsx:370 +#: src/components/vm/nics/vmNicsCard.jsx:393 msgid "inet6" -msgstr "" +msgstr "inet6" #: src/manifest.json:0 msgid "iso" @@ -2915,11 +2903,11 @@ msgid "mcast" msgstr "MCAST" -#: src/components/common/machinesConnectionSelector.jsx:82 -#: src/components/vm/overview/vsock.jsx:226 #: src/components/vm/filesystems/vmFilesystemsCard.jsx:194 #: src/components/vm/nics/nicBody.jsx:110 #: src/components/vm/vmDetailsPage.jsx:202 +#: src/components/vm/overview/vsock.jsx:226 +#: src/components/common/machinesConnectionSelector.jsx:82 msgid "more info" msgstr "更多信息" @@ -2936,9 +2924,9 @@ msgid "network" msgstr "网络" -#: src/helpers.js:273 src/components/storagePools/storagePoolOverviewTab.jsx:67 +#: src/components/storagePools/storagePoolOverviewTab.jsx:67 #: src/components/storagePools/storagePoolOverviewTab.jsx:72 -#: src/components/networks/networkOverviewTab.jsx:115 +#: src/components/networks/networkOverviewTab.jsx:115 src/helpers.js:273 msgid "no" msgstr "否" @@ -2946,9 +2934,9 @@ msgid "no state saved" msgstr "无保存的状态" -#: src/components/vm/overview/vsock.jsx:275 -#: src/components/vm/overview/watchdog.jsx:238 #: src/components/networks/networkOverviewTab.jsx:293 +#: src/components/vm/overview/watchdog.jsx:238 +#: src/components/vm/overview/vsock.jsx:275 msgid "none" msgstr "无" @@ -3044,9 +3032,9 @@ msgid "vsock requires special software" msgstr "vsock 需要特殊软件" -#: src/helpers.js:272 src/components/storagePools/storagePoolOverviewTab.jsx:67 +#: src/components/storagePools/storagePoolOverviewTab.jsx:67 #: src/components/storagePools/storagePoolOverviewTab.jsx:72 -#: src/components/networks/networkOverviewTab.jsx:115 +#: src/components/networks/networkOverviewTab.jsx:115 src/helpers.js:272 msgid "yes" msgstr "是" diff -Nru cockpit-machines-295/src/components/common/machinesConnectionSelector.jsx cockpit-machines-298/src/components/common/machinesConnectionSelector.jsx --- cockpit-machines-295/src/components/common/machinesConnectionSelector.jsx 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/src/components/common/machinesConnectionSelector.jsx 2023-09-04 12:22:47.000000000 +0000 @@ -37,7 +37,7 @@ return ( + id={`${valueId}-error`}> <> {_("Failed")} diff -Nru cockpit-machines-295/src/components/create-vm-dialog/pxe-helpers.js cockpit-machines-298/src/components/create-vm-dialog/pxe-helpers.js --- cockpit-machines-295/src/components/create-vm-dialog/pxe-helpers.js 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/src/components/create-vm-dialog/pxe-helpers.js 2023-09-04 12:22:47.000000000 +0000 @@ -135,8 +135,11 @@ virtualNetworks ); + // Don't use localhost as default PXE source + const source = netNodeDevices.find(dev => dev.capability.interface !== "lo"); + if (netNodeDevices.length > 0) - return cockpit.format('type=direct,source=$0', netNodeDevices[0].capability.interface); + return cockpit.format('type=direct,source=$0,source.mode=bridge', source.capability.interface); } /** @@ -162,7 +165,7 @@ const netNodeDevicesRows = netNodeDevices.map(netNodeDevice => { const iface = netNodeDevice.capability.interface; - const data = cockpit.format('type=direct,source=$0', iface); + const data = cockpit.format('type=direct,source=$0,source.mode=bridge', iface); const label = cockpit.format("$0 $1: macvtap", _("Host device"), iface); return ; diff -Nru cockpit-machines-295/src/components/networks/createNetworkDialog.jsx cockpit-machines-298/src/components/networks/createNetworkDialog.jsx --- cockpit-machines-295/src/components/networks/createNetworkDialog.jsx 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/src/components/networks/createNetworkDialog.jsx 2023-09-04 12:22:47.000000000 +0000 @@ -215,13 +215,15 @@ onChange={() => onValueChanged('ipv' + ipVersion + 'DhcpEnabled', !expanded)} /> {expanded && - + onValueChanged('ipv' + ipVersion + 'DhcpRangeStart', value)} /> - + onValueChanged('ipv' + ipVersion + 'DhcpRangeEnd', value)} /> diff -Nru cockpit-machines-295/src/components/networks/networkList.jsx cockpit-machines-298/src/components/networks/networkList.jsx --- cockpit-machines-295/src/components/networks/networkList.jsx 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/src/components/networks/networkList.jsx 2023-09-04 12:22:47.000000000 +0000 @@ -56,7 +56,7 @@ - + }}> {_("Networks")} diff -Nru cockpit-machines-295/src/components/storagePools/storagePoolDelete.jsx cockpit-machines-298/src/components/storagePools/storagePoolDelete.jsx --- cockpit-machines-295/src/components/storagePools/storagePoolDelete.jsx 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/src/components/storagePools/storagePoolDelete.jsx 2023-09-04 12:22:47.000000000 +0000 @@ -172,15 +172,14 @@ ? (volumes.length > 0 ? - { _("Also delete all volumes inside this pool:")} + label={_("Also delete all volumes inside this pool:")} + body={ - {volumes - .sort((a, b) => a.name.localeCompare(b.name)) + {volumes.sort((a, b) => a.name.localeCompare(b.name)) .map(vol => {vol.name}) } - } + } onChange={(_event, checked) => this.onValueChanged('deleteVolumes', checked)} /> : _("No volumes exist in this storage pool.")) : _("Deleting an inactive storage pool will only undefine the pool. Its content will not be deleted.") diff -Nru cockpit-machines-295/src/components/storagePools/storagePoolDelete.scss cockpit-machines-298/src/components/storagePools/storagePoolDelete.scss --- cockpit-machines-295/src/components/storagePools/storagePoolDelete.scss 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/src/components/storagePools/storagePoolDelete.scss 2023-09-04 12:22:47.000000000 +0000 @@ -2,3 +2,10 @@ margin-top: var(--pf-v5-global--spacer--sm); --pf-v5-c-list--li--MarginTop: 0 !important; } + +// HACK: add contrast between alert and modal background +.pf-v5-theme-dark { + .pf-v5-c-alert.pf-m-inline.pf-m-danger { + --pf-v5-c-alert--m-inline--BackgroundColor: var(--pf-v5-global--BackgroundColor--dark-400); + } +} diff -Nru cockpit-machines-295/src/components/storagePools/storagePoolList.jsx cockpit-machines-298/src/components/storagePools/storagePoolList.jsx --- cockpit-machines-295/src/components/storagePools/storagePoolList.jsx 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/src/components/storagePools/storagePoolList.jsx 2023-09-04 12:22:47.000000000 +0000 @@ -57,7 +57,7 @@ - + {_("Storage pools")} diff -Nru cockpit-machines-295/src/components/vm/consoles/consoles.css cockpit-machines-298/src/components/vm/consoles/consoles.css --- cockpit-machines-295/src/components/vm/consoles/consoles.css 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/src/components/vm/consoles/consoles.css 2023-09-04 12:22:47.000000000 +0000 @@ -1,18 +1,18 @@ @import "@patternfly/react-styles/css/components/Consoles/SerialConsole.css"; -.pf-c-console, -.pf-c-console__vnc, -.pf-c-console__vnc > div, -.pf-c-console__vnc > div > div { +.pf-v5-c-console, +.pf-v5-c-console__vnc, +.pf-v5-c-console__vnc > div, +.pf-v5-c-console__vnc > div > div { width: 100%; height: 100%; } -.pf-c-console__actions { +.pf-v5-c-console__actions { max-width: 25ch; } -.pf-c-console { +.pf-v5-c-console { /* auto minimum width, causing problem */ grid-template-columns: 1fr; grid-template-rows: min-content 1fr; diff -Nru cockpit-machines-295/src/components/vm/consoles/serialConsole.jsx cockpit-machines-298/src/components/vm/consoles/serialConsole.jsx --- cockpit-machines-295/src/components/vm/consoles/serialConsole.jsx 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/src/components/vm/consoles/serialConsole.jsx 2023-09-04 12:22:47.000000000 +0000 @@ -89,13 +89,13 @@ return ( <> -
+
{this.state.channel ? : }
-
+
{t}
diff -Nru cockpit-machines-295/src/components/vm/hostdevs/hostDevCard.jsx cockpit-machines-298/src/components/vm/hostdevs/hostDevCard.jsx --- cockpit-machines-295/src/components/vm/hostdevs/hostDevCard.jsx 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/src/components/vm/hostdevs/hostDevCard.jsx 2023-09-04 12:22:47.000000000 +0000 @@ -95,40 +95,40 @@ // If there are 2 usb devices without specified bus/device and same vendor/product, // it's impossible to identify which one is the one referred in VM's XML - cells.push(getOptionalValue(device, `${hostdevId}-device`, _("Device"))); - cells.push(getOptionalValue(bus, `${hostdevId}-bus`, _("Bus"))); + cells.push(getOptionalValue(device, `device-${hostdevId}`, _("Device"))); + cells.push(getOptionalValue(bus, `bus-${hostdevId}`, _("Bus"))); } else if (hostDev.type === "pci") { - cells.push(getOptionalValue(getPciSlot(hostDev), `${hostdevId}-slot`, _("Slot"))); + cells.push(getOptionalValue(getPciSlot(hostDev), `slot-${hostdevId}`, _("Slot"))); } else if (hostDev.type === "scsi") { const bus = hostDev.source.address.bus; const target = hostDev.source.address.target; const unit = hostDev.source.address.lun; - cells.push(getOptionalValue(bus, `${hostdevId}-bus`, _("Bus"))); - cells.push(getOptionalValue(unit, `${hostdevId}-unit`, _("Slot"))); - cells.push(getOptionalValue(target, `${hostdevId}-target`, _("Target"))); + cells.push(getOptionalValue(bus, `bus-${hostdevId}`, _("Bus"))); + cells.push(getOptionalValue(unit, `unit-${hostdevId}`, _("Slot"))); + cells.push(getOptionalValue(target, `target-${hostdevId}`, _("Target"))); } else if (hostDev.type === "scsi_host") { const protocol = hostDev.source.protocol; const wwpn = hostDev.source.wwpn; - cells.push(getOptionalValue(protocol, `${hostdevId}-protocol`, _("Protocol"))); - cells.push(getOptionalValue(wwpn, `${hostdevId}-wwpn`, _("WWPN"))); + cells.push(getOptionalValue(protocol, `protocol-${hostdevId}`, _("Protocol"))); + cells.push(getOptionalValue(wwpn, `wwpn-${hostdevId}`, _("WWPN"))); } else if (hostDev.type === "mdev") { const uuid = hostDev.source.address.uuid; - cells.push(getOptionalValue(uuid, `${hostdevId}-uuid`, _("UUID"))); + cells.push(getOptionalValue(uuid, `uuid-${hostdevId}`, _("UUID"))); } else if (hostDev.type === "storage") { const block = hostDev.source.block; - cells.push(getOptionalValue(block, `${hostdevId}-block`, _("Path"))); + cells.push(getOptionalValue(block, `block-${hostdevId}`, _("Path"))); } else if (hostDev.type === "misc") { const ch = hostDev.source.char; - cells.push(getOptionalValue(ch, `${hostdevId}-char`, _("Path"))); + cells.push(getOptionalValue(ch, `char-${hostdevId}`, _("Path"))); } else if (hostDev.type === "net") { const iface = hostDev.source.interface; - cells.push(getOptionalValue(iface, `${hostdevId}-interface`, _("Interface"))); + cells.push(getOptionalValue(iface, `interface-${hostdevId}`, _("Interface"))); } return {cells}; diff -Nru cockpit-machines-295/src/components/vm/vmDetailsPage.jsx cockpit-machines-298/src/components/vm/vmDetailsPage.jsx --- cockpit-machines-295/src/components/vm/vmDetailsPage.jsx 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/src/components/vm/vmDetailsPage.jsx 2023-09-04 12:22:47.000000000 +0000 @@ -223,7 +223,9 @@ return ( + id={card.id} + isSelectable + isClickable> {card.title} diff -Nru cockpit-machines-295/src/components/vms/hostvmslist.jsx cockpit-machines-298/src/components/vms/hostvmslist.jsx --- cockpit-machines-295/src/components/vms/hostvmslist.jsx 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/src/components/vms/hostvmslist.jsx 2023-09-04 12:22:47.000000000 +0000 @@ -133,7 +133,7 @@ - + {_("Virtual machines")} diff -Nru cockpit-machines-295/src/components/vms/hostvmslist.scss cockpit-machines-298/src/components/vms/hostvmslist.scss --- cockpit-machines-295/src/components/vms/hostvmslist.scss 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/src/components/vms/hostvmslist.scss 2023-09-04 12:22:47.000000000 +0000 @@ -18,9 +18,13 @@ text-align: left; } -/* Add the missing space when the list's toolbar wraps - * patternfly/patternfly#3348 - */ -.pf-v5-c-toolbar__content-section { - gap: var(--pf-v5-global--spacer--sm) 0; +// Add spacing between buttons in the toolbar +.pf-v5-c-toolbar__item { + gap: 0 var(--pf-v5-global--spacer--xs); +} + +// HACK: the label has alig-self: flex-start which renders the State not in the middle. +// Seems fixed in 5.0.0! +.pf-v5-c-toolbar__item.pf-m-label { + align-self: normal; } diff -Nru cockpit-machines-295/src/libvirtApi/domain.js cockpit-machines-298/src/libvirtApi/domain.js --- cockpit-machines-295/src/libvirtApi/domain.js 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/src/libvirtApi/domain.js 2023-09-04 12:22:47.000000000 +0000 @@ -198,8 +198,11 @@ } else { if (newMacAddress) networkParams += `mac=${newMacAddress},`; - if (networkType) + if (networkType) { networkParams += `type=${networkType},`; + if (networkType == `direct`) + networkParams += `source.mode=bridge,`; + } if (networkSource) networkParams += `source=${networkSource},`; if (networkModel) diff -Nru cockpit-machines-295/src/machines.scss cockpit-machines-298/src/machines.scss --- cockpit-machines-295/src/machines.scss 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/src/machines.scss 2023-09-04 12:22:47.000000000 +0000 @@ -101,3 +101,8 @@ background-color: var(--pf-v5-global--BackgroundColor--dark-100); } } + +// remove oversized gap between checkbox label and checkbox body +#storage-pool-delete-modal span.pf-v5-c-check__body { + margin-top: 0; +} diff -Nru cockpit-machines-295/src/README.md cockpit-machines-298/src/README.md --- cockpit-machines-295/src/README.md 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/src/README.md 2023-09-04 12:22:47.000000000 +0000 @@ -13,7 +13,7 @@ # systemctl start libvirtd.service # cd /tmp # NAME=subVmTest1 && qemu-img create -f qcow2 ${NAME}.img 256M & & \ - virt-install -r 128 --pxe --force --nographics --noautoconsole \ + virt-install -r 128 --pxe --force --graphics none --noautoconsole \ -f ${NAME}.img -n ${NAME} # to create and start a dummy VM Log into Cockpit as the 'root' user (pwd 'foobar') and follow `Virtual machines` from the left-side menu. diff -Nru cockpit-machines-295/test/browser/browser.sh cockpit-machines-298/test/browser/browser.sh --- cockpit-machines-295/test/browser/browser.sh 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/test/browser/browser.sh 2023-09-04 12:22:47.000000000 +0000 @@ -4,16 +4,13 @@ # like "basic", passed on to run-test.sh PLAN="$1" +export TEST_BROWSER=${TEST_BROWSER:-firefox} + TESTS="$(realpath $(dirname "$0"))" -if [ -d source ]; then - # path for standard-test-source - SOURCE="$(pwd)/source" -else - SOURCE="$(realpath $TESTS/../..)" -fi +export SOURCE="$(realpath $TESTS/../..)" # https://tmt.readthedocs.io/en/stable/overview.html#variables -LOGS="${TMT_TEST_DATA:-$(pwd)/logs}" +export LOGS="${TMT_TEST_DATA:-$(pwd)/logs}" mkdir -p "$LOGS" chmod a+w "$LOGS" @@ -87,7 +84,9 @@ fi # Run tests as unprivileged user -su - -c "env TEST_BROWSER=firefox SOURCE=$SOURCE LOGS=$LOGS $TESTS/run-test.sh $PLAN" runtest +# once we drop support for RHEL 8, use this: +# runuser -u runtest --whitelist-environment=TEST_BROWSER,TEST_ALLOW_JOURNAL_MESSAGES,TEST_AUDIT_NO_SELINUX,SOURCE,LOGS $TESTS/run-test.sh $PLAN +runuser -u runtest --preserve-environment env USER=runtest HOME=$(getent passwd runtest | cut -f6 -d:) $TESTS/run-test.sh $PLAN RC=$(cat $LOGS/exitcode) exit ${RC:-1} diff -Nru cockpit-machines-295/test/browser/run-test.sh cockpit-machines-298/test/browser/run-test.sh --- cockpit-machines-295/test/browser/run-test.sh 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/test/browser/run-test.sh 2023-09-04 12:22:47.000000000 +0000 @@ -24,8 +24,6 @@ TEST_OS="${TEST_OS}-stream" fi -export TEST_AUDIT_NO_SELINUX=1 - # # exclude known-broken tests # @@ -116,6 +114,10 @@ exclude_options="$exclude_options --exclude $t" done +# make it easy to check in logs +echo "TEST_ALLOW_JOURNAL_MESSAGES: ${TEST_ALLOW_JOURNAL_MESSAGES:-}" +echo "TEST_AUDIT_NO_SELINUX: ${TEST_AUDIT_NO_SELINUX:-}" + # execute run-tests RC=0 test/common/run-tests --nondestructive $exclude_options \ diff -Nru cockpit-machines-295/test/check-machines-consoles cockpit-machines-298/test/check-machines-consoles --- cockpit-machines-295/test/check-machines-consoles 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/test/check-machines-consoles 2023-09-04 12:22:47.000000000 +0000 @@ -78,7 +78,7 @@ self.goToVmPage("subVmTest1") # since VNC is defined for this VM, the view for "In-Browser Viewer" is rendered by default - b.wait_visible(".pf-c-console__vnc canvas") + b.wait_visible(".pf-v5-c-console__vnc canvas") # make sure the log file is full - then empty it and reboot the VM - the log file should fill up again self.waitCirrOSBooted(args['logfile']) @@ -131,7 +131,7 @@ b.click("button:contains(Expand)") b.assert_pixels("#vm-vmWithSerialConsole-consoles-page", "vm-details-console-serial", - ignore=[".pf-c-console__vnc"], skip_layouts=["rtl"]) + ignore=[".pf-v5-c-console__vnc"], skip_layouts=["rtl"]) # Add a second serial console m.execute("virsh destroy vmWithSerialConsole; virt-xml --add-device vmWithSerialConsole --console pty,target_type=virtio; virsh start vmWithSerialConsole") @@ -180,14 +180,14 @@ # test switching console from serial to graphical b.wait_visible(f"#vm-{name}-consoles") - b.wait_visible(".pf-c-console__vnc canvas") + b.wait_visible(".pf-v5-c-console__vnc canvas") b.click("#pf-c-console__type-selector") b.wait_visible("#pf-c-console__type-selector + .pf-v5-c-select__menu") b.click("#SerialConsole button") b.wait_not_present("#pf-c-console__type-selector + .pf-v5-c-select__menu") - b.wait_not_present(".pf-c-console__vnc canvas") + b.wait_not_present(".pf-v5-c-console__vnc canvas") b.wait_visible(f"#{name}-terminal") # Go back to Vnc console @@ -195,7 +195,7 @@ b.wait_visible("#pf-c-console__type-selector + .pf-v5-c-select__menu") b.click("#VncConsole button") b.wait_not_present("#pf-c-console__type-selector + .pf-v5-c-select__menu") - b.wait_visible(".pf-c-console__vnc canvas") + b.wait_visible(".pf-v5-c-console__vnc canvas") # Go to the expanded console view b.click("button:contains(Expand)") diff -Nru cockpit-machines-295/test/check-machines-create cockpit-machines-298/test/check-machines-create --- cockpit-machines-295/test/check-machines-create 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/test/check-machines-create 2023-09-04 12:22:47.000000000 +0000 @@ -141,7 +141,7 @@ # Check PXE warning about macvtap is present runner.checkDialogFormValidationTest(TestMachinesCreate.VmDialog(self, sourceType='pxe', - location=f"type=direct,source={iface}"), + location=f"type=direct,source={iface},source.mode=bridge"), {"network": "macvtap does not work for host to guest network communication"}, create=False, is_warning=True) @@ -149,7 +149,7 @@ # When switching from PXE mode to anything else make sure that the source input is empty runner.checkDialogFormValidationTest(TestMachinesCreate.VmDialog(self, storage_size=1, sourceType='pxe', - location=f"type=direct,source={iface}", + location=f"type=direct,source={iface},source.mode=bridge", sourceTypeSecondChoice='url', create_and_run=False), {"source-url": "Installation source must not be empty"}) @@ -346,6 +346,12 @@ self.machine.execute("virsh net-destroy default; virsh net-undefine default") + # Create when the default installation source is not virtual network + runner.createTest(TestMachinesCreate.VmDialog(self, name='pxe-guest', + sourceType='pxe', + storage_pool=NO_STORAGE, + create_and_run=True)) + # Set up the PXE server configuration files cmds = [ "mkdir -p /var/lib/libvirt/pxe-config", @@ -435,7 +441,7 @@ # Check that host network devices are appearing in the options for PXE boot sources runner.createTest(TestMachinesCreate.VmDialog(self, sourceType='pxe', name="pxe-guest", - location=f"type=direct,source={iface}", + location=f"type=direct,source={iface},source.mode=bridge", storage_size=128, storage_size_unit='MiB', create_and_run=True, delete=False)) @@ -1154,12 +1160,14 @@ b.select_from_dropdown("#source-type", self.sourceType) else: b.wait_not_present("#source-type") + if self.sourceType == 'file' or self.sourceType == 'cloud': b.set_file_autocomplete_val("#source-file-group", self.location or " ") elif self.sourceType == 'disk_image': b.set_file_autocomplete_val("#source-disk-group", self.location or " ") elif self.sourceType == 'pxe': - b.select_from_dropdown("#network-select", self.location) + if self.location: + b.select_from_dropdown("#network-select", self.location) elif self.sourceType == 'url': b.set_input_text("#source-url", self.location) @@ -1587,6 +1595,7 @@ def _assertCorrectConfiguration(self, dialog): b = self.browser + m = self.machine name = dialog.name connection = dialog.connection @@ -1654,6 +1663,10 @@ b.wait_in_text(f"#vm-{name}-disks .pf-v5-c-empty-state", "No disks defined") b.click(f"#vm-{name}-disks-adddisk") b.click(f"#vm-{name}-disks-adddisk-dialog-cancel") + + if dialog.sourceType == 'pxe' and "network" not in dialog.location: + wait(lambda: "mode='bridge'" in m.execute(f"virsh dumpxml {name}")) + return self def _assertScriptFinished(self): diff -Nru cockpit-machines-295/test/check-machines-disks cockpit-machines-298/test/check-machines-disks --- cockpit-machines-295/test/check-machines-disks 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/test/check-machines-disks 2023-09-04 12:22:47.000000000 +0000 @@ -1076,7 +1076,7 @@ inactive_pools = filter(lambda pool: pool != '', m.execute("virsh pool-list --inactive --name").split('\n')) for pool in inactive_pools: m.execute(f"virsh pool-undefine {pool}") - b.wait_visible("#vm-details[data-pools-count=0]") + b.wait_visible("#vm-details[data-pools-count='0']") b.click(prefix) # radio button label in modal dialog b.wait_visible(f"{prefix}-dialog-add:disabled") @@ -1209,7 +1209,7 @@ # Ensure that adding disks with custom path is possible when no storage pools are present # https://bugzilla.redhat.com/show_bug.cgi?id=1985228 m.execute("for pool in $(virsh pool-list --all --name); do virsh pool-destroy $pool || true; virsh pool-undefine $pool; done") - b.wait_visible("#vm-details[data-pools-count=0]") + b.wait_visible("#vm-details[data-pools-count='0']") b.click(prefix) b.set_file_autocomplete_val("#vm-subVmTest1-disks-adddisk-file", "/var/lib/libvirt/novell.iso") b.wait_visible(f"{prefix}-custompath:checked") diff -Nru cockpit-machines-295/test/check-machines-hostdevs cockpit-machines-298/test/check-machines-hostdevs --- cockpit-machines-295/test/check-machines-hostdevs 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/test/check-machines-hostdevs 2023-09-04 12:22:47.000000000 +0000 @@ -61,8 +61,8 @@ b.wait_in_text("#vm-subVmTest1-hostdev-1-type", "usb") b.wait_in_text("#vm-subVmTest1-hostdev-1-vendor", "Linux Foundation") b.wait_in_text("#vm-subVmTest1-hostdev-1-product", "1.1 root hub") - b.wait_in_text("#vm-subVmTest1-hostdev-1-source #1-device", "1") - b.wait_in_text("#vm-subVmTest1-hostdev-1-source #1-bus", "1") + b.wait_in_text("#vm-subVmTest1-hostdev-1-source #device-1", "1") + b.wait_in_text("#vm-subVmTest1-hostdev-1-source #bus-1", "1") m.execute("virsh destroy subVmTest1") b.wait_in_text("#vm-subVmTest1-system-state", "Shut off") @@ -75,8 +75,8 @@ b.wait_in_text("#vm-subVmTest1-hostdev-1-vendor", "0xffff") b.wait_in_text("#vm-subVmTest1-hostdev-1-product", "0xffff") - b.wait_in_text("#vm-subVmTest1-hostdev-1-source #1-device", "Unspecified") - b.wait_in_text("#vm-subVmTest1-hostdev-1-source #1-bus", "Unspecified") + b.wait_in_text("#vm-subVmTest1-hostdev-1-source #device-1", "Unspecified") + b.wait_in_text("#vm-subVmTest1-hostdev-1-source #bus-1", "Unspecified") m.execute("virsh detach-device --domain subVmTest1 --file /tmp/usbnonexistenthostedxml --config") @@ -96,7 +96,7 @@ except subprocess.CalledProcessError: pass - b.wait_in_text("#vm-subVmTest1-hostdev-1-source #1-slot", "0000:00:0f.0") + b.wait_in_text("#vm-subVmTest1-hostdev-1-source #slot-1", "0000:00:0f.0") # QEMU version on rhel and centos-8/9-stream doesn't support scsi-host devices yet if not m.image.startswith("rhel-8") and not m.image.startswith("rhel-9") and m.image != "centos-8-stream" and m.image != "centos-9-stream": @@ -296,10 +296,10 @@ b.wait_not_present("#vm-subVmTest1-hostdevs-dialog") b.wait_visible("#vm-subVmTest1-hostdev-1-product") - b.wait_in_text("#1-slot", slot1) + b.wait_in_text("#slot-1", slot1) b.wait_visible("#vm-subVmTest1-hostdev-2-product") - b.wait_in_text("#2-slot", slot2) + b.wait_in_text("#slot-2", slot2) self.run_admin(f"virsh -c qemu:///{connectionName} dumpxml subVmTest1 > /tmp/vmdir/vmxml2", connectionName) vm_diff = m.execute("diff /tmp/vmdir/vmxml1 /tmp/vmdir/vmxml2 | sed -e 's/^>//;1d'") # Print difference between XMLs before and after adding host devices diff -Nru cockpit-machines-295/test/check-machines-lifecycle cockpit-machines-298/test/check-machines-lifecycle --- cockpit-machines-295/test/check-machines-lifecycle 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/test/check-machines-lifecycle 2023-09-04 12:22:47.000000000 +0000 @@ -235,7 +235,6 @@ b.click(".pf-v5-c-modal-box__footer button:contains(Reboot)") b.wait_not_present("#vm-subVmTest2-system-confirm-action-modal") b.wait_in_text("#vm-subVmTest2-system-state", "Running") - self.waitCirrOSBooted(args2['logfile']) # Check uptime b.click("#vm-subVmTest2-system-shutdown-button") @@ -282,15 +281,15 @@ # Try to run subVmTest1 - it will fail because of inactive default network tryRunDomain(1, 'subVmTest1', 'system') - b.click('#vm-subVmTest1-system-state button:contains("view more")') + b.click('#vm-subVmTest1-system-state-error button:contains("view more")') b.wait_in_text(".pf-v5-c-popover", "VM subVmTest1 failed to start") - b.click('#vm-subVmTest1-system-state button[aria-label=Close]') + b.click('#vm-subVmTest1-system-state-error button[aria-label=Close]') # Try to run subVmTest2 tryRunDomain(2, 'subVmTest2', 'system') - b.click('#vm-subVmTest2-system-state button:contains("view more")') + b.click('#vm-subVmTest2-system-state-error button:contains("view more")') b.wait_in_text(".pf-v5-c-popover", "VM subVmTest2 failed to start") - b.click('#vm-subVmTest2-system-state button[aria-label=Close]') + b.click('#vm-subVmTest2-system-state-error button[aria-label=Close]') def testCloneSessionConnection(self): self.testClone(connectionName='session') @@ -491,7 +490,7 @@ b.wait_visible(f"#vm-{name}-system-confirm-action-modal") b.click(f".pf-v5-c-modal-box__footer #vm-{name}-system-forceOff") self.waitVmRow(name, 'system', False) - b.wait_not_present(f'#vm-{name}-system-state button:contains("view more")') + b.wait_not_present(f'#vm-{name}-system-state-error button:contains("view more")') # Try to delete a VM where storage deletion will fail name = "vm-fail-storage-deletion" diff -Nru cockpit-machines-295/test/check-machines-migrate cockpit-machines-298/test/check-machines-migrate --- cockpit-machines-295/test/check-machines-migrate 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/test/check-machines-migrate 2023-09-04 12:22:47.000000000 +0000 @@ -147,7 +147,7 @@ self.goToVmPage("subVmTest1") self.performAction("subVmTest1", "migrate") - b.wait_visible("#migrate-modal") + b.wait_visible("#migrate-modal.pf-v5-c-modal-box") if fail == "uri": # test failure for syntactically incorrect destination uri @@ -192,7 +192,7 @@ self.assertIn("subVmTest1", machine1.execute("virsh list --all")) else: with b.wait_timeout(120): - b.wait_not_present("#migrate-modal") + b.wait_not_present("#migrate-modal.pf-v5-c-modal-box") # Verify the state of the migrated VM in the destination host # The migrated VM should always exist on destination - domstate depends on the options of the dialog set diff -Nru cockpit-machines-295/test/check-machines-networks cockpit-machines-298/test/check-machines-networks --- cockpit-machines-295/test/check-machines-networks 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/test/check-machines-networks 2023-09-04 12:22:47.000000000 +0000 @@ -123,6 +123,13 @@ b.wait_in_text("#card-pf-networks .pf-v5-c-card__header button", "Network") b.click(".pf-v5-c-card .pf-v5-c-card__header button:contains(Network)") + # HACK: Firefox 112 on centos-8-stream does not have `:has` yet, so for now use JavaScript to obtain the elements parent sibling. + b.inject_js(""" + ph_input_form_helper_text = function(id) { + return document.getElementById(id).parentElement.parentElement.querySelector(".pf-v5-c-helper-text__item.pf-m-error").textContent + + }""") + class NetworkCreateDialog(object): def __init__( self, test_obj, name, forward_mode=None, ip_conf=None, ipv4_address=None, ipv4_netmask=None, ipv6_address=None, ipv6_prefix=None, device=None, @@ -207,16 +214,19 @@ self.test_obj.assertIn(self.xfail_error, error_message) else: for xfo in self.xfail_objects: - b.wait_in_text(f"#create-network-dialog .pf-v5-c-modal-box__body #create-network-{xfo} + .pf-v5-c-form__helper-text .pf-m-error", self.xfail_error) + if "range" in xfo: + b.wait_in_text(f"#create-network-dialog .create-network-{xfo} .pf-v5-c-form__helper-text .pf-v5-c-helper-text__item.pf-m-error", self.xfail_error) + else: + self.test_obj.assertIn(self.xfail_error, b.eval_js(f"ph_input_form_helper_text(\"create-network-{xfo}\")")) self.cancel() else: b.wait_not_present("#create-network-dialog") def verify_expected_error_on_head(self, error_message): - b.click(f'#network-{self.name}-system-state button:contains("view more")') + b.click(f'#network-{self.name}-system-state-error button:contains("view more")') b.wait_in_text(".pf-v5-c-popover", error_message) - b.click(f'#network-{self.name}-system-state button[aria-label=Close]') + b.click(f'#network-{self.name}-system-state-error button[aria-label=Close]') def verify_dialog(self): # Check that the defined network is now visible diff -Nru cockpit-machines-295/test/check-machines-settings cockpit-machines-298/test/check-machines-settings --- cockpit-machines-295/test/check-machines-settings 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/test/check-machines-settings 2023-09-04 12:22:47.000000000 +0000 @@ -239,7 +239,7 @@ # Warning should disappear and changes should be visible in the UI b.wait_not_present("#cpu-tooltip") b.wait_not_present("#vm-subVmTest1-needs-shutdown") - b.wait_in_text("#vm-subVmTest1-cpu .pf-c-description-list__text", "host") + b.wait_in_text("#vm-subVmTest1-cpu .pf-v5-c-description-list__text", "host") # Choose manually a CPU model b.click("#vm-subVmTest1-cpu button") @@ -247,7 +247,7 @@ b.select_from_dropdown("#cpu-model-select-group select", "coreduo") b.click("#machines-cpu-modal-dialog-apply") b.wait_not_present("#machines-cpu-modal-dialog") - b.wait_in_text("#vm-subVmTest1-cpu .pf-c-description-list__text", "custom (coreduo)") + b.wait_in_text("#vm-subVmTest1-cpu .pf-v5-c-description-list__text", "custom (coreduo)") # Verify libvirt XML dom_xml = "virsh dumpxml subVmTest1" @@ -260,9 +260,9 @@ b.select_from_dropdown("#cpu-model-select-group select", "host-model") b.click("#machines-cpu-modal-dialog-apply") b.wait_not_present("#machines-cpu-modal-dialog") - b.wait_in_text("#vm-subVmTest1-cpu .pf-c-description-list__text", "host") + b.wait_in_text("#vm-subVmTest1-cpu .pf-v5-c-description-list__text", "host") b.click("#vm-subVmTest1-system-run") - b.wait_in_text("#vm-subVmTest1-cpu .pf-c-description-list__text", "custom") + b.wait_in_text("#vm-subVmTest1-cpu .pf-v5-c-description-list__text", "custom") # In the test ENV libvirt does not properly set the CPU model so we see a tooltip https://bugzilla.redhat.com/show_bug.cgi?id=1913337 # b.wait_not_present("#cpu-tooltip") @@ -363,7 +363,7 @@ # re-open and check the boot option is the disk b.click("#vm-subVmTest1-boot-order button") b.wait_visible("#vm-subVmTest1-order-modal-window") - b.wait_text("#vm-subVmTest1-order-modal-device-row-0 .pf-v5-c-description-list__description .pf-c-description-list__text", args["image"]) + b.wait_text("#vm-subVmTest1-order-modal-device-row-0 .pf-v5-c-description-list__description .pf-v5-c-description-list__text", args["image"]) b.click("#vm-subVmTest1-order-modal-cancel") b.wait_not_present("#vm-subVmTest1-order-modal-window") @@ -472,7 +472,8 @@ # Change watchdog b.click("#vm-subVmTest1-watchdog-button") - b.wait_visible("#vm-subVmTest1-watchdog-modal") + # HACK: PF modal with duplicate id's https://github.com/patternfly/patternfly-react/issues/9399 + b.wait_visible("#vm-subVmTest1-watchdog-modal.pf-v5-c-modal-box") b.click("#reset") b.click("#watchdog-dialog-apply") b.wait_not_present("#vm-subVmTest1-watchdog-modal") @@ -510,11 +511,12 @@ def openWatchDogDialog(): b.click("#vm-subVmTest1-watchdog-button") - b.wait_visible("#vm-subVmTest1-watchdog-modal") + # HACK: PF modal with duplicate id's https://github.com/patternfly/patternfly-react/issues/9399 + b.wait_visible("#vm-subVmTest1-watchdog-modal.pf-v5-c-modal-box") def closeWatchDogDialog(selector): b.click(selector) - b.wait_not_present("#vm-subVmTest1-watchdog-modal") + b.wait_not_present("#vm-subVmTest1-watchdog-modal.pf-v5-c-modal-box") def setWatchdogAction(action, machine_has_no_watchdog=False, pixel_test_tag=None, reboot_machine=False): # If no watchdog action is set, we are attaching a new watchdog device. If watchdog already is set, we are editing an exiting watchdog device @@ -526,7 +528,7 @@ openWatchDogDialog() if pixel_test_tag: - b.assert_pixels("#vm-subVmTest1-watchdog-modal", pixel_test_tag, skip_layouts=["rtl"]) + b.assert_pixels("#vm-subVmTest1-watchdog-modal.pf-v5-c-modal-box", pixel_test_tag, skip_layouts=["rtl"]) b.click(f"#{action}") @@ -592,10 +594,11 @@ def removeWatchdogDevice(live=True): b.click("#vm-subVmTest1-watchdog-button") - b.wait_visible("#vm-subVmTest1-watchdog-modal") + # HACK: PF modal with duplicate id's https://github.com/patternfly/patternfly-react/issues/9399 + b.wait_visible("#vm-subVmTest1-watchdog-modal.pf-v5-c-modal-box") b.click("#watchdog-dialog-detach") - b.wait_not_present("#vm-subVmTest1-watchdog-modal") + b.wait_not_present("#vm-subVmTest1-watchdog-modal.pf-v5-c-modal-box") b.wait_in_text("#vm-subVmTest1-watchdog-state", "none") # check no watchdog is present in VM's xml (also xmllint is expected to return non-zero code) @@ -695,7 +698,8 @@ # Watchdog can be attached to a transient VM b.click("#vm-subVmTest2-watchdog-button") - b.wait_visible("#vm-subVmTest2-watchdog-modal") + # HACK: PF modal with duplicate id's https://github.com/patternfly/patternfly-react/issues/9399 + b.wait_visible("#vm-subVmTest2-watchdog-modal.pf-v5-c-modal-box") b.click("#pause") b.click("#watchdog-dialog-apply") b.wait_not_present("#vm-subVmTest2-watchdog-modal") @@ -703,7 +707,8 @@ # Watchdog of transient VM should not be editable b.click("#vm-subVmTest2-watchdog-button") - b.wait_visible("#vm-subVmTest2-watchdog-modal") + # HACK: PF modal with duplicate id's https://github.com/patternfly/patternfly-react/issues/9399 + b.wait_visible("#vm-subVmTest2-watchdog-modal.pf-v5-c-modal-box") b.wait_visible("#watchdog-dialog-apply[aria-disabled=true]") b.mouse("#watchdog-dialog-apply", "mouseenter") b.wait_visible("#watchdog-live-edit-tooltip") @@ -722,10 +727,11 @@ b.wait_in_text("#vm-subVmTest1-vsock-button", "edit") b.click("#vm-subVmTest1-vsock-button") - b.wait_visible("#vm-subVmTest1-vsock-modal") + # HACK: PF modal with duplicate id's https://github.com/patternfly/patternfly-react/issues/9399 + b.wait_visible("#vm-subVmTest1-vsock-modal.pf-v5-c-modal-box") if pixel_test_tag: - b.assert_pixels("#vm-subVmTest1-vsock-modal", pixel_test_tag) + b.assert_pixels("#vm-subVmTest1-vsock-modal.pf-v5-c-modal-box", pixel_test_tag) b.set_checked("#vsock-cid-generate", not auto) if not auto: @@ -749,7 +755,8 @@ def setVsockLive(new_auto, new_address=None, previous_address=None, previous_auto=None, reboot_machine=False): b.click("#vm-subVmTest1-vsock-button") - b.wait_visible("#vm-subVmTest1-vsock-modal") + # HACK: PF modal with duplicate id's https://github.com/patternfly/patternfly-react/issues/9399 + b.wait_visible("#vm-subVmTest1-vsock-modal.pf-v5-c-modal-box") b.set_checked("#vsock-cid-generate", not new_auto) if not new_auto: @@ -822,10 +829,11 @@ def removeVsockDevice(live=True): b.click("#vm-subVmTest1-vsock-button") - b.wait_visible("#vm-subVmTest1-vsock-modal") + # HACK: PF modal with duplicate id's https://github.com/patternfly/patternfly-react/issues/9399 + b.wait_visible("#vm-subVmTest1-vsock-modal.pf-v5-c-modal-box") b.click("#vsock-dialog-detach") - b.wait_not_present("#vm-subVmTest1-vsock-modal") + b.wait_not_present("#vm-subVmTest1-vsock-modal.pf-v5-c-modal-box") b.wait_in_text("#vm-subVmTest1-vsock-address", "none") # check no vsock is present in VM's xml (also xmllint is expected to return non-zero code) @@ -875,7 +883,7 @@ # Vsock of transient VM should not be editable b.click("#vm-subVmTest1-vsock-button") - b.wait_visible("#vm-subVmTest1-vsock-modal") + b.wait_visible("#vm-subVmTest1-vsock-modal.pf-v5-c-modal-box") b.wait_visible("#vsock-dialog-apply[aria-disabled=true]") b.mouse("#vsock-dialog-apply", "mouseenter") b.wait_visible("#vsock-live-edit-tooltip") diff -Nru cockpit-machines-295/test/check-machines-storage-pools cockpit-machines-298/test/check-machines-storage-pools --- cockpit-machines-295/test/check-machines-storage-pools 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/test/check-machines-storage-pools 2023-09-04 12:22:47.000000000 +0000 @@ -27,12 +27,12 @@ class TestMachinesStoragePools(VirtualMachinesCase): def gotoVolumesTab(self, poolName, connectionName="system"): - selector = f"tr[data-row-id=pool-{poolName}-{connectionName}] + tr li:contains('Storage volumes')" + selector = f"tr[data-row-id='pool-{poolName}-{connectionName}'] + tr li:contains('Storage volumes')" self.browser.click(selector + " > button") self.browser.wait_attr(selector, "class", "pf-v5-c-tabs__item pf-m-current") def gotoOverviewTab(self, poolName, connectionName="system"): - selector = f"tr[data-row-id=pool-{poolName}-{connectionName}] + tr li:contains('Overview')" + selector = f"tr[data-row-id='pool-{poolName}-{connectionName}'] + tr li:contains('Overview')" self.browser.click(selector + " > button") self.browser.wait_attr(selector, "class", "pf-v5-c-tabs__item pf-m-current") @@ -107,7 +107,7 @@ # Check storage volumes of a pool self.gotoVolumesTab("myPoolOne") - b.wait_in_text(f"tr[data-row-id=pool-myPoolOne-{connectionName}] + tr .pf-v5-c-empty-state", + b.wait_in_text(f"tr[data-row-id='pool-myPoolOne-{connectionName}'] + tr .pf-v5-c-empty-state", "No storage volumes defined for this storage pool") # Close expanded row for this pool @@ -164,7 +164,7 @@ # Try deactivating and activating a pool b.click(f"#deactivate-pool-myPoolOne-{connectionName}") b.wait_in_text(f"#pool-myPoolOne-{connectionName}-state", "inactive") - b.wait_in_text(f"tr[data-row-id=pool-myPoolOne-{connectionName}] + tr .pf-v5-c-empty-state", "Activate the storage pool to administer volumes") + b.wait_in_text(f"tr[data-row-id='pool-myPoolOne-{connectionName}'] + tr .pf-v5-c-empty-state", "Activate the storage pool to administer volumes") b.wait_visible(f'#myPoolOne-{connectionName}-create-volume-button:disabled') b.click(f"#activate-pool-myPoolOne-{connectionName}") b.wait_in_text(f"#pool-myPoolOne-{connectionName}-state", "active") @@ -185,8 +185,18 @@ b.wait_visible(f"#pool-myPoolTwo-{connectionName}-volume-VolumeOne-usedby") b.wait_in_text(f"#pool-myPoolTwo-{connectionName}-volume-VolumeOne-usedby", "subVmTest1") - m.execute("virsh detach-disk --config --target vdc subVmTest1") - b.wait_in_text(f"#pool-myPoolTwo-{connectionName}-volume-VolumeOne-usedby", "") + # Detach disk from VM + self.goToMainPage() + self.waitVmRow("subVmTest1") + self.goToVmPage("subVmTest1") + self.deleteDisk("vdc") + self.goToMainPage() + b.click(".pf-v5-c-card .pf-v5-c-card__header button:contains(Storage pools)") + self.togglePoolRow("myPoolTwo", connectionName) + self.gotoVolumesTab("myPoolTwo") + + # Verify storage pool's "Used by [vms]" was updated + b.wait_text(f"#pool-myPoolTwo-{connectionName}-volume-VolumeOne-usedby", "") # Transient pool self.togglePoolRow("myPoolThree", connectionName) @@ -695,14 +705,9 @@ # Prepare a shutoff VM and a disk attached to the VM args = self.createVm("subVmTest1", running=False) - disk_xml = ''' - - - - -''' - m.execute("virsh vol-create-as images forDeletion 1M") - m.execute(f'echo "{disk_xml}" > /tmp/diskXML; virsh attach-device --current subVmTest1 /tmp/diskXML') + # Volumes for deletion + m.execute("virsh vol-create-as images a 1M") + m.execute("virsh vol-create-as images z 1M") # Prepare dir pool dir_pool = os.path.join(self.vm_tmpdir, "dir_pool") @@ -739,6 +744,73 @@ b.click(".pf-v5-c-card .pf-v5-c-card__header button:contains(Storage pool)") b.wait_visible("#storage-pools-listing") + # Check for deleting a pool whose disk is used by a VM + b.click("#pool-images-system-action-kebab button") + b.click("#delete-pool-images-system") + b.set_checked("#storage-pool-delete-volumes", True) + b.wait_in_text(".pf-v5-c-backdrop .pf-v5-c-helper-text__item-text", "Pool's volumes are used by") + b.wait_visible(".pf-v5-c-backdrop footer button[aria-disabled=true]:contains(Delete)") + + # Check "Cancel" button + b.click(".pf-v5-c-backdrop footer button:contains(Cancel)") + b.wait_not_present(".pf-v5-c-backdrop") + + # Check "X" button of the dialog + b.click("#pool-images-system-action-kebab button") + b.click("#delete-pool-images-system") + b.click(".pf-v5-c-backdrop button[aria-label=Close]") + b.wait_not_present(".pf-v5-c-backdrop") + + # Check error shown beside the title, not in the footer + # Delete the VM, or the deletion button will be disabled + m.execute("virsh dumpxml subVmTest1 > /tmp/subVmTest1.xml") + m.execute("virsh undefine subVmTest1") + b.click(".pf-v5-c-breadcrumb__link:contains(Virtual machines)") + b.wait_in_text("#virtual-machines-listing .pf-v5-c-empty-state", "No VM is running") + b.click(".pf-v5-c-card .pf-v5-c-card__header button:contains(Storage pool)") + m.execute(f'chattr +a {args["image"]}') + self.addCleanup(m.execute, f'chattr -a {args["image"]}') + + b.click("#pool-images-system-action-kebab button") + b.click("#delete-pool-images-system") + b.set_checked("#storage-pool-delete-volumes", True) + b.wait_visible("#storage-pool-delete-modal") + b.click("#storage-pool-delete-modal .pf-v5-c-modal-box__footer button:nth-child(1)") + b.wait_in_text(".pf-v5-c-backdrop header + div .pf-v5-c-alert__description", "cannot unlink file") + m.execute("! test -f /var/lib/libvirt/images/a; ! test -f /var/lib/libvirt/images/z") + b.click("#storage-pool-delete-modal .pf-v5-c-modal-box__footer button:nth-child(2)") + b.wait_not_present(".pf-v5-c-backdrop") + + # Check the hint of a transient storage pool + m.execute("virsh pool-dumpxml images > /tmp/poolImages") + m.execute("virsh pool-destroy images; virsh pool-undefine images; virsh pool-create /tmp/poolImages") + # self.addCleanup(m.execute, "virsh pool-define /tmp/poolImages") + # The pool will not be shown if creating a transient storage pool without defining + b.reload() + b.enter_page('/machines') + b.wait_in_text("body", "Virtual machines") + + b.click("#pool-images-system-action-kebab button") + b.wait_visible("#delete-pool-images-system a[aria-disabled=true]") + b.mouse("#delete-pool-images-system a", "mouseenter") + b.wait_in_text( + ".pf-v5-c-tooltip__content", + "Non-persistent storage pool cannot be deleted. It ceases to exists when it's deactivated.") + + # Re-define the VM and the pool + m.execute("virsh define /tmp/subVmTest1.xml") + m.execute("virsh pool-define /tmp/poolImages") + + # Attach the disk + disk_xml = ''' + + + + +''' + m.execute("virsh vol-create-as images forDeletion 1M") + m.execute(f'echo "{disk_xml}" > /tmp/diskXML; virsh attach-device --current subVmTest1 /tmp/diskXML') + class StoragePoolsCreationAndDeletion: def __init__(self, test_obj, @@ -813,6 +885,10 @@ b.click(f"#delete-pool-{self.name}-{self.connection}") # Check if deletion dialog is shown b.wait_visible("div.pf-v5-c-modal-box") + # Checks for the deletion dialog + b.wait_in_text("#storage-pool-delete-modal .pf-v5-c-modal-box__title-text", f"Delete {self.name} storage pool?") + # Checks for the icon in the dialog title + b.wait_visible('#storage-pool-delete-modal svg[color=orange]') if self.activate: if self.vol_name or self.pool_type == "iscsi": @@ -927,11 +1003,13 @@ vol_name=dev.split("/")[-1] + "1", remove_volume=True).execute() - StoragePoolsCreationAndDeletion(self, - name="pdd-pool-3", - pool_type="disk", - target="/media/", - source_dev=dev).execute() + # Workaround Firefox on TF taking longer to find tr[data-row-id=\"pool-pdd-pool-3-system\"] + with b.wait_timeout(120): + StoragePoolsCreationAndDeletion(self, + name="pdd-pool-3", + pool_type="disk", + target="/media/", + source_dev=dev).execute() # iscsi pool deletion # TODO: Arch image has no iscsi yet diff -Nru cockpit-machines-295/test/common/lcov.py cockpit-machines-298/test/common/lcov.py --- cockpit-machines-295/test/common/lcov.py 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/test/common/lcov.py 2023-09-04 12:22:47.000000000 +0000 @@ -29,6 +29,7 @@ import json import os import re +import shutil import subprocess import sys from bisect import bisect_left @@ -260,7 +261,7 @@ return None def find_source(self, diff_line): - return self.source_map[diff_line] + return self.source_map.get(diff_line) def print_diff_coverage(path, file_hits, out): @@ -424,7 +425,10 @@ if line.startswith("DA:"): parts = line[3:].split(",") if int(parts[1]) == 0: - (src, line, text) = dm.find_source(int(parts[0])) + info = dm.find_source(int(parts[0])) + if not info: + continue + (src, line, text) = info if not is_interesting_line(text): continue if src == cur_src and line == cur_line + 1: @@ -442,22 +446,34 @@ def prepare_for_code_coverage(): # This gives us a convenient link at the top of the logs, see link-patterns.json print("Code coverage report in Coverage/index.html") - os.makedirs("lcov", exist_ok=True) + if os.path.exists("lcov"): + shutil.rmtree("lcov") + os.makedirs("lcov") + # Detect the default branch to compare with, Anaconda still uses master as main. + branch = "main" + try: + subprocess.check_call(["git", "rev-parse", "--quiet", "--verify", branch], stdout=subprocess.DEVNULL) + except subprocess.SubprocessError: + branch = "master" with open("lcov/github-pr.diff", "w") as f: - subprocess.check_call(["git", "-c", "diff.noprefix=false", "diff", "--patience", "main"], stdout=f) + subprocess.check_call(["git", "-c", "diff.noprefix=false", "diff", "--patience", branch], stdout=f) def create_coverage_report(): output = os.environ.get("TEST_ATTACHMENTS", BASE_DIR) lcov_files = glob.glob(f"{BASE_DIR}/lcov/*.info.gz") try: - title = os.path.basename(subprocess.check_output(["git", "remote", "get-url", "origin"])) + title = os.path.basename(subprocess.check_output(["git", "remote", "get-url", "origin"])).decode().strip() except subprocess.CalledProcessError: title = "?" if len(lcov_files) > 0: all_file = f"{BASE_DIR}/lcov/all.info" diff_file = f"{BASE_DIR}/lcov/diff.info" - subprocess.check_call(["lcov", "--quiet", "--output", all_file, + excludes = [] + # Exclude pkg/lib in Cockpit projects such as podman/machines. + if title != "cockpit.git": + excludes = ["--exclude", "pkg/lib"] + subprocess.check_call(["lcov", "--quiet", "--output", all_file, *excludes, *itertools.chain(*[["--add", f] for f in lcov_files])]) subprocess.check_call(["lcov", "--quiet", "--output", diff_file, "--extract", all_file, "*/github-pr.diff"]) diff -Nru cockpit-machines-295/test/common/run-tests cockpit-machines-298/test/common/run-tests --- cockpit-machines-295/test/common/run-tests 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/test/common/run-tests 2023-09-04 12:22:47.000000000 +0000 @@ -119,7 +119,7 @@ return None, 0 if not opts.thorough: - cmd = ["test-failure-policy"] + cmd = ["test-failure-policy", "--all"] if not opts.track_naughties: cmd.append("--offline") cmd.append(testvm.DEFAULT_IMAGE) @@ -132,6 +132,11 @@ self._print_test(skip_reason="# SKIP {0}".format(reason.decode("utf-8"))) return None, 0 + if proc.returncode == 78: + self.returncode = proc.returncode + self._print_test(skip_reason="# NOTE {0}".format(reason.decode("utf-8"))) + return None, 1 + if proc.returncode == 1: retry_reason = reason.decode("utf-8") @@ -298,10 +303,14 @@ def detect_tests(test_files, image, opts): - """Build the list of tests we'll parallelize and the ones we'll run serially""" + """Detect tests to be run + + Builds the list of tests we'll run in separate machines (destructive tests) + and the ones we can run on the same machine (nondestructive) + """ - parallel_tests = [] - serial_tests = [] + destructive_tests = [] + nondestructive_tests = [] seen_classes = {} machine_class = None test_id = 1 @@ -341,30 +350,30 @@ rwa = not testlib.get_decorator(test_method, test, "no_retry_when_changed") todo = testlib.get_decorator(test_method, test, "todo") if getattr(test.__class__, "provision", None): - # each additionally provisioned VM costs parallel test capacity + # each additionally provisioned VM costs destructive test capacity cost = len(test.__class__.provision) else: cost = 1 test = Test(test_id, build_command(filename, test_str, opts), test_timeout, nd, rwa, todo, cost=cost) if nd: - serial_tests.append(test) + nondestructive_tests.append(test) else: if not opts.nondestructive: - parallel_tests.append(test) + destructive_tests.append(test) test_id += 1 - # sort serial tests by class/test name, to avoid spurious errors where failures depend on the order of + # sort non destructive tests by class/test name, to avoid spurious errors where failures depend on the order of # execution but let's make sure we always test them both ways around; hash the image name, which is # robust, reproducible, and provides an even distribution of both directions - serial_tests.sort(key=lambda t: t.command[-1], reverse=bool(binascii.crc32(image.encode()) & 1)) + nondestructive_tests.sort(key=lambda t: t.command[-1], reverse=bool(binascii.crc32(image.encode()) & 1)) - return (serial_tests, parallel_tests, machine_class) + return (nondestructive_tests, destructive_tests, machine_class) def list_tests(opts): test_files = glob.glob(os.path.join(opts.test_dir, opts.test_glob)) - serial_tests, parallel_tests, _ = detect_tests(test_files, "dummy", opts) - names = {t.command[-1] for t in serial_tests + parallel_tests} + nondestructive_tests, destructive_tests, _ = detect_tests(test_files, "dummy", opts) + names = {t.command[-1] for t in nondestructive_tests + destructive_tests} for n in sorted(names): print(n) @@ -378,24 +387,24 @@ test_files = glob.glob(os.path.join(opts.test_dir, opts.test_glob)) changed_tests = get_affected_tests(opts.test_dir, opts.base, test_files) - serial_tests, parallel_tests, machine_class = detect_tests(test_files, image, opts) - serial_tests_len = len(serial_tests) - parallel_tests_len = len(parallel_tests) + nondestructive_tests, destructive_tests, machine_class = detect_tests(test_files, image, opts) + nondestructive_tests_len = len(nondestructive_tests) + destructive_tests_len = len(destructive_tests) if opts.machine: - assert not parallel_tests + assert not destructive_tests - print(f"1..{serial_tests_len + parallel_tests_len}") + print(f"1..{nondestructive_tests_len + destructive_tests_len}") flush_stdout() running_tests = [] global_machines = [] if not opts.machine: - # Create appropriate number of serial machines; prioritize the nondestructive (serial) tests, to get - # them out of the way as fast as possible, then let the destructive (parallel) ones start as soon as - # a given serial runner is done. - num_global = min(serial_tests_len, opts.jobs) + # Create appropriate number of nondestructive machines; prioritize the nondestructive tests, to get + # them out of the way as fast as possible, then let the destructive ones start as soon as + # a given nondestructive runner is done. + num_global = min(nondestructive_tests_len, opts.jobs) for _ in range(num_global): global_machines.append(GlobalMachine(restrict=not opts.enable_network, cpus=opts.nondestructive_cpus, @@ -433,31 +442,31 @@ # run again if needed if retry_reason: if test.nondestructive: - serial_tests.insert(0, test) + nondestructive_tests.insert(0, test) else: - parallel_tests.insert(0, test) + destructive_tests.insert(0, test) if opts.machine: - if not running_tests and serial_tests: - test = serial_tests.pop(0) + if not running_tests and nondestructive_tests: + test = nondestructive_tests.pop(0) logging.debug("Static machine is free, assigning next test %s", test) test.assign_machine(-1, opts.machine, opts.browser) test.start() running_tests.append(test) made_progress = True else: - # find free global machines, and either assign a new serial test, or kill them to free resources + # find free global machines, and either assign a new non destructive test, or kill them to free resources for (idx, machine) in enumerate(global_machines): if machine.is_available(): - if serial_tests: - test = serial_tests.pop(0) + if nondestructive_tests: + test = nondestructive_tests.pop(0) logging.debug("Global machine %s is free, assigning next test %s", idx, test) machine.running_test = test test.assign_machine(idx, machine.ssh_address, machine.web_address) test.start() running_tests.append(test) else: - logging.debug("Global machine %s is free, and no more serial tests; killing", idx) + logging.debug("Global machine %s is free, and no more non destructive tests; killing", idx) machine.kill() made_progress = True @@ -465,10 +474,10 @@ def running_cost(): return sum(test.cost for test in running_tests) - # fill the remaining available job slots with parallel tests; run tests with a cost higher than #jobs by themselves - while parallel_tests and (running_cost() + parallel_tests[0].cost <= opts.jobs or len(running_tests) == 0): - test = parallel_tests.pop(0) - logging.debug("%d running tests with total cost %d, starting next parallel test %s", + # fill the remaining available job slots with destructive tests; run tests with a cost higher than #jobs by themselves + while destructive_tests and (running_cost() + destructive_tests[0].cost <= opts.jobs or len(running_tests) == 0): + test = destructive_tests.pop(0) + logging.debug("%d running tests with total cost %d, starting next destructive test %s", len(running_tests), running_cost(), test) test.start() running_tests.append(test) @@ -476,8 +485,8 @@ # are we done? if not running_tests: - assert not serial_tests, f"serial_tests should be empty: {[str(t) for t in serial_tests]}" - assert not parallel_tests, f"parallel_tests should be empty: {[str(t) for t in parallel_tests]}" + assert not nondestructive_tests, f"nondestructive_tests should be empty: {[str(t) for t in nondestructive_tests]}" + assert not destructive_tests, f"destructive_tests should be empty: {[str(t) for t in destructive_tests]}" break # Sleep if we didn't make progress @@ -492,12 +501,12 @@ duration = int(time.time() - start_time) hostname = socket.gethostname().split(".")[0] - serial_details = [] + nondestructive_details = [] if not opts.machine: for (idx, machine) in enumerate(global_machines): - serial_details.append(f"{idx}: {machine.duration}s") + nondestructive_details.append(f"{idx}: {machine.duration}s") - details = f"[{duration}s on {hostname}, {parallel_tests_len} parallel tests, {serial_tests_len} serial tests: {', '.join(serial_details)}]" + details = f"[{duration}s on {hostname}, {destructive_tests_len} destructive tests, {nondestructive_tests_len} nondestructive tests: {', '.join(nondestructive_details)}]" print() if fail_count > 0: print(f"# {fail_count} TESTS FAILED {details}") diff -Nru cockpit-machines-295/test/common/storagelib.py cockpit-machines-298/test/common/storagelib.py --- cockpit-machines-295/test/common/storagelib.py 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/test/common/storagelib.py 2023-09-04 12:22:47.000000000 +0000 @@ -66,17 +66,22 @@ The disk gets removed automatically when the test ends. This is safe for @nondestructive tests. - Unlike add_ram_disk(), this can be called multiple times, and is less size constrained. - However, loopback devices look quite special to the OS, so they are not a very good - simulation of a "real" disk. + Unlike add_ram_disk(), this can be called multiple times, and + is less size constrained. The backing file starts out sparse, + so this can be used to create massive block devices, as long + as you are careful to not actually use much of it. + + However, loopback devices look quite special to the OS, so + they are not a very good simulation of a "real" disk. Return the device name. + """ # HACK: https://bugzilla.redhat.com/show_bug.cgi?id=1969408 # It would be nicer to remove $F immediately after the call to # losetup, but that will break some versions of lvm2. dev = self.machine.execute("F=$(mktemp /var/tmp/loop.XXXX); " - "dd if=/dev/zero of=$F bs=1000000 count=%s; " + "truncate --size=%sMB $F; " "losetup --show %s $F" % (size, name if name else "--find")).strip() # If this device had partions in its last incarnation on this # machine, they might come back for unknown reasons, in a @@ -140,7 +145,7 @@ def content_tab_expand(self, row_index, tab_index): tab_btn = self.content_row_tbody(row_index) + " .pf-v5-c-tabs ul li:nth-child(%d) button" % tab_index - tab = self.content_row_tbody(row_index) + " .ct-listing-panel-body[data-key=%d]" % (tab_index - 1) + tab = self.content_row_tbody(row_index) + " .ct-listing-panel-body[data-key='%d']" % (tab_index - 1) self.content_row_expand(row_index) self.browser.click(tab_btn) self.browser.wait_visible(tab) @@ -180,7 +185,7 @@ row = self.content_row_tbody(row_index) row_item = row + " tr td.pf-v5-c-table__toggle button" tab_btn = row + " .pf-v5-c-tabs ul li:nth-child(%d) button" % tab_index - tab = row + " .ct-listing-panel-body[data-key=%d]" % (tab_index - 1) + tab = row + " .ct-listing-panel-body[data-key='%d']" % (tab_index - 1) cell = tab + f" dt:contains({title}) + *" # The DOM might change at any time while we are inspecting @@ -265,9 +270,10 @@ for label in val: self.browser.set_checked(f'{sel} :contains("{label}") input', val) elif ftype == "size-slider": - self.browser.set_val(sel + " .size-unit", "1000000") - self.browser.set_input_text(sel + " .size-text", str(val)) + self.browser.set_val(sel + " .size-unit select", "1000000") + self.browser.set_input_text(sel + " .size-text input", str(val)) elif ftype == "select": + self.browser._wait_present(sel + f" select option[value='{val}']:not([disabled])") self.browser.set_val(sel + " select", val) elif ftype == "select-radio": self.browser.click(sel + f" input[data-data='{val}']") @@ -304,8 +310,8 @@ sel = self.dialog_field(field) ftype = self.browser.attr(sel, "data-field-type") if ftype == "size-slider": - self.browser.wait_val(sel + " .size-unit", unit) - self.browser.wait_val(sel + " .size-text", str(val)) + self.browser.wait_val(sel + " .size-unit select", unit) + self.browser.wait_val(sel + " .size-text input", str(val)) elif ftype == "select": self.browser.wait_attr(sel, "data-value", val) else: @@ -601,6 +607,8 @@ mkdir /new-root mount /dev/root/root /new-root mkfs.ext4 {dev}1 +# don't move the EFI partition +if mountpoint /boot/efi; then umount /boot/efi; fi mkdir /new-root/boot mount {dev}1 /new-root/boot tar --selinux --one-file-system -cf - --exclude /boot --exclude='/var/tmp/*' --exclude='/var/cache/*' \ diff -Nru cockpit-machines-295/test/common/test-functions.js cockpit-machines-298/test/common/test-functions.js --- cockpit-machines-295/test/common/test-functions.js 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/test/common/test-functions.js 2023-09-04 12:22:47.000000000 +0000 @@ -8,9 +8,18 @@ */ function ph_select(sel) { - if (!window.Sizzle) + if (!window.Sizzle) { return Array.from(document.querySelectorAll(sel)); - return window.Sizzle(sel); + } + + if (sel.includes(":contains(")) { + if (!window.Sizzle) { + throw new Error("Using ':contains' when window.Sizzle is not available."); + } + return window.Sizzle(sel); + } else { + return Array.from(document.querySelectorAll(sel)); + } } function ph_only(els, sel) { diff -Nru cockpit-machines-295/test/common/testlib.py cockpit-machines-298/test/common/testlib.py --- cockpit-machines-295/test/common/testlib.py 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/test/common/testlib.py 2023-09-04 12:22:47.000000000 +0000 @@ -162,7 +162,7 @@ :param filename: file to put in attachments directory :param move: set this to true to move dynamically generated files which - are not touched by parallel tests. (default False) + are not touched by destructive tests. (default False) """ if not opts.attachments: return @@ -543,7 +543,7 @@ self.wait_val(selector, val) def set_file_autocomplete_val(self, group_identifier: str, location: str): - self.set_input_text(f"{group_identifier} .pf-v5-c-select__toggle-typeahead", location) + self.set_input_text(f"{group_identifier} .pf-v5-c-select__toggle-typeahead input", location) # click away the selection list, to force a state update self.click(f"{group_identifier} .pf-v5-c-select__toggle-typeahead") self.wait_not_present(f"{group_identifier} .pf-v5-c-select__menu") @@ -592,7 +592,7 @@ return except RuntimeError as e: data = e.args[0] - if count < 20 and type(data) == dict and "response" in data and data["response"].get("message") in ["Execution context was destroyed.", "Cannot find context with specified id"]: + if count < 20 and isinstance(data, dict) and "response" in data and data["response"].get("message") in ["Execution context was destroyed.", "Cannot find context with specified id"]: time.sleep(1) else: raise e @@ -965,7 +965,7 @@ self.set_attr("html", "dir", direction) def set_layout(self, name: str): - layout = [lo for lo in self.layouts if lo["name"] == name][0] + layout = next(lo for lo in self.layouts if lo["name"] == name) if layout != self.current_layout: self.current_layout = layout size = layout["shell_size"] @@ -1691,6 +1691,9 @@ # timedatex.service shuts down after timeout, runs into race condition with property watching ".*org.freedesktop.timedate1: couldn't get all properties.*Error:org.freedesktop.DBus.Error.NoReply.*", + + # https://github.com/cockpit-project/cockpit/issues/19235 + "invalid non-UTF8 @data passed as text to web_socket_connection_send.*", ] default_allowed_messages += os.environ.get("TEST_ALLOW_JOURNAL_MESSAGES", "").split(",") diff -Nru cockpit-machines-295/test/files/mock-rhsm-rest cockpit-machines-298/test/files/mock-rhsm-rest --- cockpit-machines-295/test/files/mock-rhsm-rest 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/test/files/mock-rhsm-rest 2023-09-04 12:22:47.000000000 +0000 @@ -62,6 +62,10 @@ if __name__ == '__main__': - httpd = HTTPServer(('', 443), handler) - httpd.socket = ssl.wrap_socket(httpd.socket, certfile=sys.argv[1], keyfile=sys.argv[2], server_side=True) - httpd.serve_forever() + context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) + context.load_cert_chain(certfile=sys.argv[1], keyfile=sys.argv[2]) + context.check_hostname = False + + with HTTPServer(("localhost", 443), handler) as httpd: + httpd.socket = context.wrap_socket(httpd.socket, server_side=True) + httpd.serve_forever() diff -Nru cockpit-machines-295/test/machineslib.py cockpit-machines-298/test/machineslib.py --- cockpit-machines-295/test/machineslib.py 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/test/machineslib.py 2023-09-04 12:22:47.000000000 +0000 @@ -15,9 +15,13 @@ # You should have received a copy of the GNU Lesser General Public License # along with Cockpit; If not, see . +import os +import sys +import traceback + from netlib import NetworkHelpers from storagelib import StorageHelpers -from testlib import Error, MachineCase, wait +from testlib import Error, MachineCase, attach, wait distrosWithMonolithicDaemon = ["rhel-8-6", "rhel-8-7", "rhel-8-8", "rhel-8-9", "ubuntu-stable", "ubuntu-2204", "debian-testing", "debian-stable", "centos-8-stream", "arch"] @@ -66,7 +70,7 @@ b.wait_in_text("#vm-{0}-{1}-state".format(vmName, connectionName), "Shut off") def goToVmPage(self, vmName, connectionName='system'): - self.browser.click("tbody tr[data-row-id=vm-{0}-{1}] a.vm-list-item-name".format(vmName, connectionName)) # click on the row + self.browser.click("tbody tr[data-row-id=\"vm-{0}-{1}\"] a.vm-list-item-name".format(vmName, connectionName)) # click on the row def goToMainPage(self): self.browser.click(".machines-listing-breadcrumb li:first-of-type a") @@ -76,39 +80,39 @@ def waitVmRow(self, vmName, connectionName='system', present=True): b = self.browser - vm_row = "tbody tr[data-row-id=vm-{0}-{1}]".format(vmName, connectionName) + vm_row = "tbody tr[data-row-id=\"vm-{0}-{1}\"]".format(vmName, connectionName) if present: b.wait_visible(vm_row) else: b.wait_not_present(vm_row) def togglePoolRow(self, poolName, connectionName="system"): - isExpanded = 'pf-m-expanded' in self.browser.attr("tbody tr[data-row-id=pool-{0}-{1}] + tr".format(poolName, connectionName), "class") # click on the row header - self.browser.click("tbody tr[data-row-id=pool-{0}-{1}] .pf-v5-c-table__toggle button".format(poolName, connectionName)) # click on the row header + isExpanded = 'pf-m-expanded' in self.browser.attr("tbody tr[data-row-id=\"pool-{0}-{1}\"] + tr".format(poolName, connectionName), "class") # click on the row header + self.browser.click("tbody tr[data-row-id=\"pool-{0}-{1}\"] .pf-v5-c-table__toggle button".format(poolName, connectionName)) # click on the row header if isExpanded: - self.browser.wait_not_present("tbody tr[data-row-id=pool-{0}-{1}] + tr.pf-m-expanded".format(poolName, connectionName)) # click on the row header + self.browser.wait_not_present("tbody tr[data-row-id=\"pool-{0}-{1}\"] + tr.pf-m-expanded".format(poolName, connectionName)) # click on the row header else: - self.browser.wait_visible("tbody tr[data-row-id=pool-{0}-{1}] + tr.pf-m-expanded".format(poolName, connectionName)) # click on the row header + self.browser.wait_visible("tbody tr[data-row-id=\"pool-{0}-{1}\"] + tr.pf-m-expanded".format(poolName, connectionName)) # click on the row header def waitPoolRow(self, poolName, connectionName="system", present="true"): b = self.browser - pool_row = "tbody tr[data-row-id=pool-{0}-{1}]".format(poolName, connectionName) + pool_row = "tbody tr[data-row-id=\"pool-{0}-{1}\"]".format(poolName, connectionName) if present: b.wait_visible(pool_row) else: b.wait_not_present(pool_row) def toggleNetworkRow(self, networkName, connectionName="system"): - isExpanded = 'pf-m-expanded' in self.browser.attr("tbody tr[data-row-id=network-{0}-{1}] + tr".format(networkName, connectionName), "class") # click on the row header - self.browser.click("tbody tr[data-row-id=network-{0}-{1}] .pf-v5-c-table__toggle button".format(networkName, connectionName)) # click on the row header + isExpanded = 'pf-m-expanded' in self.browser.attr("tbody tr[data-row-id=\"network-{0}-{1}\"] + tr".format(networkName, connectionName), "class") # click on the row header + self.browser.click("tbody tr[data-row-id=\"network-{0}-{1}\"] .pf-v5-c-table__toggle button".format(networkName, connectionName)) # click on the row header if isExpanded: - self.browser.wait_not_present("tbody tr[data-row-id=network-{0}-{1}] + tr.pf-m-expanded".format(networkName, connectionName)) # click on the row header + self.browser.wait_not_present("tbody tr[data-row-id=\"network-{0}-{1}\"] + tr.pf-m-expanded".format(networkName, connectionName)) # click on the row header else: - self.browser.wait_visible("tbody tr[data-row-id=network-{0}-{1}] + tr.pf-m-expanded".format(networkName, connectionName)) # click on the row header + self.browser.wait_visible("tbody tr[data-row-id=\"network-{0}-{1}\"] + tr.pf-m-expanded".format(networkName, connectionName)) # click on the row header def waitNetworkRow(self, networkName, connectionName="system", present="true"): b = self.browser - network_row = "tbody tr[data-row-id=network-{0}-{1}]".format(networkName, connectionName) + network_row = "tbody tr[data-row-id=\"network-{0}-{1}\"]".format(networkName, connectionName) if present: b.wait_visible(network_row) else: @@ -231,6 +235,19 @@ else: return m.execute(cmd) + def deleteDisk(self, target, vm_name="subVmTest1"): + b = self.browser + + b.wait_visible(f"#vm-{vm_name}-disks-{target}-device") + b.wait_visible(f"#vm-{vm_name}-disks-{target}-action-kebab") + b.click(f"#vm-{vm_name}-disks-{target}-action-kebab button") + b.wait_visible(f"#delete-vm-{vm_name}-disks-{target}") + b.click(f"#delete-vm-{vm_name}-disks-{target}") + b.wait_visible(".pf-v5-c-modal-box") + b.click("#delete-resource-modal-primary") + b.wait_not_present(".pf-v5-c-modal-box") + b.wait_not_present(f"#vm-{vm_name}-disks-{target}-device") + def deleteIface(self, iface, mac=None, vm_name=None): b = self.browser @@ -408,8 +425,50 @@ # HACK: older c-ws versions always log an assertion, fixed in PR cockpit#16765 self.allow_journal_messages("json_object_get_string_member: assertion 'node != NULL' failed") + def downloadVmXml(self, vm): + m = self.machine + + vms_xml = f"/var/lib/cockpittest/pkg_specific_artifacts/{vm}.xml" + m.execute(f"virsh dumpxml {vm} > {vms_xml}") + dest_file = f"{self.label()}-{m.label}-{vm}.xml" + dest = os.path.abspath(dest_file) + m.download(vms_xml, dest) + attach(dest, move=False) + print(f"Wrote {vm} XML to {dest_file}") + + def downloadVmLog(self, vm): + m = self.machine + + vms_log = f"/var/log/libvirt/qemu/{vm}.log" + # Log file may not exist, if VM was never started + if m.execute(f"! test -f {vms_log} || echo exists").strip() == "exists": + dest_file = f"{self.label()}-{m.label}-{vm}.log" + dest = os.path.abspath(dest_file) + m.download(vms_log, dest) + attach(dest, move=True) + print(f"Wrote {vm} log to {dest_file}") + + def downloadVmsArtifacts(self): + m = self.machine + + vms = m.execute("virsh list --all --name").strip().splitlines() + if len(vms) > 0: + m.execute("mkdir -p /var/lib/cockpittest/pkg_specific_artifacts") + for vm in vms: + self.downloadVmXml(vm) + self.downloadVmLog(vm) + def tearDown(self): b = self.browser if b.cdp.valid and b.is_present("#button.alert-link.more-button"): b.click("button.alert-link.more-button") + + if self.getError(): + try: + self.downloadVmsArtifacts() + except (OSError, RuntimeError): + # failures in these debug artifacts should not skip cleanup actions + sys.stderr.write("Failed to generate debug artifact:\n") + traceback.print_exc(file=sys.stderr) + super().tearDown() diff -Nru cockpit-machines-295/test/run cockpit-machines-298/test/run --- cockpit-machines-295/test/run 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/test/run 2023-09-04 12:22:47.000000000 +0000 @@ -11,12 +11,6 @@ # linters are off by default for production builds, but we want to run them in CI export LINT=1 -# HACK: drop when we have updated COCKPIT_REPO_COMMIT to https://github.com/cockpit-project/cockpit/commit/3d789f473fd40cafc6eb5ffc2bbb6d1707a6ad72 -PYBRIDGE_MESSAGES="[eE]xception ignored in:.*DBusChannel.setup_path_watch.*,Traceback .*most recent call last.*,File .*,async with self.watch_processing_lock:" -PYBRIDGE_MESSAGES="${PYBRIDGE_MESSAGES},self.release.*,self._wake_up_first.*,fut.set_result.*,self._check_closed.*,raise RuntimeError.*,RuntimeError: Event loop is closed" - -export TEST_ALLOW_JOURNAL_MESSAGES=$PYBRIDGE_MESSAGES - TEST_SCENARIO=${TEST_SCENARIO:-} if [ "$TEST_SCENARIO" == "devel" ]; then diff -Nru cockpit-machines-295/tools/node-modules cockpit-machines-298/tools/node-modules --- cockpit-machines-295/tools/node-modules 2023-07-26 08:49:18.000000000 +0000 +++ cockpit-machines-298/tools/node-modules 2023-09-04 12:22:47.000000000 +0000 @@ -25,6 +25,12 @@ cmd_checkout() { # we default to check out the node_modules corresponding to the gitlink in the index + local force="" + if [ "${1-}" = "--force" ]; then + force="1" + shift + fi + local sha="${1-$(get_index_gitlink node_modules)}" # fetch by sha to prevent us from downloading something we don't want @@ -32,7 +38,7 @@ # verify that our package.json is equal to the one the cached node_modules # was created with, unless --force is given - if [ "${1-}" != "--force" ]; then + if [ -z "$force" ]; then if ! cmp_from_cache "${sha}" '.package.json' 'package.json'; then cat >&2 <