From 52cbc3725f026ea3f2d192dcda81bb83b687b2a0 Mon Sep 17 00:00:00 2001 From: Andrew Schlackman <72105194+sei-aschlackman@users.noreply.github.com> Date: Tue, 20 Sep 2022 10:12:34 -0400 Subject: [PATCH] initial Proxmox console support (#526) * initial Proxmox console support Added support for viewing Proxmox virtual machine NoVNC consoles and sending a Ctrl+Alt+Del. Additional operations such as power on/off can be added in the future. - console route detects vm type and uses NoVNC for Proxmox or WMKS for vsphere --- package-lock.json | 1387 ++++++++++------- package.json | 1 + src/app/app.module.ts | 10 +- .../console-page/console-page.component.scss | 2 +- .../components/console/console.component.html | 35 +- .../components/console/console.component.scss | 5 + .../components/console/console.component.ts | 20 +- src/app/components/novnc/novnc.component.html | 20 + src/app/components/novnc/novnc.component.scss | 16 + .../components/novnc/novnc.component.spec.ts | 30 + src/app/components/novnc/novnc.component.ts | 99 ++ .../options-bar/options-bar.component.ts | 4 +- .../options-bar2/options-bar2.component.html | 20 + .../options-bar2/options-bar2.component.scss | 43 + .../options-bar2.component.spec.ts | 30 + .../options-bar2/options-bar2.component.ts | 42 + .../proxmox-console.component.html | 12 + .../proxmox-console.component.scss | 5 + .../proxmox-console.component.spec.ts | 30 + .../proxmox-console.component.ts | 50 + .../user-follow-page.component.ts | 4 +- src/app/components/wmks/wmks.component.scss | 1 - src/app/components/wmks/wmks.component.ts | 4 +- src/app/generated/vm-api/.gitignore | 3 - .../vm-api/.openapi-generator/VERSION | 3 - src/app/generated/vm-api/README.md | 5 - src/app/generated/vm-api/api.module.ts | 12 +- src/app/generated/vm-api/api/api.ts | 18 +- .../generated/vm-api/api/callbacks.service.ts | 156 ++ src/app/generated/vm-api/api/file.service.ts | 8 +- .../generated/vm-api/api/health.service.ts | 198 +++ .../generated/vm-api/api/proxmox.service.ts | 149 ++ .../api/vmUsageLoggingSession.service.ts | 625 ++++++++ src/app/generated/vm-api/api/vms.service.ts | 72 +- .../generated/vm-api/api/vsphere.service.ts | 8 +- src/app/generated/vm-api/configuration.ts | 8 +- src/app/generated/vm-api/encoder.ts | 8 +- src/app/generated/vm-api/git_push.sh | 5 - src/app/generated/vm-api/index.ts | 8 +- .../vm-api/model/bulkPowerOperation.ts | 8 +- .../model/bulkPowerOperationResponse.ts | 8 +- .../changeVsphereVirtualMachineNetwork.ts | 8 +- .../vm-api/model/consoleConnectionInfo.ts | 8 +- src/app/generated/vm-api/model/coordinate.ts | 10 +- .../vm-api/model/coordinateCreateForm.ts | 10 +- .../createVmUsageLoggingSessionCommand.ts | 29 + .../model/editVmUsageLoggingSessionCommand.ts | 30 + src/app/generated/vm-api/model/eventType.ts | 25 + .../generated/vm-api/model/healthStatus.ts | 26 + src/app/generated/vm-api/model/isoFile.ts | 8 +- src/app/generated/vm-api/model/isoResult.ts | 8 +- src/app/generated/vm-api/model/models.ts | 20 +- .../generated/vm-api/model/mountVsphereIso.ts | 8 +- src/app/generated/vm-api/model/nicOptions.ts | 8 +- src/app/generated/vm-api/model/permissions.ts | 8 +- src/app/generated/vm-api/model/powerState.ts | 8 +- .../generated/vm-api/model/problemDetails.ts | 11 +- .../generated/vm-api/model/proxmoxConsole.ts | 23 + .../setVsphereVirtualMachineResolution.ts | 8 +- src/app/generated/vm-api/model/simpleTeam.ts | 8 +- .../generated/vm-api/model/teamIsoResult.ts | 8 +- ...alidateVsphereVirtualMachineCredentials.ts | 8 +- .../vm-api/model/virtualMachineToolsStatus.ts | 8 +- src/app/generated/vm-api/model/vm.ts | 10 +- .../generated/vm-api/model/vmCreateForm.ts | 8 +- src/app/generated/vm-api/model/vmMap.ts | 8 +- .../generated/vm-api/model/vmMapCreateForm.ts | 9 +- .../generated/vm-api/model/vmMapUpdateForm.ts | 26 + src/app/generated/vm-api/model/vmType.ts | 27 + .../generated/vm-api/model/vmUpdateForm.ts | 8 +- .../vm-api/model/vmUsageLoggingSession.ts | 31 + .../generated/vm-api/model/vmUsageReport.ts | 31 + src/app/generated/vm-api/model/vmUser.ts | 33 + src/app/generated/vm-api/model/vmUserTeam.ts | 25 + .../vm-api/model/vsphereVirtualMachine.ts | 8 +- .../generated/vm-api/model/webhookEvent.ts | 26 + src/app/generated/vm-api/variables.ts | 8 +- src/app/services/novnc/novnc.service.ts | 57 + src/app/services/proxmox/proxmox.service.ts | 18 + src/app/services/signalr/signalr.service.ts | 4 +- src/app/state/vm/vm.query.ts | 12 +- src/app/state/vm/vm.service.ts | 401 +---- src/app/state/vm/vm.store.ts | 21 +- src/app/state/vsphere/vsphere.query.ts | 22 + src/app/state/vsphere/vsphere.service.ts | 391 +++++ src/app/state/vsphere/vsphere.store.ts | 25 + src/styles.scss | 26 - src/styles/styles.scss | 23 + 88 files changed, 3526 insertions(+), 1192 deletions(-) create mode 100644 src/app/components/novnc/novnc.component.html create mode 100644 src/app/components/novnc/novnc.component.scss create mode 100644 src/app/components/novnc/novnc.component.spec.ts create mode 100644 src/app/components/novnc/novnc.component.ts create mode 100644 src/app/components/options-bar2/options-bar2.component.html create mode 100644 src/app/components/options-bar2/options-bar2.component.scss create mode 100644 src/app/components/options-bar2/options-bar2.component.spec.ts create mode 100644 src/app/components/options-bar2/options-bar2.component.ts create mode 100644 src/app/components/proxmox/proxmox-console/proxmox-console.component.html create mode 100644 src/app/components/proxmox/proxmox-console/proxmox-console.component.scss create mode 100644 src/app/components/proxmox/proxmox-console/proxmox-console.component.spec.ts create mode 100644 src/app/components/proxmox/proxmox-console/proxmox-console.component.ts create mode 100644 src/app/generated/vm-api/api/callbacks.service.ts create mode 100644 src/app/generated/vm-api/api/health.service.ts create mode 100644 src/app/generated/vm-api/api/proxmox.service.ts create mode 100644 src/app/generated/vm-api/api/vmUsageLoggingSession.service.ts create mode 100644 src/app/generated/vm-api/model/createVmUsageLoggingSessionCommand.ts create mode 100644 src/app/generated/vm-api/model/editVmUsageLoggingSessionCommand.ts create mode 100644 src/app/generated/vm-api/model/eventType.ts create mode 100644 src/app/generated/vm-api/model/healthStatus.ts create mode 100644 src/app/generated/vm-api/model/proxmoxConsole.ts create mode 100644 src/app/generated/vm-api/model/vmMapUpdateForm.ts create mode 100644 src/app/generated/vm-api/model/vmType.ts create mode 100644 src/app/generated/vm-api/model/vmUsageLoggingSession.ts create mode 100644 src/app/generated/vm-api/model/vmUsageReport.ts create mode 100644 src/app/generated/vm-api/model/vmUser.ts create mode 100644 src/app/generated/vm-api/model/vmUserTeam.ts create mode 100644 src/app/generated/vm-api/model/webhookEvent.ts create mode 100644 src/app/services/novnc/novnc.service.ts create mode 100644 src/app/services/proxmox/proxmox.service.ts create mode 100644 src/app/state/vsphere/vsphere.query.ts create mode 100644 src/app/state/vsphere/vsphere.service.ts create mode 100644 src/app/state/vsphere/vsphere.store.ts delete mode 100644 src/styles.scss diff --git a/package-lock.json b/package-lock.json index 9a6bb5bf..d212c499 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,6 +28,7 @@ "@datorama/akita": "^6.2.1", "@datorama/akita-ng-router-store": "^6.0.2", "@microsoft/signalr": "^5.0.8", + "@novnc/novnc": "^1.3.0", "babel-polyfill": "^6.26.0", "core-js": "^3.15.2", "jquery": "^3.6.0", @@ -95,6 +96,26 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@angular-devkit/architect/node_modules/ajv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", + "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@angular-devkit/architect/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, "node_modules/@angular-devkit/build-angular": { "version": "12.1.4", "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-12.1.4.tgz", @@ -328,6 +349,22 @@ "node": ">= 6.0.0" } }, + "node_modules/@angular-devkit/build-angular/node_modules/ajv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", + "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/@angular-devkit/build-angular/node_modules/cacache": { "version": "15.2.0", "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.2.0.tgz", @@ -401,6 +438,12 @@ "node": ">= 6" } }, + "node_modules/@angular-devkit/build-angular/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, "node_modules/@angular-devkit/build-angular/node_modules/minipass": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", @@ -581,6 +624,28 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@angular-devkit/build-webpack/node_modules/ajv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", + "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, "node_modules/@angular-devkit/core": { "version": "12.1.4", "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.1.4.tgz", @@ -600,6 +665,28 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@angular-devkit/core/node_modules/ajv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", + "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@angular-devkit/core/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, "node_modules/@angular-devkit/schematics": { "version": "8.3.29", "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-8.3.29.tgz", @@ -649,11 +736,6 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, - "node_modules/@angular-devkit/schematics/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, "node_modules/@angular-devkit/schematics/node_modules/magic-string": { "version": "0.25.3", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.3.tgz", @@ -1735,9 +1817,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", + "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==", "dev": true, "engines": { "node": ">=6.9.0" @@ -3183,6 +3265,11 @@ "node": ">= 8" } }, + "node_modules/@novnc/novnc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@novnc/novnc/-/novnc-1.3.0.tgz", + "integrity": "sha512-tR87mY5ADtaELadmZfW937JO/p8fRdz3wkPoqwhqB/vY1XnTQeLSWwkp4yMlr4iIDY0iCficfzFYX5EHMh4MHw==" + }, "node_modules/@npmcli/git": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz", @@ -3425,11 +3512,6 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, - "node_modules/@schematics/angular/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, "node_modules/@schematics/angular/node_modules/magic-string": { "version": "0.25.3", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.3.tgz", @@ -3509,11 +3591,6 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, - "node_modules/@schematics/update/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, "node_modules/@schematics/update/node_modules/magic-string": { "version": "0.25.3", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.3.tgz", @@ -3546,6 +3623,327 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, + "node_modules/@swc/core": { + "version": "1.2.244", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.2.244.tgz", + "integrity": "sha512-/UguNMvKgVeR8wGFb53h+Y9hFSiEpeUhC4Cr1neN15wvWZD3lfvN4qAdqNifZiiPKXrCwYy8NTKlHVtHMYzpXw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "peer": true, + "bin": { + "swcx": "run_swcx.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-android-arm-eabi": "1.2.244", + "@swc/core-android-arm64": "1.2.244", + "@swc/core-darwin-arm64": "1.2.244", + "@swc/core-darwin-x64": "1.2.244", + "@swc/core-freebsd-x64": "1.2.244", + "@swc/core-linux-arm-gnueabihf": "1.2.244", + "@swc/core-linux-arm64-gnu": "1.2.244", + "@swc/core-linux-arm64-musl": "1.2.244", + "@swc/core-linux-x64-gnu": "1.2.244", + "@swc/core-linux-x64-musl": "1.2.244", + "@swc/core-win32-arm64-msvc": "1.2.244", + "@swc/core-win32-ia32-msvc": "1.2.244", + "@swc/core-win32-x64-msvc": "1.2.244" + } + }, + "node_modules/@swc/core-android-arm-eabi": { + "version": "1.2.244", + "resolved": "https://registry.npmjs.org/@swc/core-android-arm-eabi/-/core-android-arm-eabi-1.2.244.tgz", + "integrity": "sha512-bQN6SY78bFIm6lz46ss4+ZDU9owevVjF95Cm+3KB/13ZOPF+m5Pdm8WQLoBYTLgJ0r4/XukEe9XXjba/6Kf8kw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "peer": true, + "dependencies": { + "@swc/wasm": "1.2.122" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-android-arm64": { + "version": "1.2.244", + "resolved": "https://registry.npmjs.org/@swc/core-android-arm64/-/core-android-arm64-1.2.244.tgz", + "integrity": "sha512-CJeL/EeOIzrH+77otNT6wfGF8uadOHo4rEaBN/xvmtnpdADjYJ8Wt85X4nRK0G929bMke/QdJm5ilPNJdmgCTg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "peer": true, + "dependencies": { + "@swc/wasm": "1.2.130" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-android-arm64/node_modules/@swc/wasm": { + "version": "1.2.130", + "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.2.130.tgz", + "integrity": "sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.2.244", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.2.244.tgz", + "integrity": "sha512-ZhRK8L/lpPCerUxtrW48cRJtpsUG5xVTUXu3N0TrYuxRzzapHgK+61g1JdtcwdNvEV7l00X4vfCBRYO0S2nsmw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.2.244", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.2.244.tgz", + "integrity": "sha512-4mY8Gkq2ZMUpXYCLceGp7w0Jnxp75N1gQswNFhMBU4k90ElDuBtPoUSnB1v8MwlQtK7WA25MdvwFnBaEJnfxOg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-freebsd-x64": { + "version": "1.2.244", + "resolved": "https://registry.npmjs.org/@swc/core-freebsd-x64/-/core-freebsd-x64-1.2.244.tgz", + "integrity": "sha512-k/NEZfkgtZ4S96woYArZ89jwJ/L1zyxihTgFFu7SxDt+WRE1EPmY42Gt4y874zi1JiSEFSRHiiueDUfRPu7C0Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "dependencies": { + "@swc/wasm": "1.2.130" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-freebsd-x64/node_modules/@swc/wasm": { + "version": "1.2.130", + "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.2.130.tgz", + "integrity": "sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.2.244", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.2.244.tgz", + "integrity": "sha512-tE9b/oZWhMXwoXHkgHFckMrLrlczvG7HgQAdtDuA6g30Xd/3XmdVzC4NbXR+1HoaGVDh7cf0EFE3aKdfPvPQwA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "dependencies": { + "@swc/wasm": "1.2.130" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf/node_modules/@swc/wasm": { + "version": "1.2.130", + "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.2.130.tgz", + "integrity": "sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.2.244", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.2.244.tgz", + "integrity": "sha512-zrpVKUeQxZnzorOp3aXhjK1X2/6xuVZcdyxAUDzItP6G4nLbgPBEQLUi6aUjOjquFiihokXoKWaMPQjF/LqH+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.2.244", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.2.244.tgz", + "integrity": "sha512-gI6bntk+HDe2witOsQgBDyDDpRmF5dfxbygvVsEdCI+Ko9yj5S9aCsc8WhhbtdcEG1Fo3v/sM/F/9pGatCAwzQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.2.244", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.2.244.tgz", + "integrity": "sha512-hwJ5HrDj7asmVGjzaT6SFdhPVxVUIYm9LCuE3yu89+6C5aR9YrCXvpgIjGcHJvEO2PLAtff72FsX7sbXbzzYGQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.2.244", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.2.244.tgz", + "integrity": "sha512-P8d4AIVN63xaS3t5WhOo0Ejy/X7XaDxXe9sJpEbGQP7CGofhURvgXwe8Q6uhPeWC9AwEPu35ArFQ0ZUmOCY0rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.2.244", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.2.244.tgz", + "integrity": "sha512-PZUhgooqPDo+NUo+tIxWI1jKnYVV2ACs8eUkSE++Qf7E4/9Igy79XHbG4/G5ERlCudhdcw4XkYiRN8GJQg6P5w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "dependencies": { + "@swc/wasm": "1.2.130" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc/node_modules/@swc/wasm": { + "version": "1.2.130", + "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.2.130.tgz", + "integrity": "sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.2.244", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.2.244.tgz", + "integrity": "sha512-w7v8fND4E8wOHoVVNJIDjOh8EQiedI9HCsCTEDM/z/dVPsk/rxi6iHYnZG6gv+X/d0aCLeZQOkW9khfyy128cg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "dependencies": { + "@swc/wasm": "1.2.130" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc/node_modules/@swc/wasm": { + "version": "1.2.130", + "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.2.130.tgz", + "integrity": "sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.2.244", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.2.244.tgz", + "integrity": "sha512-/A9ssLtqXEQrdHnJ9SvZSBF7zQM/0ydz8B3p5BT9kUbAhmNqbfE4/Wy3d2zd7nrF16n6tRm4giCzcIdzd/7mvw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/wasm": { + "version": "1.2.122", + "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.2.122.tgz", + "integrity": "sha512-sM1VCWQxmNhFtdxME+8UXNyPNhxNu7zdb6ikWpz0YKAQQFRGT5ThZgJrubEpah335SUToNg8pkdDF7ibVCjxbQ==", + "dev": true, + "optional": true, + "peer": true + }, "node_modules/@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -4002,13 +4400,14 @@ } }, "node_modules/ajv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", - "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" }, "funding": { @@ -4041,6 +4440,26 @@ } } }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, "node_modules/ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", @@ -4093,9 +4512,9 @@ } }, "node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { "node": ">=8" } @@ -5169,9 +5588,9 @@ } }, "node_modules/cli-spinners": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.0.tgz", - "integrity": "sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", "dev": true, "engines": { "node": ">=6" @@ -5587,22 +6006,6 @@ "webpack": "^5.1.0" } }, - "node_modules/copy-webpack-plugin/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, "node_modules/copy-webpack-plugin/node_modules/glob-parent": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.1.tgz", @@ -5615,12 +6018,6 @@ "node": ">=10.13.0" } }, - "node_modules/copy-webpack-plugin/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, "node_modules/copy-webpack-plugin/node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -6053,28 +6450,6 @@ "webpack": "^4.27.0 || ^5.0.0" } }, - "node_modules/css-loader/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/css-loader/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, "node_modules/css-loader/node_modules/schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -6126,28 +6501,6 @@ } } }, - "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, "node_modules/css-minimizer-webpack-plugin/node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -6520,9 +6873,9 @@ } }, "node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, @@ -8062,9 +8415,9 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, "node_modules/handle-thing": { "version": "2.0.1", @@ -8092,31 +8445,9 @@ "har-schema": "^2.0.0" }, "engines": { - "node": ">=6" - } - }, - "node_modules/har-validator/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "node": ">=6" } }, - "node_modules/har-validator/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -9295,9 +9626,9 @@ "dev": true }, "node_modules/istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true, "engines": { "node": ">=8" @@ -9576,9 +9907,9 @@ "dev": true }, "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "node_modules/json-stringify-safe": { "version": "5.0.1", @@ -10470,28 +10801,6 @@ "webpack": "^4.4.0 || ^5.0.0" } }, - "node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -10528,9 +10837,9 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "node_modules/minipass": { "version": "2.9.0", @@ -14905,28 +15214,6 @@ "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/raw-loader/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/raw-loader/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, "node_modules/raw-loader/node_modules/schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -15554,28 +15841,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/schema-utils/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/schema-utils/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, "node_modules/schematics-utilities": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/schematics-utilities/-/schematics-utilities-2.0.3.tgz", @@ -15639,11 +15904,6 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, - "node_modules/schematics-utilities/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, "node_modules/schematics-utilities/node_modules/magic-string": { "version": "0.25.3", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.3.tgz", @@ -16615,28 +16875,6 @@ "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/style-loader/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/style-loader/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, "node_modules/style-loader/node_modules/schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -16934,28 +17172,6 @@ "webpack": "^5.1.0" } }, - "node_modules/terser-webpack-plugin/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, "node_modules/terser-webpack-plugin/node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -17537,9 +17753,9 @@ } }, "node_modules/url-parse": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", - "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" @@ -17757,28 +17973,6 @@ "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, "node_modules/webpack-dev-middleware/node_modules/schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -17852,22 +18046,6 @@ } } }, - "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, "node_modules/webpack-dev-server/node_modules/ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -18127,12 +18305,6 @@ "node": ">=0.10.0" } }, - "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, "node_modules/webpack-dev-server/node_modules/locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -18487,28 +18659,6 @@ "node": ">=0.4.0" } }, - "node_modules/webpack/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, "node_modules/webpack/node_modules/schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -18835,6 +18985,22 @@ "rxjs": "6.6.7", "source-map": "0.7.3" } + }, + "ajv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", + "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" } } }, @@ -19004,6 +19170,18 @@ "debug": "4" } }, + "ajv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", + "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, "cacache": { "version": "15.2.0", "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.2.0.tgz", @@ -19060,6 +19238,12 @@ "debug": "4" } }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, "minipass": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", @@ -19177,6 +19361,24 @@ "rxjs": "6.6.7", "source-map": "0.7.3" } + }, + "ajv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", + "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true } } }, @@ -19192,6 +19394,26 @@ "magic-string": "0.25.7", "rxjs": "6.6.7", "source-map": "0.7.3" + }, + "dependencies": { + "ajv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", + "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } } }, "@angular-devkit/schematics": { @@ -19231,11 +19453,6 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, "magic-string": { "version": "0.25.3", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.3.tgz", @@ -20008,9 +20225,9 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", + "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==", "dev": true }, "@babel/helper-remap-async-to-generator": { @@ -21000,6 +21217,11 @@ "fastq": "^1.6.0" } }, + "@novnc/novnc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@novnc/novnc/-/novnc-1.3.0.tgz", + "integrity": "sha512-tR87mY5ADtaELadmZfW937JO/p8fRdz3wkPoqwhqB/vY1XnTQeLSWwkp4yMlr4iIDY0iCficfzFYX5EHMh4MHw==" + }, "@npmcli/git": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz", @@ -21189,11 +21411,6 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, "magic-string": { "version": "0.25.3", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.3.tgz", @@ -21260,11 +21477,6 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, "magic-string": { "version": "0.25.3", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.3.tgz", @@ -21293,6 +21505,209 @@ } } }, + "@swc/core": { + "version": "1.2.244", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.2.244.tgz", + "integrity": "sha512-/UguNMvKgVeR8wGFb53h+Y9hFSiEpeUhC4Cr1neN15wvWZD3lfvN4qAdqNifZiiPKXrCwYy8NTKlHVtHMYzpXw==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@swc/core-android-arm-eabi": "1.2.244", + "@swc/core-android-arm64": "1.2.244", + "@swc/core-darwin-arm64": "1.2.244", + "@swc/core-darwin-x64": "1.2.244", + "@swc/core-freebsd-x64": "1.2.244", + "@swc/core-linux-arm-gnueabihf": "1.2.244", + "@swc/core-linux-arm64-gnu": "1.2.244", + "@swc/core-linux-arm64-musl": "1.2.244", + "@swc/core-linux-x64-gnu": "1.2.244", + "@swc/core-linux-x64-musl": "1.2.244", + "@swc/core-win32-arm64-msvc": "1.2.244", + "@swc/core-win32-ia32-msvc": "1.2.244", + "@swc/core-win32-x64-msvc": "1.2.244" + } + }, + "@swc/core-android-arm-eabi": { + "version": "1.2.244", + "resolved": "https://registry.npmjs.org/@swc/core-android-arm-eabi/-/core-android-arm-eabi-1.2.244.tgz", + "integrity": "sha512-bQN6SY78bFIm6lz46ss4+ZDU9owevVjF95Cm+3KB/13ZOPF+m5Pdm8WQLoBYTLgJ0r4/XukEe9XXjba/6Kf8kw==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@swc/wasm": "1.2.122" + } + }, + "@swc/core-android-arm64": { + "version": "1.2.244", + "resolved": "https://registry.npmjs.org/@swc/core-android-arm64/-/core-android-arm64-1.2.244.tgz", + "integrity": "sha512-CJeL/EeOIzrH+77otNT6wfGF8uadOHo4rEaBN/xvmtnpdADjYJ8Wt85X4nRK0G929bMke/QdJm5ilPNJdmgCTg==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@swc/wasm": "1.2.130" + }, + "dependencies": { + "@swc/wasm": { + "version": "1.2.130", + "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.2.130.tgz", + "integrity": "sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q==", + "dev": true, + "optional": true, + "peer": true + } + } + }, + "@swc/core-darwin-arm64": { + "version": "1.2.244", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.2.244.tgz", + "integrity": "sha512-ZhRK8L/lpPCerUxtrW48cRJtpsUG5xVTUXu3N0TrYuxRzzapHgK+61g1JdtcwdNvEV7l00X4vfCBRYO0S2nsmw==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-darwin-x64": { + "version": "1.2.244", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.2.244.tgz", + "integrity": "sha512-4mY8Gkq2ZMUpXYCLceGp7w0Jnxp75N1gQswNFhMBU4k90ElDuBtPoUSnB1v8MwlQtK7WA25MdvwFnBaEJnfxOg==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-freebsd-x64": { + "version": "1.2.244", + "resolved": "https://registry.npmjs.org/@swc/core-freebsd-x64/-/core-freebsd-x64-1.2.244.tgz", + "integrity": "sha512-k/NEZfkgtZ4S96woYArZ89jwJ/L1zyxihTgFFu7SxDt+WRE1EPmY42Gt4y874zi1JiSEFSRHiiueDUfRPu7C0Q==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@swc/wasm": "1.2.130" + }, + "dependencies": { + "@swc/wasm": { + "version": "1.2.130", + "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.2.130.tgz", + "integrity": "sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q==", + "dev": true, + "optional": true, + "peer": true + } + } + }, + "@swc/core-linux-arm-gnueabihf": { + "version": "1.2.244", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.2.244.tgz", + "integrity": "sha512-tE9b/oZWhMXwoXHkgHFckMrLrlczvG7HgQAdtDuA6g30Xd/3XmdVzC4NbXR+1HoaGVDh7cf0EFE3aKdfPvPQwA==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@swc/wasm": "1.2.130" + }, + "dependencies": { + "@swc/wasm": { + "version": "1.2.130", + "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.2.130.tgz", + "integrity": "sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q==", + "dev": true, + "optional": true, + "peer": true + } + } + }, + "@swc/core-linux-arm64-gnu": { + "version": "1.2.244", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.2.244.tgz", + "integrity": "sha512-zrpVKUeQxZnzorOp3aXhjK1X2/6xuVZcdyxAUDzItP6G4nLbgPBEQLUi6aUjOjquFiihokXoKWaMPQjF/LqH+g==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-linux-arm64-musl": { + "version": "1.2.244", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.2.244.tgz", + "integrity": "sha512-gI6bntk+HDe2witOsQgBDyDDpRmF5dfxbygvVsEdCI+Ko9yj5S9aCsc8WhhbtdcEG1Fo3v/sM/F/9pGatCAwzQ==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-linux-x64-gnu": { + "version": "1.2.244", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.2.244.tgz", + "integrity": "sha512-hwJ5HrDj7asmVGjzaT6SFdhPVxVUIYm9LCuE3yu89+6C5aR9YrCXvpgIjGcHJvEO2PLAtff72FsX7sbXbzzYGQ==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-linux-x64-musl": { + "version": "1.2.244", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.2.244.tgz", + "integrity": "sha512-P8d4AIVN63xaS3t5WhOo0Ejy/X7XaDxXe9sJpEbGQP7CGofhURvgXwe8Q6uhPeWC9AwEPu35ArFQ0ZUmOCY0rg==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-win32-arm64-msvc": { + "version": "1.2.244", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.2.244.tgz", + "integrity": "sha512-PZUhgooqPDo+NUo+tIxWI1jKnYVV2ACs8eUkSE++Qf7E4/9Igy79XHbG4/G5ERlCudhdcw4XkYiRN8GJQg6P5w==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@swc/wasm": "1.2.130" + }, + "dependencies": { + "@swc/wasm": { + "version": "1.2.130", + "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.2.130.tgz", + "integrity": "sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q==", + "dev": true, + "optional": true, + "peer": true + } + } + }, + "@swc/core-win32-ia32-msvc": { + "version": "1.2.244", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.2.244.tgz", + "integrity": "sha512-w7v8fND4E8wOHoVVNJIDjOh8EQiedI9HCsCTEDM/z/dVPsk/rxi6iHYnZG6gv+X/d0aCLeZQOkW9khfyy128cg==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@swc/wasm": "1.2.130" + }, + "dependencies": { + "@swc/wasm": { + "version": "1.2.130", + "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.2.130.tgz", + "integrity": "sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q==", + "dev": true, + "optional": true, + "peer": true + } + } + }, + "@swc/core-win32-x64-msvc": { + "version": "1.2.244", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.2.244.tgz", + "integrity": "sha512-/A9ssLtqXEQrdHnJ9SvZSBF7zQM/0ydz8B3p5BT9kUbAhmNqbfE4/Wy3d2zd7nrF16n6tRm4giCzcIdzd/7mvw==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/wasm": { + "version": "1.2.122", + "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.2.122.tgz", + "integrity": "sha512-sM1VCWQxmNhFtdxME+8UXNyPNhxNu7zdb6ikWpz0YKAQQFRGT5ThZgJrubEpah335SUToNg8pkdDF7ibVCjxbQ==", + "dev": true, + "optional": true, + "peer": true + }, "@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -21715,13 +22130,14 @@ } }, "ajv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", - "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "requires": { "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, @@ -21738,6 +22154,24 @@ "integrity": "sha512-USH2jBb+C/hIpwD2iRjp0pe0k+MvzG0mlSn/FIdCgQhUb9ALPRjt2KIQdfZDS9r0ZIeUAg7gOu9KL0PFqGqr5Q==", "requires": { "ajv": "^8.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + } } }, "ajv-keywords": { @@ -21775,9 +22209,9 @@ "dev": true }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "3.2.1", @@ -22642,9 +23076,9 @@ } }, "cli-spinners": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.0.tgz", - "integrity": "sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", "dev": true }, "cli-width": { @@ -22985,18 +23419,6 @@ "serialize-javascript": "^5.0.1" }, "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, "glob-parent": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.1.tgz", @@ -23006,12 +23428,6 @@ "is-glob": "^4.0.1" } }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -23340,24 +23756,6 @@ "semver": "^7.3.5" }, "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, "schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -23386,24 +23784,6 @@ "source-map": "^0.6.1" }, "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -23686,9 +24066,9 @@ "dev": true }, "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } @@ -24919,9 +25299,9 @@ } }, "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, "handle-thing": { "version": "2.0.1", @@ -24943,26 +25323,6 @@ "requires": { "ajv": "^6.12.3", "har-schema": "^2.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - } } }, "has": { @@ -25887,9 +26247,9 @@ "dev": true }, "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true }, "istanbul-lib-instrument": { @@ -26115,9 +26475,9 @@ "dev": true }, "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "json-stringify-safe": { "version": "5.0.1", @@ -26798,24 +27158,6 @@ "webpack-sources": "^1.1.0" }, "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, "schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -26844,9 +27186,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "minipass": { "version": "2.9.0", @@ -30133,24 +30475,6 @@ "schema-utils": "^3.0.0" }, "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, "schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -30617,26 +30941,6 @@ "@types/json-schema": "^7.0.5", "ajv": "^6.12.4", "ajv-keywords": "^3.5.2" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - } } }, "schematics-utilities": { @@ -30691,11 +30995,6 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, "magic-string": { "version": "0.25.3", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.3.tgz", @@ -31520,24 +31819,6 @@ "schema-utils": "^3.0.0" }, "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, "schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -31757,24 +32038,6 @@ "terser": "^5.7.0" }, "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -32211,9 +32474,9 @@ } }, "url-parse": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", - "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "requires": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" @@ -32363,24 +32626,6 @@ "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==", "dev": true }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, "schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -32424,24 +32669,6 @@ "schema-utils": "^3.0.0" }, "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, "schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -32496,18 +32723,6 @@ "yargs": "^13.3.2" }, "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -32723,12 +32938,6 @@ } } }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", diff --git a/package.json b/package.json index aa187538..06e765a5 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "@datorama/akita": "^6.2.1", "@datorama/akita-ng-router-store": "^6.0.2", "@microsoft/signalr": "^5.0.8", + "@novnc/novnc": "^1.3.0", "babel-polyfill": "^6.26.0", "core-js": "^3.15.2", "jquery": "^3.6.0", diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 4b2dbc7e..01b0eaa0 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -43,12 +43,15 @@ import { DialogService } from './services/dialog/dialog.service'; import { ErrorService } from './services/error/error.service'; import { NotificationService } from './services/notification/notification.service'; import { SystemMessageService } from './services/system-message/system-message.service'; -import { VmService } from './state/vm/vm.service'; +import { VsphereService } from './state/vsphere/vsphere.service'; import { ConsolePageComponent } from './components/console-page/console-page.component'; import { UserFollowPageComponent } from './components/user-follow-page/user-follow-page.component'; import { AkitaNgRouterStoreModule } from '@datorama/akita-ng-router-store'; import { environment } from '../environments/environment'; import { BASE_PATH } from './generated/vm-api'; +import { NovncComponent } from './components/novnc/novnc.component'; +import { ProxmoxConsoleComponent } from './components/proxmox/proxmox-console/proxmox-console.component'; +import { OptionsBar2Component } from './components/options-bar2/options-bar2.component'; export const settings: ComnSettingsConfig = { url: 'assets/config/settings.json', @@ -83,6 +86,9 @@ const materialModules = [ SystemMessageComponent, ConsolePageComponent, UserFollowPageComponent, + NovncComponent, + ProxmoxConsoleComponent, + OptionsBar2Component, ], imports: [ BrowserModule, @@ -100,7 +106,7 @@ const materialModules = [ AppRoutingModule, ], providers: [ - VmService, + VsphereService, SystemMessageService, DialogService, NotificationService, diff --git a/src/app/components/console-page/console-page.component.scss b/src/app/components/console-page/console-page.component.scss index a4deda34..4feb6746 100644 --- a/src/app/components/console-page/console-page.component.scss +++ b/src/app/components/console-page/console-page.component.scss @@ -1,4 +1,4 @@ /** * Copyright 2021 Carnegie Mellon University. All Rights Reserved. * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - */ + */ \ No newline at end of file diff --git a/src/app/components/console/console.component.html b/src/app/components/console/console.component.html index 441aed0c..87697595 100644 --- a/src/app/components/console/console.component.html +++ b/src/app/components/console/console.component.html @@ -3,11 +3,32 @@ Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. --> -
- - +
+ + + + + + + + + + + + +
diff --git a/src/app/components/console/console.component.scss b/src/app/components/console/console.component.scss index ff8cf4dd..5aaa8721 100644 --- a/src/app/components/console/console.component.scss +++ b/src/app/components/console/console.component.scss @@ -7,3 +7,8 @@ left: 0px; width: 100%; } + +.container { + height: 100%; + display: block +} diff --git a/src/app/components/console/console.component.ts b/src/app/components/console/console.component.ts index efbd03f3..9aa627f7 100644 --- a/src/app/components/console/console.component.ts +++ b/src/app/components/console/console.component.ts @@ -3,8 +3,9 @@ import { Component, Input } from '@angular/core'; import { Observable } from 'rxjs'; -import { VsphereVirtualMachine } from '../../generated/vm-api'; -import { VmQuery } from '../../state/vm/vm.query'; +import { Vm, VmType, VsphereVirtualMachine } from '../../generated/vm-api'; +import { VmService } from '../../state/vm/vm.service'; +import { VsphereQuery } from '../../state/vsphere/vsphere.query'; @Component({ selector: 'app-console', @@ -16,7 +17,12 @@ export class ConsoleComponent { @Input() set vmId(value: string) { this._vmId = value; - this.vm$ = this.vmQuery.selectEntity(value); + this.vsphereVm$ = this.vsphereQuery.selectEntity(value); + this.virtualMachine$ = this.vmService.get(value); + } + + public get vmType(): typeof VmType { + return VmType; } get vmId(): string { @@ -25,7 +31,11 @@ export class ConsoleComponent { _vmId: string; - vm$: Observable; + vsphereVm$: Observable; + virtualMachine$: Observable; - constructor(private vmQuery: VmQuery) {} + constructor( + private vsphereQuery: VsphereQuery, + private vmService: VmService + ) {} } diff --git a/src/app/components/novnc/novnc.component.html b/src/app/components/novnc/novnc.component.html new file mode 100644 index 00000000..c3688829 --- /dev/null +++ b/src/app/components/novnc/novnc.component.html @@ -0,0 +1,20 @@ + + + +
+
+ +
+
+ +
+

Connecting...

+
+
diff --git a/src/app/components/novnc/novnc.component.scss b/src/app/components/novnc/novnc.component.scss new file mode 100644 index 00000000..d1569b6a --- /dev/null +++ b/src/app/components/novnc/novnc.component.scss @@ -0,0 +1,16 @@ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ + +.center { + position: relative; + margin: auto; + top: 40%; + text-align: center; +} + +// novnc element has to have a fixed height when scaleViewport is set +.screen { + height: 97vh; +} \ No newline at end of file diff --git a/src/app/components/novnc/novnc.component.spec.ts b/src/app/components/novnc/novnc.component.spec.ts new file mode 100644 index 00000000..2e010770 --- /dev/null +++ b/src/app/components/novnc/novnc.component.spec.ts @@ -0,0 +1,30 @@ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ + +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { NovncComponent } from './novnc.component'; + +describe('NovncComponent', () => { + let component: NovncComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ NovncComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(NovncComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/novnc/novnc.component.ts b/src/app/components/novnc/novnc.component.ts new file mode 100644 index 00000000..965d4ab8 --- /dev/null +++ b/src/app/components/novnc/novnc.component.ts @@ -0,0 +1,99 @@ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ + +import { + AfterViewInit, + Component, + ElementRef, + EventEmitter, + Input, + OnChanges, + Output, + SimpleChanges, + ViewChild, +} from '@angular/core'; +import { BehaviorSubject } from 'rxjs'; +import { NoVNCService } from '../../services/novnc/novnc.service'; + +@Component({ + selector: 'app-novnc', + templateUrl: './novnc.component.html', + styleUrls: ['./novnc.component.scss'], +}) +export class NovncComponent implements OnChanges, AfterViewInit { + @Input() ticket: string; + @Input() url: string; + @Input() readOnly = false; + + @Output() reconnect = new EventEmitter(); + + private isConnectedSubject = new BehaviorSubject(false); + public isConnected$ = this.isConnectedSubject.asObservable(); + private set isConnected(val: boolean) { + this.isConnectedSubject.next(val); + } + + private failedConnectionAttempts = 0; + private backgroundColor: string; + + @ViewChild('screen') screen: ElementRef; + + constructor(private novncService: NoVNCService) {} + + ngAfterViewInit() { + this.backgroundColor = getComputedStyle( + this.screen.nativeElement + ).backgroundColor; + } + + ngOnChanges(changes: SimpleChanges): void { + if (this.url && this.ticket && (changes['url'] || changes['ticket'])) { + this.startClient(this.url, this.ticket); + } + + if (changes['readOnly']) { + this.novncService.setViewOnly(this.readOnly); + } + } + + startClient(url: string, ticket: string) { + this.novncService.startClient( + url, + ticket, + 'screen', + this.readOnly, + this.backgroundColor + ); + + this.novncService.setConnectListener(this.connected.bind(this)); + this.novncService.setDisconnectListener(this.disconnected.bind(this)); + this.novncService.setSecurityFailureListener( + this.securityFailure.bind(this) + ); + } + + connected(e) { + this.isConnected = true; + this.failedConnectionAttempts = 0; + } + + // This function is called when we are disconnected + disconnected(e) { + this.isConnected = false; + this.failedConnectionAttempts++; + this.reconnect.emit(this.failedConnectionAttempts); + + if (e.detail.clean) { + console.log('Disconnected'); + } else { + console.log('Something went wrong, connection is closed'); + console.log(e); + } + } + + securityFailure(e) { + console.log(e); + } +} diff --git a/src/app/components/options-bar/options-bar.component.ts b/src/app/components/options-bar/options-bar.component.ts index 41969072..a40465cb 100644 --- a/src/app/components/options-bar/options-bar.component.ts +++ b/src/app/components/options-bar/options-bar.component.ts @@ -25,7 +25,7 @@ import { } from '../../models/vm/vm-model'; import { DialogService } from '../../services/dialog/dialog.service'; import { NotificationService } from '../../services/notification/notification.service'; -import { VmService } from '../../state/vm/vm.service'; +import { VsphereService } from '../../state/vsphere/vsphere.service'; declare var WMKS: any; // needed to check values const MAX_COPY_RETRIES = 1; @@ -71,7 +71,7 @@ export class OptionsBarComponent implements OnInit, OnDestroy { private destroy$ = new Subject(); constructor( - public vmService: VmService, + public vmService: VsphereService, public settingsService: ComnSettingsService, private dialogService: DialogService, private notificationService: NotificationService, diff --git a/src/app/components/options-bar2/options-bar2.component.html b/src/app/components/options-bar2/options-bar2.component.html new file mode 100644 index 00000000..96b9ee7a --- /dev/null +++ b/src/app/components/options-bar2/options-bar2.component.html @@ -0,0 +1,20 @@ + + +
+
+ + + + + + + + + +
+
diff --git a/src/app/components/options-bar2/options-bar2.component.scss b/src/app/components/options-bar2/options-bar2.component.scss new file mode 100644 index 00000000..80e63dbd --- /dev/null +++ b/src/app/components/options-bar2/options-bar2.component.scss @@ -0,0 +1,43 @@ +// Copyright 2021 Carnegie Mellon University. All Rights Reserved. +// Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. + +a:visited { + color: black; +} + +.mat-expansion-panel-header { + display: flex; + flex-direction: column; +} + +.vm-name { + font-size: small; + margin-left: 10px; +} + +.left { + float: left; + padding-bottom: 8px; +} + +.mat-icon-button.mat-small { + line-height: 16px; + height: 16px; + width: 16px; + margin-top: 2px; + margin-left: 10px; + display: inline-block; + z-index: 1; +} + +.mat-icon { + height: 18px; + width: 18px; +} + +.mat-top-button { + font-size: x-small; + height: 21px; + line-height: 0px; + margin-left: 20px; +} diff --git a/src/app/components/options-bar2/options-bar2.component.spec.ts b/src/app/components/options-bar2/options-bar2.component.spec.ts new file mode 100644 index 00000000..4d4e8d26 --- /dev/null +++ b/src/app/components/options-bar2/options-bar2.component.spec.ts @@ -0,0 +1,30 @@ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ + +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { OptionsBar2Component } from './options-bar2.component'; + +describe('OptionsBar2Component', () => { + let component: OptionsBar2Component; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ OptionsBar2Component ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(OptionsBar2Component); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/options-bar2/options-bar2.component.ts b/src/app/components/options-bar2/options-bar2.component.ts new file mode 100644 index 00000000..cc095e94 --- /dev/null +++ b/src/app/components/options-bar2/options-bar2.component.ts @@ -0,0 +1,42 @@ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ + +import { + Component, + OnInit, + ChangeDetectionStrategy, + Input, +} from '@angular/core'; +import { Vm, VmType } from '../../generated/vm-api'; +import { VmService } from '../../state/vm/vm.service'; + +@Component({ + selector: 'app-options-bar2', + templateUrl: './options-bar2.component.html', + styleUrls: ['./options-bar2.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class OptionsBar2Component implements OnInit { + // Generic Options Bar - Will eventually replace OptionsBarComponent + + @Input() vm: Vm; + @Input() readOnly = false; + + public get clipboardEnabled(): boolean { + if (this.vm) { + return !this.readOnly && this.vm.type == VmType.Vsphere; + } else { + return false; + } + } + + constructor(private vmService: VmService) {} + + ngOnInit(): void {} + + public ctrlAltDel() { + this.vmService.sendCtrlAltDel(this.vm.id); + } +} diff --git a/src/app/components/proxmox/proxmox-console/proxmox-console.component.html b/src/app/components/proxmox/proxmox-console/proxmox-console.component.html new file mode 100644 index 00000000..739c3919 --- /dev/null +++ b/src/app/components/proxmox/proxmox-console/proxmox-console.component.html @@ -0,0 +1,12 @@ + + + + + diff --git a/src/app/components/proxmox/proxmox-console/proxmox-console.component.scss b/src/app/components/proxmox/proxmox-console/proxmox-console.component.scss new file mode 100644 index 00000000..2a591a0f --- /dev/null +++ b/src/app/components/proxmox/proxmox-console/proxmox-console.component.scss @@ -0,0 +1,5 @@ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ + diff --git a/src/app/components/proxmox/proxmox-console/proxmox-console.component.spec.ts b/src/app/components/proxmox/proxmox-console/proxmox-console.component.spec.ts new file mode 100644 index 00000000..bb51e580 --- /dev/null +++ b/src/app/components/proxmox/proxmox-console/proxmox-console.component.spec.ts @@ -0,0 +1,30 @@ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ + +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ProxmoxConsoleComponent } from './proxmox-console.component'; + +describe('ProxmoxConsoleComponent', () => { + let component: ProxmoxConsoleComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ ProxmoxConsoleComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(ProxmoxConsoleComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/proxmox/proxmox-console/proxmox-console.component.ts b/src/app/components/proxmox/proxmox-console/proxmox-console.component.ts new file mode 100644 index 00000000..4f08522b --- /dev/null +++ b/src/app/components/proxmox/proxmox-console/proxmox-console.component.ts @@ -0,0 +1,50 @@ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ + +import { Component, ChangeDetectionStrategy, Input } from '@angular/core'; +import { Observable } from 'rxjs'; +import { delay } from 'rxjs/operators'; +import { ProxmoxConsole, ProxmoxService, Vm } from '../../../generated/vm-api'; + +@Component({ + selector: 'app-proxmox-console', + templateUrl: './proxmox-console.component.html', + styleUrls: ['./proxmox-console.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class ProxmoxConsoleComponent { + @Input() readOnly = false; + + @Input() set vm(value: Vm) { + this._vm = value; + this.getConsole(); + } + + private _vm: Vm; + + proxmoxConsole$: Observable; + + constructor(private proxmoxService: ProxmoxService) {} + + getConsole(attempts: number = 0) { + if (this._vm != null) { + this.proxmoxConsole$ = this.proxmoxService + .getProxmoxConsole(this._vm.id) + .pipe(delay(this.getDelay(attempts))); + } + } + + private getDelay(attempts: number): number { + const maxSeconds = 10; + + let nextRetrySeconds = Math.pow(2, attempts + 1); + + if (nextRetrySeconds > maxSeconds) { + nextRetrySeconds = maxSeconds; + } + + return nextRetrySeconds * 1000; + } +} diff --git a/src/app/components/user-follow-page/user-follow-page.component.ts b/src/app/components/user-follow-page/user-follow-page.component.ts index 262f53f0..b9912948 100644 --- a/src/app/components/user-follow-page/user-follow-page.component.ts +++ b/src/app/components/user-follow-page/user-follow-page.component.ts @@ -15,7 +15,7 @@ import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { SignalRService } from '../../services/signalr/signalr.service'; import { UserQuery } from '../../state/user/user.query'; -import { VmQuery } from '../../state/vm/vm.query'; +import { VsphereQuery } from '../../state/vsphere/vsphere.query'; @Component({ selector: 'app-user-follow-page', @@ -32,7 +32,7 @@ export class UserFollowPageComponent implements OnInit, OnDestroy { constructor( private routerQuery: RouterQuery, private signalrRService: SignalRService, - private vmQuery: VmQuery, + private vmQuery: VsphereQuery, private userQuery: UserQuery, private titleService: Title ) { diff --git a/src/app/components/wmks/wmks.component.scss b/src/app/components/wmks/wmks.component.scss index b8310816..fd22d6d3 100644 --- a/src/app/components/wmks/wmks.component.scss +++ b/src/app/components/wmks/wmks.component.scss @@ -8,7 +8,6 @@ left: 0px; right: 0px; width: 100%; - z-index: -1; } .wmksContainer { diff --git a/src/app/components/wmks/wmks.component.ts b/src/app/components/wmks/wmks.component.ts index e7ddab9c..aa4856a7 100644 --- a/src/app/components/wmks/wmks.component.ts +++ b/src/app/components/wmks/wmks.component.ts @@ -11,7 +11,7 @@ import { import { interval, Subscription } from 'rxjs'; import { startWith, takeWhile } from 'rxjs/operators'; import { VmResolution } from '../../models/vm/vm-model'; -import { VmService } from '../../state/vm/vm.service'; +import { VsphereService } from '../../state/vsphere/vsphere.service'; declare var WMKS: any; // needed to check values @@ -41,7 +41,7 @@ export class WmksComponent { public isDone = false; public showWmks = true; - constructor(public vmService: VmService) {} + constructor(public vmService: VsphereService) {} private setVmId(value: string) { if (this.connectTimerSubscription != null) { diff --git a/src/app/generated/vm-api/.gitignore b/src/app/generated/vm-api/.gitignore index 974dd2b6..149b5765 100644 --- a/src/app/generated/vm-api/.gitignore +++ b/src/app/generated/vm-api/.gitignore @@ -1,6 +1,3 @@ -// Copyright 2021 Carnegie Mellon University. All Rights Reserved. -// Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - wwwroot/*.js node_modules typings diff --git a/src/app/generated/vm-api/.openapi-generator/VERSION b/src/app/generated/vm-api/.openapi-generator/VERSION index f7a1f59f..ecedc98d 100644 --- a/src/app/generated/vm-api/.openapi-generator/VERSION +++ b/src/app/generated/vm-api/.openapi-generator/VERSION @@ -1,4 +1 @@ -// Copyright 2021 Carnegie Mellon University. All Rights Reserved. -// Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - 4.3.1 \ No newline at end of file diff --git a/src/app/generated/vm-api/README.md b/src/app/generated/vm-api/README.md index 76609934..e0c9192e 100644 --- a/src/app/generated/vm-api/README.md +++ b/src/app/generated/vm-api/README.md @@ -1,8 +1,3 @@ - - ## @ ### Building diff --git a/src/app/generated/vm-api/api.module.ts b/src/app/generated/vm-api/api.module.ts index 41707919..7bb69ad3 100644 --- a/src/app/generated/vm-api/api.module.ts +++ b/src/app/generated/vm-api/api.module.ts @@ -1,14 +1,18 @@ -/** - * Copyright 2021 Carnegie Mellon University. All Rights Reserved. - * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - */ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ import { NgModule, ModuleWithProviders, SkipSelf, Optional } from '@angular/core'; import { Configuration } from './configuration'; import { HttpClient } from '@angular/common/http'; +import { CallbacksService } from './api/callbacks.service'; import { FileService } from './api/file.service'; +import { HealthService } from './api/health.service'; +import { ProxmoxService } from './api/proxmox.service'; +import { VmUsageLoggingSessionService } from './api/vmUsageLoggingSession.service'; import { VmsService } from './api/vms.service'; import { VsphereService } from './api/vsphere.service'; diff --git a/src/app/generated/vm-api/api/api.ts b/src/app/generated/vm-api/api/api.ts index e33bf92b..520c2774 100644 --- a/src/app/generated/vm-api/api/api.ts +++ b/src/app/generated/vm-api/api/api.ts @@ -1,12 +1,20 @@ -/** - * Copyright 2021 Carnegie Mellon University. All Rights Reserved. - * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - */ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ +export * from './callbacks.service'; +import { CallbacksService } from './callbacks.service'; export * from './file.service'; import { FileService } from './file.service'; +export * from './health.service'; +import { HealthService } from './health.service'; +export * from './proxmox.service'; +import { ProxmoxService } from './proxmox.service'; +export * from './vmUsageLoggingSession.service'; +import { VmUsageLoggingSessionService } from './vmUsageLoggingSession.service'; export * from './vms.service'; import { VmsService } from './vms.service'; export * from './vsphere.service'; import { VsphereService } from './vsphere.service'; -export const APIS = [FileService, VmsService, VsphereService]; +export const APIS = [CallbacksService, FileService, HealthService, ProxmoxService, VmUsageLoggingSessionService, VmsService, VsphereService]; diff --git a/src/app/generated/vm-api/api/callbacks.service.ts b/src/app/generated/vm-api/api/callbacks.service.ts new file mode 100644 index 00000000..956d5ae4 --- /dev/null +++ b/src/app/generated/vm-api/api/callbacks.service.ts @@ -0,0 +1,156 @@ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ + +/** + * Player VM API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: v1 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +/* tslint:disable:no-unused-variable member-ordering */ + +import { Inject, Injectable, Optional } from '@angular/core'; +import { HttpClient, HttpHeaders, HttpParams, + HttpResponse, HttpEvent, HttpParameterCodec } from '@angular/common/http'; +import { CustomHttpParameterCodec } from '../encoder'; +import { Observable } from 'rxjs'; + +import { ProblemDetails } from '../model/models'; +import { WebhookEvent } from '../model/models'; + +import { BASE_PATH, COLLECTION_FORMATS } from '../variables'; +import { Configuration } from '../configuration'; + + + +@Injectable({ + providedIn: 'root' +}) +export class CallbacksService { + + protected basePath = 'http://localhost'; + public defaultHeaders = new HttpHeaders(); + public configuration = new Configuration(); + public encoder: HttpParameterCodec; + + constructor(protected httpClient: HttpClient, @Optional()@Inject(BASE_PATH) basePath: string, @Optional() configuration: Configuration) { + if (configuration) { + this.configuration = configuration; + } + if (typeof this.configuration.basePath !== 'string') { + if (typeof basePath !== 'string') { + basePath = this.basePath; + } + this.configuration.basePath = basePath; + } + this.encoder = this.configuration.encoder || new CustomHttpParameterCodec(); + } + + + + private addToHttpParams(httpParams: HttpParams, value: any, key?: string): HttpParams { + if (typeof value === "object" && value instanceof Date === false) { + httpParams = this.addToHttpParamsRecursive(httpParams, value); + } else { + httpParams = this.addToHttpParamsRecursive(httpParams, value, key); + } + return httpParams; + } + + private addToHttpParamsRecursive(httpParams: HttpParams, value?: any, key?: string): HttpParams { + if (value == null) { + return httpParams; + } + + if (typeof value === "object") { + if (Array.isArray(value)) { + (value as any[]).forEach( elem => httpParams = this.addToHttpParamsRecursive(httpParams, elem, key)); + } else if (value instanceof Date) { + if (key != null) { + httpParams = httpParams.append(key, + (value as Date).toISOString().substr(0, 10)); + } else { + throw Error("key may not be null if value is Date"); + } + } else { + Object.keys(value).forEach( k => httpParams = this.addToHttpParamsRecursive( + httpParams, value[k], key != null ? `${key}.${k}` : k)); + } + } else if (key != null) { + httpParams = httpParams.append(key, value); + } else { + throw Error("key may not be null if value is not object or array"); + } + return httpParams; + } + + /** + * Receive a webhook event + * @param webhookEvent + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public handleCallback(webhookEvent?: WebhookEvent, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json'}): Observable; + public handleCallback(webhookEvent?: WebhookEvent, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json'}): Observable>; + public handleCallback(webhookEvent?: WebhookEvent, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json'}): Observable>; + public handleCallback(webhookEvent?: WebhookEvent, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json'}): Observable { + + let headers = this.defaultHeaders; + + // authentication (oauth2) required + if (this.configuration.accessToken) { + const accessToken = typeof this.configuration.accessToken === 'function' + ? this.configuration.accessToken() + : this.configuration.accessToken; + headers = headers.set('Authorization', 'Bearer ' + accessToken); + } + + let httpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (httpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (httpHeaderAcceptSelected !== undefined) { + headers = headers.set('Accept', httpHeaderAcceptSelected); + } + + + // to determine the Content-Type header + const consumes: string[] = [ + 'application/json', + 'text/json', + 'application/_*+json' + ]; + const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes); + if (httpContentTypeSelected !== undefined) { + headers = headers.set('Content-Type', httpContentTypeSelected); + } + + let responseType: 'text' | 'json' = 'json'; + if(httpHeaderAcceptSelected && httpHeaderAcceptSelected.startsWith('text')) { + responseType = 'text'; + } + + return this.httpClient.post(`${this.configuration.basePath}/api/callback`, + webhookEvent, + { + responseType: responseType, + withCredentials: this.configuration.withCredentials, + headers: headers, + observe: observe, + reportProgress: reportProgress + } + ); + } + +} diff --git a/src/app/generated/vm-api/api/file.service.ts b/src/app/generated/vm-api/api/file.service.ts index 75355417..be616254 100644 --- a/src/app/generated/vm-api/api/file.service.ts +++ b/src/app/generated/vm-api/api/file.service.ts @@ -1,7 +1,7 @@ -/** - * Copyright 2021 Carnegie Mellon University. All Rights Reserved. - * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - */ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ /** * Player VM API diff --git a/src/app/generated/vm-api/api/health.service.ts b/src/app/generated/vm-api/api/health.service.ts new file mode 100644 index 00000000..060b85d5 --- /dev/null +++ b/src/app/generated/vm-api/api/health.service.ts @@ -0,0 +1,198 @@ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ + +/** + * Player VM API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: v1 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +/* tslint:disable:no-unused-variable member-ordering */ + +import { Inject, Injectable, Optional } from '@angular/core'; +import { HttpClient, HttpHeaders, HttpParams, + HttpResponse, HttpEvent, HttpParameterCodec } from '@angular/common/http'; +import { CustomHttpParameterCodec } from '../encoder'; +import { Observable } from 'rxjs'; + +import { HealthStatus } from '../model/models'; +import { ProblemDetails } from '../model/models'; + +import { BASE_PATH, COLLECTION_FORMATS } from '../variables'; +import { Configuration } from '../configuration'; + + + +@Injectable({ + providedIn: 'root' +}) +export class HealthService { + + protected basePath = 'http://localhost'; + public defaultHeaders = new HttpHeaders(); + public configuration = new Configuration(); + public encoder: HttpParameterCodec; + + constructor(protected httpClient: HttpClient, @Optional()@Inject(BASE_PATH) basePath: string, @Optional() configuration: Configuration) { + if (configuration) { + this.configuration = configuration; + } + if (typeof this.configuration.basePath !== 'string') { + if (typeof basePath !== 'string') { + basePath = this.basePath; + } + this.configuration.basePath = basePath; + } + this.encoder = this.configuration.encoder || new CustomHttpParameterCodec(); + } + + + + private addToHttpParams(httpParams: HttpParams, value: any, key?: string): HttpParams { + if (typeof value === "object" && value instanceof Date === false) { + httpParams = this.addToHttpParamsRecursive(httpParams, value); + } else { + httpParams = this.addToHttpParamsRecursive(httpParams, value, key); + } + return httpParams; + } + + private addToHttpParamsRecursive(httpParams: HttpParams, value?: any, key?: string): HttpParams { + if (value == null) { + return httpParams; + } + + if (typeof value === "object") { + if (Array.isArray(value)) { + (value as any[]).forEach( elem => httpParams = this.addToHttpParamsRecursive(httpParams, elem, key)); + } else if (value instanceof Date) { + if (key != null) { + httpParams = httpParams.append(key, + (value as Date).toISOString().substr(0, 10)); + } else { + throw Error("key may not be null if value is Date"); + } + } else { + Object.keys(value).forEach( k => httpParams = this.addToHttpParamsRecursive( + httpParams, value[k], key != null ? `${key}.${k}` : k)); + } + } else if (key != null) { + httpParams = httpParams.append(key, value); + } else { + throw Error("key may not be null if value is not object or array"); + } + return httpParams; + } + + /** + * Checks the liveliness health endpoint + * Returns a HealthStatus of the liveliness health check + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public healthGetLiveliness(observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable; + public healthGetLiveliness(observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable>; + public healthGetLiveliness(observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable>; + public healthGetLiveliness(observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable { + + let headers = this.defaultHeaders; + + // authentication (oauth2) required + if (this.configuration.accessToken) { + const accessToken = typeof this.configuration.accessToken === 'function' + ? this.configuration.accessToken() + : this.configuration.accessToken; + headers = headers.set('Authorization', 'Bearer ' + accessToken); + } + + let httpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (httpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'text/plain', + 'application/json', + 'text/json' + ]; + httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (httpHeaderAcceptSelected !== undefined) { + headers = headers.set('Accept', httpHeaderAcceptSelected); + } + + + let responseType: 'text' | 'json' = 'json'; + if(httpHeaderAcceptSelected && httpHeaderAcceptSelected.startsWith('text')) { + responseType = 'text'; + } + + return this.httpClient.get(`${this.configuration.basePath}/api/health/live`, + { + responseType: responseType, + withCredentials: this.configuration.withCredentials, + headers: headers, + observe: observe, + reportProgress: reportProgress + } + ); + } + + /** + * Checks the readiness health endpoint + * Returns a HealthStatus of the readiness health check + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public healthGetReadiness(observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable; + public healthGetReadiness(observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable>; + public healthGetReadiness(observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable>; + public healthGetReadiness(observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable { + + let headers = this.defaultHeaders; + + // authentication (oauth2) required + if (this.configuration.accessToken) { + const accessToken = typeof this.configuration.accessToken === 'function' + ? this.configuration.accessToken() + : this.configuration.accessToken; + headers = headers.set('Authorization', 'Bearer ' + accessToken); + } + + let httpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (httpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'text/plain', + 'application/json', + 'text/json' + ]; + httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (httpHeaderAcceptSelected !== undefined) { + headers = headers.set('Accept', httpHeaderAcceptSelected); + } + + + let responseType: 'text' | 'json' = 'json'; + if(httpHeaderAcceptSelected && httpHeaderAcceptSelected.startsWith('text')) { + responseType = 'text'; + } + + return this.httpClient.get(`${this.configuration.basePath}/api/health/ready`, + { + responseType: responseType, + withCredentials: this.configuration.withCredentials, + headers: headers, + observe: observe, + reportProgress: reportProgress + } + ); + } + +} diff --git a/src/app/generated/vm-api/api/proxmox.service.ts b/src/app/generated/vm-api/api/proxmox.service.ts new file mode 100644 index 00000000..a10b142e --- /dev/null +++ b/src/app/generated/vm-api/api/proxmox.service.ts @@ -0,0 +1,149 @@ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ + +/** + * Player VM API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: v1 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +/* tslint:disable:no-unused-variable member-ordering */ + +import { Inject, Injectable, Optional } from '@angular/core'; +import { HttpClient, HttpHeaders, HttpParams, + HttpResponse, HttpEvent, HttpParameterCodec } from '@angular/common/http'; +import { CustomHttpParameterCodec } from '../encoder'; +import { Observable } from 'rxjs'; + +import { ProblemDetails } from '../model/models'; +import { ProxmoxConsole } from '../model/models'; + +import { BASE_PATH, COLLECTION_FORMATS } from '../variables'; +import { Configuration } from '../configuration'; + + + +@Injectable({ + providedIn: 'root' +}) +export class ProxmoxService { + + protected basePath = 'http://localhost'; + public defaultHeaders = new HttpHeaders(); + public configuration = new Configuration(); + public encoder: HttpParameterCodec; + + constructor(protected httpClient: HttpClient, @Optional()@Inject(BASE_PATH) basePath: string, @Optional() configuration: Configuration) { + if (configuration) { + this.configuration = configuration; + } + if (typeof this.configuration.basePath !== 'string') { + if (typeof basePath !== 'string') { + basePath = this.basePath; + } + this.configuration.basePath = basePath; + } + this.encoder = this.configuration.encoder || new CustomHttpParameterCodec(); + } + + + + private addToHttpParams(httpParams: HttpParams, value: any, key?: string): HttpParams { + if (typeof value === "object" && value instanceof Date === false) { + httpParams = this.addToHttpParamsRecursive(httpParams, value); + } else { + httpParams = this.addToHttpParamsRecursive(httpParams, value, key); + } + return httpParams; + } + + private addToHttpParamsRecursive(httpParams: HttpParams, value?: any, key?: string): HttpParams { + if (value == null) { + return httpParams; + } + + if (typeof value === "object") { + if (Array.isArray(value)) { + (value as any[]).forEach( elem => httpParams = this.addToHttpParamsRecursive(httpParams, elem, key)); + } else if (value instanceof Date) { + if (key != null) { + httpParams = httpParams.append(key, + (value as Date).toISOString().substr(0, 10)); + } else { + throw Error("key may not be null if value is Date"); + } + } else { + Object.keys(value).forEach( k => httpParams = this.addToHttpParamsRecursive( + httpParams, value[k], key != null ? `${key}.${k}` : k)); + } + } else if (key != null) { + httpParams = httpParams.append(key, value); + } else { + throw Error("key may not be null if value is not object or array"); + } + return httpParams; + } + + /** + * Retrieve the Url and Ticket for accessing a Proxmox virtual machine\'s NoVNC console + * @param id + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public getProxmoxConsole(id: string, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable; + public getProxmoxConsole(id: string, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable>; + public getProxmoxConsole(id: string, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable>; + public getProxmoxConsole(id: string, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable { + if (id === null || id === undefined) { + throw new Error('Required parameter id was null or undefined when calling getProxmoxConsole.'); + } + + let headers = this.defaultHeaders; + + // authentication (oauth2) required + if (this.configuration.accessToken) { + const accessToken = typeof this.configuration.accessToken === 'function' + ? this.configuration.accessToken() + : this.configuration.accessToken; + headers = headers.set('Authorization', 'Bearer ' + accessToken); + } + + let httpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (httpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'text/plain', + 'application/json', + 'text/json' + ]; + httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (httpHeaderAcceptSelected !== undefined) { + headers = headers.set('Accept', httpHeaderAcceptSelected); + } + + + let responseType: 'text' | 'json' = 'json'; + if(httpHeaderAcceptSelected && httpHeaderAcceptSelected.startsWith('text')) { + responseType = 'text'; + } + + return this.httpClient.get(`${this.configuration.basePath}/api/vms/proxmox/${encodeURIComponent(String(id))}/console`, + { + responseType: responseType, + withCredentials: this.configuration.withCredentials, + headers: headers, + observe: observe, + reportProgress: reportProgress + } + ); + } + +} diff --git a/src/app/generated/vm-api/api/vmUsageLoggingSession.service.ts b/src/app/generated/vm-api/api/vmUsageLoggingSession.service.ts new file mode 100644 index 00000000..843f9a28 --- /dev/null +++ b/src/app/generated/vm-api/api/vmUsageLoggingSession.service.ts @@ -0,0 +1,625 @@ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ + +/** + * Player VM API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: v1 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +/* tslint:disable:no-unused-variable member-ordering */ + +import { Inject, Injectable, Optional } from '@angular/core'; +import { HttpClient, HttpHeaders, HttpParams, + HttpResponse, HttpEvent, HttpParameterCodec } from '@angular/common/http'; +import { CustomHttpParameterCodec } from '../encoder'; +import { Observable } from 'rxjs'; + +import { CreateVmUsageLoggingSessionCommand } from '../model/models'; +import { EditVmUsageLoggingSessionCommand } from '../model/models'; +import { ProblemDetails } from '../model/models'; +import { VmUsageLoggingSession } from '../model/models'; +import { VmUsageReport } from '../model/models'; + +import { BASE_PATH, COLLECTION_FORMATS } from '../variables'; +import { Configuration } from '../configuration'; + + + +@Injectable({ + providedIn: 'root' +}) +export class VmUsageLoggingSessionService { + + protected basePath = 'http://localhost'; + public defaultHeaders = new HttpHeaders(); + public configuration = new Configuration(); + public encoder: HttpParameterCodec; + + constructor(protected httpClient: HttpClient, @Optional()@Inject(BASE_PATH) basePath: string, @Optional() configuration: Configuration) { + if (configuration) { + this.configuration = configuration; + } + if (typeof this.configuration.basePath !== 'string') { + if (typeof basePath !== 'string') { + basePath = this.basePath; + } + this.configuration.basePath = basePath; + } + this.encoder = this.configuration.encoder || new CustomHttpParameterCodec(); + } + + + + private addToHttpParams(httpParams: HttpParams, value: any, key?: string): HttpParams { + if (typeof value === "object" && value instanceof Date === false) { + httpParams = this.addToHttpParamsRecursive(httpParams, value); + } else { + httpParams = this.addToHttpParamsRecursive(httpParams, value, key); + } + return httpParams; + } + + private addToHttpParamsRecursive(httpParams: HttpParams, value?: any, key?: string): HttpParams { + if (value == null) { + return httpParams; + } + + if (typeof value === "object") { + if (Array.isArray(value)) { + (value as any[]).forEach( elem => httpParams = this.addToHttpParamsRecursive(httpParams, elem, key)); + } else if (value instanceof Date) { + if (key != null) { + httpParams = httpParams.append(key, + (value as Date).toISOString().substr(0, 10)); + } else { + throw Error("key may not be null if value is Date"); + } + } else { + Object.keys(value).forEach( k => httpParams = this.addToHttpParamsRecursive( + httpParams, value[k], key != null ? `${key}.${k}` : k)); + } + } else if (key != null) { + httpParams = httpParams.append(key, value); + } else { + throw Error("key may not be null if value is not object or array"); + } + return httpParams; + } + + /** + * Create a new VmUsageLoggingSession. + * @param createVmUsageLoggingSessionCommand + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public createSession(createVmUsageLoggingSessionCommand?: CreateVmUsageLoggingSessionCommand, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable; + public createSession(createVmUsageLoggingSessionCommand?: CreateVmUsageLoggingSessionCommand, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable>; + public createSession(createVmUsageLoggingSessionCommand?: CreateVmUsageLoggingSessionCommand, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable>; + public createSession(createVmUsageLoggingSessionCommand?: CreateVmUsageLoggingSessionCommand, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable { + + let headers = this.defaultHeaders; + + // authentication (oauth2) required + if (this.configuration.accessToken) { + const accessToken = typeof this.configuration.accessToken === 'function' + ? this.configuration.accessToken() + : this.configuration.accessToken; + headers = headers.set('Authorization', 'Bearer ' + accessToken); + } + + let httpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (httpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'text/plain', + 'application/json', + 'text/json' + ]; + httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (httpHeaderAcceptSelected !== undefined) { + headers = headers.set('Accept', httpHeaderAcceptSelected); + } + + + // to determine the Content-Type header + const consumes: string[] = [ + 'application/json', + 'text/json', + 'application/_*+json' + ]; + const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes); + if (httpContentTypeSelected !== undefined) { + headers = headers.set('Content-Type', httpContentTypeSelected); + } + + let responseType: 'text' | 'json' = 'json'; + if(httpHeaderAcceptSelected && httpHeaderAcceptSelected.startsWith('text')) { + responseType = 'text'; + } + + return this.httpClient.post(`${this.configuration.basePath}/api/vmusageloggingsessions`, + createVmUsageLoggingSessionCommand, + { + responseType: responseType, + withCredentials: this.configuration.withCredentials, + headers: headers, + observe: observe, + reportProgress: reportProgress + } + ); + } + + /** + * Delete a VmUsageLoggingSession. + * @param id ID of an VmUsageLoggingSessions. + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public deleteSession(id: string, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json'}): Observable; + public deleteSession(id: string, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json'}): Observable>; + public deleteSession(id: string, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json'}): Observable>; + public deleteSession(id: string, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json'}): Observable { + if (id === null || id === undefined) { + throw new Error('Required parameter id was null or undefined when calling deleteSession.'); + } + + let headers = this.defaultHeaders; + + // authentication (oauth2) required + if (this.configuration.accessToken) { + const accessToken = typeof this.configuration.accessToken === 'function' + ? this.configuration.accessToken() + : this.configuration.accessToken; + headers = headers.set('Authorization', 'Bearer ' + accessToken); + } + + let httpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (httpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (httpHeaderAcceptSelected !== undefined) { + headers = headers.set('Accept', httpHeaderAcceptSelected); + } + + + let responseType: 'text' | 'json' = 'json'; + if(httpHeaderAcceptSelected && httpHeaderAcceptSelected.startsWith('text')) { + responseType = 'text'; + } + + return this.httpClient.delete(`${this.configuration.basePath}/api/vmusageloggingsessions/${encodeURIComponent(String(id))}`, + { + responseType: responseType, + withCredentials: this.configuration.withCredentials, + headers: headers, + observe: observe, + reportProgress: reportProgress + } + ); + } + + /** + * Update a VmUsageLoggingSession. + * @param id ID of a VmUsageLoggingSession. + * @param editVmUsageLoggingSessionCommand + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public editSession(id: string, editVmUsageLoggingSessionCommand?: EditVmUsageLoggingSessionCommand, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable; + public editSession(id: string, editVmUsageLoggingSessionCommand?: EditVmUsageLoggingSessionCommand, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable>; + public editSession(id: string, editVmUsageLoggingSessionCommand?: EditVmUsageLoggingSessionCommand, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable>; + public editSession(id: string, editVmUsageLoggingSessionCommand?: EditVmUsageLoggingSessionCommand, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable { + if (id === null || id === undefined) { + throw new Error('Required parameter id was null or undefined when calling editSession.'); + } + + let headers = this.defaultHeaders; + + // authentication (oauth2) required + if (this.configuration.accessToken) { + const accessToken = typeof this.configuration.accessToken === 'function' + ? this.configuration.accessToken() + : this.configuration.accessToken; + headers = headers.set('Authorization', 'Bearer ' + accessToken); + } + + let httpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (httpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'text/plain', + 'application/json', + 'text/json' + ]; + httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (httpHeaderAcceptSelected !== undefined) { + headers = headers.set('Accept', httpHeaderAcceptSelected); + } + + + // to determine the Content-Type header + const consumes: string[] = [ + 'application/json', + 'text/json', + 'application/_*+json' + ]; + const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes); + if (httpContentTypeSelected !== undefined) { + headers = headers.set('Content-Type', httpContentTypeSelected); + } + + let responseType: 'text' | 'json' = 'json'; + if(httpHeaderAcceptSelected && httpHeaderAcceptSelected.startsWith('text')) { + responseType = 'text'; + } + + return this.httpClient.put(`${this.configuration.basePath}/api/vmusageloggingsessions/${encodeURIComponent(String(id))}`, + editVmUsageLoggingSessionCommand, + { + responseType: responseType, + withCredentials: this.configuration.withCredentials, + headers: headers, + observe: observe, + reportProgress: reportProgress + } + ); + } + + /** + * End a VmUsageLoggingSession. + * @param id ID of a VmUsageLoggingSession. + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public endSession(id: string, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable; + public endSession(id: string, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable>; + public endSession(id: string, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable>; + public endSession(id: string, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable { + if (id === null || id === undefined) { + throw new Error('Required parameter id was null or undefined when calling endSession.'); + } + + let headers = this.defaultHeaders; + + // authentication (oauth2) required + if (this.configuration.accessToken) { + const accessToken = typeof this.configuration.accessToken === 'function' + ? this.configuration.accessToken() + : this.configuration.accessToken; + headers = headers.set('Authorization', 'Bearer ' + accessToken); + } + + let httpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (httpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'text/plain', + 'application/json', + 'text/json' + ]; + httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (httpHeaderAcceptSelected !== undefined) { + headers = headers.set('Accept', httpHeaderAcceptSelected); + } + + + let responseType: 'text' | 'json' = 'json'; + if(httpHeaderAcceptSelected && httpHeaderAcceptSelected.startsWith('text')) { + responseType = 'text'; + } + + return this.httpClient.post(`${this.configuration.basePath}/api/vmusageloggingsessions/${encodeURIComponent(String(id))}/endsession`, + null, + { + responseType: responseType, + withCredentials: this.configuration.withCredentials, + headers: headers, + observe: observe, + reportProgress: reportProgress + } + ); + } + + /** + * Get all VmUsageLoggingSessions. + * @param viewId + * @param onlyActive + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public getAllSessions(viewId?: string, onlyActive?: boolean, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable>; + public getAllSessions(viewId?: string, onlyActive?: boolean, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable>>; + public getAllSessions(viewId?: string, onlyActive?: boolean, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable>>; + public getAllSessions(viewId?: string, onlyActive?: boolean, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable { + + let queryParameters = new HttpParams({encoder: this.encoder}); + if (viewId !== undefined && viewId !== null) { + queryParameters = this.addToHttpParams(queryParameters, + viewId, 'viewId'); + } + if (onlyActive !== undefined && onlyActive !== null) { + queryParameters = this.addToHttpParams(queryParameters, + onlyActive, 'onlyActive'); + } + + let headers = this.defaultHeaders; + + // authentication (oauth2) required + if (this.configuration.accessToken) { + const accessToken = typeof this.configuration.accessToken === 'function' + ? this.configuration.accessToken() + : this.configuration.accessToken; + headers = headers.set('Authorization', 'Bearer ' + accessToken); + } + + let httpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (httpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'text/plain', + 'application/json', + 'text/json' + ]; + httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (httpHeaderAcceptSelected !== undefined) { + headers = headers.set('Accept', httpHeaderAcceptSelected); + } + + + let responseType: 'text' | 'json' = 'json'; + if(httpHeaderAcceptSelected && httpHeaderAcceptSelected.startsWith('text')) { + responseType = 'text'; + } + + return this.httpClient.get>(`${this.configuration.basePath}/api/vmusageloggingsessions`, + { + params: queryParameters, + responseType: responseType, + withCredentials: this.configuration.withCredentials, + headers: headers, + observe: observe, + reportProgress: reportProgress + } + ); + } + + /** + * Get a bool value to determine if VM Usage Logging is available. + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public getIsLoggingEnabled(observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable; + public getIsLoggingEnabled(observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable>; + public getIsLoggingEnabled(observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable>; + public getIsLoggingEnabled(observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable { + + let headers = this.defaultHeaders; + + // authentication (oauth2) required + if (this.configuration.accessToken) { + const accessToken = typeof this.configuration.accessToken === 'function' + ? this.configuration.accessToken() + : this.configuration.accessToken; + headers = headers.set('Authorization', 'Bearer ' + accessToken); + } + + let httpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (httpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'text/plain', + 'application/json', + 'text/json' + ]; + httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (httpHeaderAcceptSelected !== undefined) { + headers = headers.set('Accept', httpHeaderAcceptSelected); + } + + + let responseType: 'text' | 'json' = 'json'; + if(httpHeaderAcceptSelected && httpHeaderAcceptSelected.startsWith('text')) { + responseType = 'text'; + } + + return this.httpClient.get(`${this.configuration.basePath}/api/vmusageloggingsessions/isloggingenabled`, + { + responseType: responseType, + withCredentials: this.configuration.withCredentials, + headers: headers, + observe: observe, + reportProgress: reportProgress + } + ); + } + + /** + * Get a single VmUsageLoggingSession. + * @param id ID of a session. + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public getSession(id: string, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable; + public getSession(id: string, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable>; + public getSession(id: string, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable>; + public getSession(id: string, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable { + if (id === null || id === undefined) { + throw new Error('Required parameter id was null or undefined when calling getSession.'); + } + + let headers = this.defaultHeaders; + + // authentication (oauth2) required + if (this.configuration.accessToken) { + const accessToken = typeof this.configuration.accessToken === 'function' + ? this.configuration.accessToken() + : this.configuration.accessToken; + headers = headers.set('Authorization', 'Bearer ' + accessToken); + } + + let httpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (httpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'text/plain', + 'application/json', + 'text/json' + ]; + httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (httpHeaderAcceptSelected !== undefined) { + headers = headers.set('Accept', httpHeaderAcceptSelected); + } + + + let responseType: 'text' | 'json' = 'json'; + if(httpHeaderAcceptSelected && httpHeaderAcceptSelected.startsWith('text')) { + responseType = 'text'; + } + + return this.httpClient.get(`${this.configuration.basePath}/api/vmusageloggingsessions/${encodeURIComponent(String(id))}`, + { + responseType: responseType, + withCredentials: this.configuration.withCredentials, + headers: headers, + observe: observe, + reportProgress: reportProgress + } + ); + } + + /** + * Get CSV file for all log entries in a VmUsageLoggingSession. + * @param id + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public getVmUsageCsvFile(id: string, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json'}): Observable; + public getVmUsageCsvFile(id: string, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json'}): Observable>; + public getVmUsageCsvFile(id: string, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json'}): Observable>; + public getVmUsageCsvFile(id: string, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json'}): Observable { + if (id === null || id === undefined) { + throw new Error('Required parameter id was null or undefined when calling getVmUsageCsvFile.'); + } + + let headers = this.defaultHeaders; + + // authentication (oauth2) required + if (this.configuration.accessToken) { + const accessToken = typeof this.configuration.accessToken === 'function' + ? this.configuration.accessToken() + : this.configuration.accessToken; + headers = headers.set('Authorization', 'Bearer ' + accessToken); + } + + let httpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (httpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (httpHeaderAcceptSelected !== undefined) { + headers = headers.set('Accept', httpHeaderAcceptSelected); + } + + + let responseType: 'text' | 'json' = 'json'; + if(httpHeaderAcceptSelected && httpHeaderAcceptSelected.startsWith('text')) { + responseType = 'text'; + } + + return this.httpClient.get(`${this.configuration.basePath}/api/vmusageloggingsessions/${encodeURIComponent(String(id))}/download`, + { + responseType: responseType, + withCredentials: this.configuration.withCredentials, + headers: headers, + observe: observe, + reportProgress: reportProgress + } + ); + } + + /** + * Get VM Usage Report for a timespan. + * @param reportStart The start date/time for the report. + * @param reportEnd IThe end date/time for the report. + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public getVmUsageReport(reportStart?: Date, reportEnd?: Date, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable>; + public getVmUsageReport(reportStart?: Date, reportEnd?: Date, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable>>; + public getVmUsageReport(reportStart?: Date, reportEnd?: Date, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable>>; + public getVmUsageReport(reportStart?: Date, reportEnd?: Date, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable { + + let queryParameters = new HttpParams({encoder: this.encoder}); + if (reportStart !== undefined && reportStart !== null) { + queryParameters = this.addToHttpParams(queryParameters, + reportStart, 'reportStart'); + } + if (reportEnd !== undefined && reportEnd !== null) { + queryParameters = this.addToHttpParams(queryParameters, + reportEnd, 'reportEnd'); + } + + let headers = this.defaultHeaders; + + // authentication (oauth2) required + if (this.configuration.accessToken) { + const accessToken = typeof this.configuration.accessToken === 'function' + ? this.configuration.accessToken() + : this.configuration.accessToken; + headers = headers.set('Authorization', 'Bearer ' + accessToken); + } + + let httpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (httpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'text/plain', + 'application/json', + 'text/json' + ]; + httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (httpHeaderAcceptSelected !== undefined) { + headers = headers.set('Accept', httpHeaderAcceptSelected); + } + + + let responseType: 'text' | 'json' = 'json'; + if(httpHeaderAcceptSelected && httpHeaderAcceptSelected.startsWith('text')) { + responseType = 'text'; + } + + return this.httpClient.get>(`${this.configuration.basePath}/api/vmusageloggingsessions/report`, + { + params: queryParameters, + responseType: responseType, + withCredentials: this.configuration.withCredentials, + headers: headers, + observe: observe, + reportProgress: reportProgress + } + ); + } + +} diff --git a/src/app/generated/vm-api/api/vms.service.ts b/src/app/generated/vm-api/api/vms.service.ts index f95f9b8e..78275bf8 100644 --- a/src/app/generated/vm-api/api/vms.service.ts +++ b/src/app/generated/vm-api/api/vms.service.ts @@ -1,7 +1,7 @@ -/** - * Copyright 2021 Carnegie Mellon University. All Rights Reserved. - * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - */ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ /** * Player VM API @@ -31,6 +31,7 @@ import { Vm } from '../model/models'; import { VmCreateForm } from '../model/models'; import { VmMap } from '../model/models'; import { VmMapCreateForm } from '../model/models'; +import { VmMapUpdateForm } from '../model/models'; import { VmUpdateForm } from '../model/models'; import { BASE_PATH, COLLECTION_FORMATS } from '../variables'; @@ -747,6 +748,57 @@ export class VmsService { ); } + /** + * Get a proxmox ticket + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public getProxmoxTicket(observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable; + public getProxmoxTicket(observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable>; + public getProxmoxTicket(observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable>; + public getProxmoxTicket(observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable { + + let headers = this.defaultHeaders; + + // authentication (oauth2) required + if (this.configuration.accessToken) { + const accessToken = typeof this.configuration.accessToken === 'function' + ? this.configuration.accessToken() + : this.configuration.accessToken; + headers = headers.set('Authorization', 'Bearer ' + accessToken); + } + + let httpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (httpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'text/plain', + 'application/json', + 'text/json' + ]; + httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (httpHeaderAcceptSelected !== undefined) { + headers = headers.set('Accept', httpHeaderAcceptSelected); + } + + + let responseType: 'text' | 'json' = 'json'; + if(httpHeaderAcceptSelected && httpHeaderAcceptSelected.startsWith('text')) { + responseType = 'text'; + } + + return this.httpClient.get(`${this.configuration.basePath}/api/vms/proxmox`, + { + responseType: responseType, + withCredentials: this.configuration.withCredentials, + headers: headers, + observe: observe, + reportProgress: reportProgress + } + ); + } + /** * Get a map for a specific team * @param teamId The guid of the team to consider @@ -1285,14 +1337,14 @@ export class VmsService { /** * Update a map * @param mapId The guid of the map to update - * @param vmMapCreateForm The data of the map to update + * @param vmMapUpdateForm The data of the map to update * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. * @param reportProgress flag to report request and response progress. */ - public updateMap(mapId: string, vmMapCreateForm?: VmMapCreateForm, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable; - public updateMap(mapId: string, vmMapCreateForm?: VmMapCreateForm, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable>; - public updateMap(mapId: string, vmMapCreateForm?: VmMapCreateForm, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable>; - public updateMap(mapId: string, vmMapCreateForm?: VmMapCreateForm, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable { + public updateMap(mapId: string, vmMapUpdateForm?: VmMapUpdateForm, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable; + public updateMap(mapId: string, vmMapUpdateForm?: VmMapUpdateForm, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable>; + public updateMap(mapId: string, vmMapUpdateForm?: VmMapUpdateForm, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable>; + public updateMap(mapId: string, vmMapUpdateForm?: VmMapUpdateForm, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'text/plain' | 'application/json' | 'text/json'}): Observable { if (mapId === null || mapId === undefined) { throw new Error('Required parameter mapId was null or undefined when calling updateMap.'); } @@ -1339,7 +1391,7 @@ export class VmsService { } return this.httpClient.put(`${this.configuration.basePath}/api/views/maps/${encodeURIComponent(String(mapId))}`, - vmMapCreateForm, + vmMapUpdateForm, { responseType: responseType, withCredentials: this.configuration.withCredentials, diff --git a/src/app/generated/vm-api/api/vsphere.service.ts b/src/app/generated/vm-api/api/vsphere.service.ts index b83bdef9..550a2d92 100644 --- a/src/app/generated/vm-api/api/vsphere.service.ts +++ b/src/app/generated/vm-api/api/vsphere.service.ts @@ -1,7 +1,7 @@ -/** - * Copyright 2021 Carnegie Mellon University. All Rights Reserved. - * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - */ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ /** * Player VM API diff --git a/src/app/generated/vm-api/configuration.ts b/src/app/generated/vm-api/configuration.ts index 41c59a37..bbbab38c 100644 --- a/src/app/generated/vm-api/configuration.ts +++ b/src/app/generated/vm-api/configuration.ts @@ -1,7 +1,7 @@ -/** - * Copyright 2021 Carnegie Mellon University. All Rights Reserved. - * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - */ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ import { HttpParameterCodec } from '@angular/common/http'; diff --git a/src/app/generated/vm-api/encoder.ts b/src/app/generated/vm-api/encoder.ts index 54d31d9b..5119acb8 100644 --- a/src/app/generated/vm-api/encoder.ts +++ b/src/app/generated/vm-api/encoder.ts @@ -1,7 +1,7 @@ -/** - * Copyright 2021 Carnegie Mellon University. All Rights Reserved. - * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - */ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ import { HttpParameterCodec } from '@angular/common/http'; diff --git a/src/app/generated/vm-api/git_push.sh b/src/app/generated/vm-api/git_push.sh index b854fc6d..ced3be2b 100644 --- a/src/app/generated/vm-api/git_push.sh +++ b/src/app/generated/vm-api/git_push.sh @@ -1,8 +1,3 @@ -<> - #!/bin/sh # ref: https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/ # diff --git a/src/app/generated/vm-api/index.ts b/src/app/generated/vm-api/index.ts index 116cd8c8..331c364f 100644 --- a/src/app/generated/vm-api/index.ts +++ b/src/app/generated/vm-api/index.ts @@ -1,7 +1,7 @@ -/** - * Copyright 2021 Carnegie Mellon University. All Rights Reserved. - * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - */ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ export * from './api/api'; export * from './model/models'; diff --git a/src/app/generated/vm-api/model/bulkPowerOperation.ts b/src/app/generated/vm-api/model/bulkPowerOperation.ts index 606be9e9..20d3c6b5 100644 --- a/src/app/generated/vm-api/model/bulkPowerOperation.ts +++ b/src/app/generated/vm-api/model/bulkPowerOperation.ts @@ -1,7 +1,7 @@ -/** - * Copyright 2021 Carnegie Mellon University. All Rights Reserved. - * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - */ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ /** * Player VM API diff --git a/src/app/generated/vm-api/model/bulkPowerOperationResponse.ts b/src/app/generated/vm-api/model/bulkPowerOperationResponse.ts index 7964c0cf..b6dac29e 100644 --- a/src/app/generated/vm-api/model/bulkPowerOperationResponse.ts +++ b/src/app/generated/vm-api/model/bulkPowerOperationResponse.ts @@ -1,7 +1,7 @@ -/** - * Copyright 2021 Carnegie Mellon University. All Rights Reserved. - * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - */ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ /** * Player VM API diff --git a/src/app/generated/vm-api/model/changeVsphereVirtualMachineNetwork.ts b/src/app/generated/vm-api/model/changeVsphereVirtualMachineNetwork.ts index 72cbb5ae..8dcf6019 100644 --- a/src/app/generated/vm-api/model/changeVsphereVirtualMachineNetwork.ts +++ b/src/app/generated/vm-api/model/changeVsphereVirtualMachineNetwork.ts @@ -1,7 +1,7 @@ -/** - * Copyright 2021 Carnegie Mellon University. All Rights Reserved. - * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - */ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ /** * Player VM API diff --git a/src/app/generated/vm-api/model/consoleConnectionInfo.ts b/src/app/generated/vm-api/model/consoleConnectionInfo.ts index e95ae32d..09be092d 100644 --- a/src/app/generated/vm-api/model/consoleConnectionInfo.ts +++ b/src/app/generated/vm-api/model/consoleConnectionInfo.ts @@ -1,7 +1,7 @@ -/** - * Copyright 2021 Carnegie Mellon University. All Rights Reserved. - * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - */ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ /** * Player VM API diff --git a/src/app/generated/vm-api/model/coordinate.ts b/src/app/generated/vm-api/model/coordinate.ts index 7e2bf73e..2bf64024 100644 --- a/src/app/generated/vm-api/model/coordinate.ts +++ b/src/app/generated/vm-api/model/coordinate.ts @@ -1,7 +1,7 @@ -/** - * Copyright 2021 Carnegie Mellon University. All Rights Reserved. - * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - */ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ /** * Player VM API @@ -21,7 +21,7 @@ export interface Coordinate { xPosition?: number; yPosition?: number; radius?: number; - url?: string | null; + urls?: Array | null; label?: string | null; } diff --git a/src/app/generated/vm-api/model/coordinateCreateForm.ts b/src/app/generated/vm-api/model/coordinateCreateForm.ts index 6ce34a2d..f48c60ce 100644 --- a/src/app/generated/vm-api/model/coordinateCreateForm.ts +++ b/src/app/generated/vm-api/model/coordinateCreateForm.ts @@ -1,7 +1,7 @@ -/** - * Copyright 2021 Carnegie Mellon University. All Rights Reserved. - * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - */ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ /** * Player VM API @@ -21,7 +21,7 @@ export interface CoordinateCreateForm { xPosition?: number; yPosition?: number; radius?: number; - url?: string | null; + urls?: Array | null; label?: string | null; } diff --git a/src/app/generated/vm-api/model/createVmUsageLoggingSessionCommand.ts b/src/app/generated/vm-api/model/createVmUsageLoggingSessionCommand.ts new file mode 100644 index 00000000..2e6814fb --- /dev/null +++ b/src/app/generated/vm-api/model/createVmUsageLoggingSessionCommand.ts @@ -0,0 +1,29 @@ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ + +/** + * Player VM API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: v1 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export interface CreateVmUsageLoggingSessionCommand { + /** + * Data for a VmUsageLoggingSession. + */ + viewId?: string | null; + teamIds?: Array | null; + sessionName?: string | null; + sessionStart?: Date; + sessionEnd?: Date; +} + diff --git a/src/app/generated/vm-api/model/editVmUsageLoggingSessionCommand.ts b/src/app/generated/vm-api/model/editVmUsageLoggingSessionCommand.ts new file mode 100644 index 00000000..d26a2223 --- /dev/null +++ b/src/app/generated/vm-api/model/editVmUsageLoggingSessionCommand.ts @@ -0,0 +1,30 @@ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ + +/** + * Player VM API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: v1 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export interface EditVmUsageLoggingSessionCommand { + /** + * Data for a VmUsageLoggingSession. + */ + viewId?: string | null; + id?: string; + teamIds?: Array | null; + sessionName?: string | null; + sessionStart?: Date; + sessionEnd?: Date; +} + diff --git a/src/app/generated/vm-api/model/eventType.ts b/src/app/generated/vm-api/model/eventType.ts new file mode 100644 index 00000000..ae65c083 --- /dev/null +++ b/src/app/generated/vm-api/model/eventType.ts @@ -0,0 +1,25 @@ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ + +/** + * Player VM API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: v1 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export type EventType = 'ViewCreated' | 'ViewDeleted'; + +export const EventType = { + ViewCreated: 'ViewCreated' as EventType, + ViewDeleted: 'ViewDeleted' as EventType +}; + diff --git a/src/app/generated/vm-api/model/healthStatus.ts b/src/app/generated/vm-api/model/healthStatus.ts new file mode 100644 index 00000000..d77f97a1 --- /dev/null +++ b/src/app/generated/vm-api/model/healthStatus.ts @@ -0,0 +1,26 @@ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ + +/** + * Player VM API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: v1 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export type HealthStatus = 'Unhealthy' | 'Degraded' | 'Healthy'; + +export const HealthStatus = { + Unhealthy: 'Unhealthy' as HealthStatus, + Degraded: 'Degraded' as HealthStatus, + Healthy: 'Healthy' as HealthStatus +}; + diff --git a/src/app/generated/vm-api/model/isoFile.ts b/src/app/generated/vm-api/model/isoFile.ts index c4327885..224b7c59 100644 --- a/src/app/generated/vm-api/model/isoFile.ts +++ b/src/app/generated/vm-api/model/isoFile.ts @@ -1,7 +1,7 @@ -/** - * Copyright 2021 Carnegie Mellon University. All Rights Reserved. - * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - */ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ /** * Player VM API diff --git a/src/app/generated/vm-api/model/isoResult.ts b/src/app/generated/vm-api/model/isoResult.ts index f05e99b5..e3c8398a 100644 --- a/src/app/generated/vm-api/model/isoResult.ts +++ b/src/app/generated/vm-api/model/isoResult.ts @@ -1,7 +1,7 @@ -/** - * Copyright 2021 Carnegie Mellon University. All Rights Reserved. - * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - */ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ /** * Player VM API diff --git a/src/app/generated/vm-api/model/models.ts b/src/app/generated/vm-api/model/models.ts index 0f984daf..16833598 100644 --- a/src/app/generated/vm-api/model/models.ts +++ b/src/app/generated/vm-api/model/models.ts @@ -1,7 +1,7 @@ -/** - * Copyright 2021 Carnegie Mellon University. All Rights Reserved. - * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - */ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ export * from './bulkPowerOperation'; export * from './bulkPowerOperationResponse'; @@ -9,6 +9,10 @@ export * from './changeVsphereVirtualMachineNetwork'; export * from './consoleConnectionInfo'; export * from './coordinate'; export * from './coordinateCreateForm'; +export * from './createVmUsageLoggingSessionCommand'; +export * from './editVmUsageLoggingSessionCommand'; +export * from './eventType'; +export * from './healthStatus'; export * from './isoFile'; export * from './isoResult'; export * from './mountVsphereIso'; @@ -16,6 +20,7 @@ export * from './nicOptions'; export * from './permissions'; export * from './powerState'; export * from './problemDetails'; +export * from './proxmoxConsole'; export * from './setVsphereVirtualMachineResolution'; export * from './simpleTeam'; export * from './teamIsoResult'; @@ -25,5 +30,12 @@ export * from './vm'; export * from './vmCreateForm'; export * from './vmMap'; export * from './vmMapCreateForm'; +export * from './vmMapUpdateForm'; +export * from './vmType'; export * from './vmUpdateForm'; +export * from './vmUsageLoggingSession'; +export * from './vmUsageReport'; +export * from './vmUser'; +export * from './vmUserTeam'; export * from './vsphereVirtualMachine'; +export * from './webhookEvent'; diff --git a/src/app/generated/vm-api/model/mountVsphereIso.ts b/src/app/generated/vm-api/model/mountVsphereIso.ts index a7ca59b0..bc33c3c8 100644 --- a/src/app/generated/vm-api/model/mountVsphereIso.ts +++ b/src/app/generated/vm-api/model/mountVsphereIso.ts @@ -1,7 +1,7 @@ -/** - * Copyright 2021 Carnegie Mellon University. All Rights Reserved. - * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - */ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ /** * Player VM API diff --git a/src/app/generated/vm-api/model/nicOptions.ts b/src/app/generated/vm-api/model/nicOptions.ts index e5a241f9..25fbaa12 100644 --- a/src/app/generated/vm-api/model/nicOptions.ts +++ b/src/app/generated/vm-api/model/nicOptions.ts @@ -1,7 +1,7 @@ -/** - * Copyright 2021 Carnegie Mellon University. All Rights Reserved. - * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - */ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ /** * Player VM API diff --git a/src/app/generated/vm-api/model/permissions.ts b/src/app/generated/vm-api/model/permissions.ts index 57cba678..2e360404 100644 --- a/src/app/generated/vm-api/model/permissions.ts +++ b/src/app/generated/vm-api/model/permissions.ts @@ -1,7 +1,7 @@ -/** - * Copyright 2021 Carnegie Mellon University. All Rights Reserved. - * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - */ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ /** * Player VM API diff --git a/src/app/generated/vm-api/model/powerState.ts b/src/app/generated/vm-api/model/powerState.ts index da2f2877..6b7ca332 100644 --- a/src/app/generated/vm-api/model/powerState.ts +++ b/src/app/generated/vm-api/model/powerState.ts @@ -1,7 +1,7 @@ -/** - * Copyright 2021 Carnegie Mellon University. All Rights Reserved. - * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - */ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ /** * Player VM API diff --git a/src/app/generated/vm-api/model/problemDetails.ts b/src/app/generated/vm-api/model/problemDetails.ts index 4e674131..7c892d7a 100644 --- a/src/app/generated/vm-api/model/problemDetails.ts +++ b/src/app/generated/vm-api/model/problemDetails.ts @@ -1,7 +1,7 @@ -/** - * Copyright 2021 Carnegie Mellon University. All Rights Reserved. - * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - */ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ /** * Player VM API @@ -15,9 +15,8 @@ * Do not edit the class manually. */ - export interface ProblemDetails { - [key: string]: object | any; + [key: string]: any; type?: string | null; diff --git a/src/app/generated/vm-api/model/proxmoxConsole.ts b/src/app/generated/vm-api/model/proxmoxConsole.ts new file mode 100644 index 00000000..abd8a2b5 --- /dev/null +++ b/src/app/generated/vm-api/model/proxmoxConsole.ts @@ -0,0 +1,23 @@ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ + +/** + * Player VM API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: v1 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export interface ProxmoxConsole { + url?: string | null; + ticket?: string | null; +} + diff --git a/src/app/generated/vm-api/model/setVsphereVirtualMachineResolution.ts b/src/app/generated/vm-api/model/setVsphereVirtualMachineResolution.ts index 956b2a24..841ec581 100644 --- a/src/app/generated/vm-api/model/setVsphereVirtualMachineResolution.ts +++ b/src/app/generated/vm-api/model/setVsphereVirtualMachineResolution.ts @@ -1,7 +1,7 @@ -/** - * Copyright 2021 Carnegie Mellon University. All Rights Reserved. - * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - */ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ /** * Player VM API diff --git a/src/app/generated/vm-api/model/simpleTeam.ts b/src/app/generated/vm-api/model/simpleTeam.ts index ae51f61d..1582f926 100644 --- a/src/app/generated/vm-api/model/simpleTeam.ts +++ b/src/app/generated/vm-api/model/simpleTeam.ts @@ -1,7 +1,7 @@ -/** - * Copyright 2021 Carnegie Mellon University. All Rights Reserved. - * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - */ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ /** * Player VM API diff --git a/src/app/generated/vm-api/model/teamIsoResult.ts b/src/app/generated/vm-api/model/teamIsoResult.ts index 33b5adab..3c0ac79c 100644 --- a/src/app/generated/vm-api/model/teamIsoResult.ts +++ b/src/app/generated/vm-api/model/teamIsoResult.ts @@ -1,7 +1,7 @@ -/** - * Copyright 2021 Carnegie Mellon University. All Rights Reserved. - * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - */ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ /** * Player VM API diff --git a/src/app/generated/vm-api/model/validateVsphereVirtualMachineCredentials.ts b/src/app/generated/vm-api/model/validateVsphereVirtualMachineCredentials.ts index ccccb1e2..9b33078a 100644 --- a/src/app/generated/vm-api/model/validateVsphereVirtualMachineCredentials.ts +++ b/src/app/generated/vm-api/model/validateVsphereVirtualMachineCredentials.ts @@ -1,7 +1,7 @@ -/** - * Copyright 2021 Carnegie Mellon University. All Rights Reserved. - * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - */ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ /** * Player VM API diff --git a/src/app/generated/vm-api/model/virtualMachineToolsStatus.ts b/src/app/generated/vm-api/model/virtualMachineToolsStatus.ts index f6e94585..76b3536a 100644 --- a/src/app/generated/vm-api/model/virtualMachineToolsStatus.ts +++ b/src/app/generated/vm-api/model/virtualMachineToolsStatus.ts @@ -1,7 +1,7 @@ -/** - * Copyright 2021 Carnegie Mellon University. All Rights Reserved. - * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - */ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ /** * Player VM API diff --git a/src/app/generated/vm-api/model/vm.ts b/src/app/generated/vm-api/model/vm.ts index ae42072b..524156f2 100644 --- a/src/app/generated/vm-api/model/vm.ts +++ b/src/app/generated/vm-api/model/vm.ts @@ -1,7 +1,7 @@ -/** - * Copyright 2021 Carnegie Mellon University. All Rights Reserved. - * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - */ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ /** * Player VM API @@ -14,6 +14,7 @@ * https://openapi-generator.tech * Do not edit the class manually. */ +import { VmType } from './vmType'; import { PowerState } from './powerState'; import { ConsoleConnectionInfo } from './consoleConnectionInfo'; @@ -53,5 +54,6 @@ export interface Vm { */ hasPendingTasks?: boolean; consoleConnectionInfo?: ConsoleConnectionInfo; + type?: VmType; } diff --git a/src/app/generated/vm-api/model/vmCreateForm.ts b/src/app/generated/vm-api/model/vmCreateForm.ts index bd590aef..10bc9ad9 100644 --- a/src/app/generated/vm-api/model/vmCreateForm.ts +++ b/src/app/generated/vm-api/model/vmCreateForm.ts @@ -1,7 +1,7 @@ -/** - * Copyright 2021 Carnegie Mellon University. All Rights Reserved. - * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - */ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ /** * Player VM API diff --git a/src/app/generated/vm-api/model/vmMap.ts b/src/app/generated/vm-api/model/vmMap.ts index 0084a4a1..c76e6808 100644 --- a/src/app/generated/vm-api/model/vmMap.ts +++ b/src/app/generated/vm-api/model/vmMap.ts @@ -1,7 +1,7 @@ -/** - * Copyright 2021 Carnegie Mellon University. All Rights Reserved. - * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - */ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ /** * Player VM API diff --git a/src/app/generated/vm-api/model/vmMapCreateForm.ts b/src/app/generated/vm-api/model/vmMapCreateForm.ts index 532b9848..560d24c1 100644 --- a/src/app/generated/vm-api/model/vmMapCreateForm.ts +++ b/src/app/generated/vm-api/model/vmMapCreateForm.ts @@ -1,7 +1,7 @@ -/** - * Copyright 2021 Carnegie Mellon University. All Rights Reserved. - * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - */ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ /** * Player VM API @@ -22,5 +22,6 @@ export interface VmMapCreateForm { name?: string | null; imageUrl?: string | null; teamIds?: Array | null; + id?: string | null; } diff --git a/src/app/generated/vm-api/model/vmMapUpdateForm.ts b/src/app/generated/vm-api/model/vmMapUpdateForm.ts new file mode 100644 index 00000000..fd2e9f5b --- /dev/null +++ b/src/app/generated/vm-api/model/vmMapUpdateForm.ts @@ -0,0 +1,26 @@ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ + +/** + * Player VM API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: v1 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { CoordinateCreateForm } from './coordinateCreateForm'; + + +export interface VmMapUpdateForm { + coordinates?: Array | null; + name?: string | null; + imageUrl?: string | null; + teamIds?: Array | null; +} + diff --git a/src/app/generated/vm-api/model/vmType.ts b/src/app/generated/vm-api/model/vmType.ts new file mode 100644 index 00000000..86b234f3 --- /dev/null +++ b/src/app/generated/vm-api/model/vmType.ts @@ -0,0 +1,27 @@ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ + +/** + * Player VM API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: v1 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export type VmType = 'Unknown' | 'Vsphere' | 'Proxmox' | 'Azure'; + +export const VmType = { + Unknown: 'Unknown' as VmType, + Vsphere: 'Vsphere' as VmType, + Proxmox: 'Proxmox' as VmType, + Azure: 'Azure' as VmType +}; + diff --git a/src/app/generated/vm-api/model/vmUpdateForm.ts b/src/app/generated/vm-api/model/vmUpdateForm.ts index cf0ea700..da958cc7 100644 --- a/src/app/generated/vm-api/model/vmUpdateForm.ts +++ b/src/app/generated/vm-api/model/vmUpdateForm.ts @@ -1,7 +1,7 @@ -/** - * Copyright 2021 Carnegie Mellon University. All Rights Reserved. - * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - */ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ /** * Player VM API diff --git a/src/app/generated/vm-api/model/vmUsageLoggingSession.ts b/src/app/generated/vm-api/model/vmUsageLoggingSession.ts new file mode 100644 index 00000000..7b0c5641 --- /dev/null +++ b/src/app/generated/vm-api/model/vmUsageLoggingSession.ts @@ -0,0 +1,31 @@ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ + +/** + * Player VM API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: v1 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +/** + * A Logging session for Virtual Machines + */ +export interface VmUsageLoggingSession { + id?: string; + viewId?: string; + teamIds?: Array | null; + sessionName?: string | null; + createdDt?: Date; + sessionStart?: Date; + sessionEnd?: Date; +} + diff --git a/src/app/generated/vm-api/model/vmUsageReport.ts b/src/app/generated/vm-api/model/vmUsageReport.ts new file mode 100644 index 00000000..801c0a70 --- /dev/null +++ b/src/app/generated/vm-api/model/vmUsageReport.ts @@ -0,0 +1,31 @@ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ + +/** + * Player VM API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: v1 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export interface VmUsageReport { + sessionId?: string; + sessionName?: string | null; + sessionStart?: Date; + sessionEnd?: Date; + vmId?: string; + vmName?: string | null; + ipAddress?: string | null; + userId?: string; + userName?: string | null; + minutesActive?: number; +} + diff --git a/src/app/generated/vm-api/model/vmUser.ts b/src/app/generated/vm-api/model/vmUser.ts new file mode 100644 index 00000000..0864b0f5 --- /dev/null +++ b/src/app/generated/vm-api/model/vmUser.ts @@ -0,0 +1,33 @@ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ + +/** + * Player VM API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: v1 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export interface VmUser { + /** + * User\'s unique Id + */ + userId?: string; + /** + * User\'s name + */ + username?: string | null; + /** + * Id of the Vm this User is currently viewing, if any + */ + activeVmId?: string | null; +} + diff --git a/src/app/generated/vm-api/model/vmUserTeam.ts b/src/app/generated/vm-api/model/vmUserTeam.ts new file mode 100644 index 00000000..f440ba19 --- /dev/null +++ b/src/app/generated/vm-api/model/vmUserTeam.ts @@ -0,0 +1,25 @@ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ + +/** + * Player VM API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: v1 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { VmUser } from './vmUser'; + + +export interface VmUserTeam { + id?: string; + name?: string | null; + users?: Array | null; +} + diff --git a/src/app/generated/vm-api/model/vsphereVirtualMachine.ts b/src/app/generated/vm-api/model/vsphereVirtualMachine.ts index ce4afb4b..a294035f 100644 --- a/src/app/generated/vm-api/model/vsphereVirtualMachine.ts +++ b/src/app/generated/vm-api/model/vsphereVirtualMachine.ts @@ -1,7 +1,7 @@ -/** - * Copyright 2021 Carnegie Mellon University. All Rights Reserved. - * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - */ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ /** * Player VM API diff --git a/src/app/generated/vm-api/model/webhookEvent.ts b/src/app/generated/vm-api/model/webhookEvent.ts new file mode 100644 index 00000000..4667b703 --- /dev/null +++ b/src/app/generated/vm-api/model/webhookEvent.ts @@ -0,0 +1,26 @@ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ + +/** + * Player VM API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: v1 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { EventType } from './eventType'; + + +export interface WebhookEvent { + id?: string; + type?: EventType; + timestamp?: Date; + payload?: string | null; +} + diff --git a/src/app/generated/vm-api/variables.ts b/src/app/generated/vm-api/variables.ts index b35d0497..ef3dc7d5 100644 --- a/src/app/generated/vm-api/variables.ts +++ b/src/app/generated/vm-api/variables.ts @@ -1,7 +1,7 @@ -/** - * Copyright 2021 Carnegie Mellon University. All Rights Reserved. - * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - */ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ import { InjectionToken } from '@angular/core'; diff --git a/src/app/services/novnc/novnc.service.ts b/src/app/services/novnc/novnc.service.ts new file mode 100644 index 00000000..0ee26707 --- /dev/null +++ b/src/app/services/novnc/novnc.service.ts @@ -0,0 +1,57 @@ +/** + * Copyright 2021 Carnegie Mellon University. All Rights Reserved. + * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. + */ + +import { Injectable } from '@angular/core'; +import RFB from '../../../../node_modules/@novnc/novnc/core/rfb.js'; + +@Injectable({ + providedIn: 'root', +}) +export class NoVNCService { + private rfb: RFB; + + constructor() {} + + startClient( + url: string, + ticket: string, + elementId: string, + readOnly: boolean, + backgroundColor: string + ) { + // Creating a new RFB object will start a new connection + this.rfb = new RFB(document.getElementById(elementId), url, { + credentials: { + password: ticket, + }, + }); + + this.rfb.background = backgroundColor; + this.rfb.viewOnly = readOnly; + this.rfb.scaleViewport = true; + } + + public setViewOnly(viewOnly: boolean) { + if (this.rfb) { + this.rfb.viewOnly = viewOnly; + } + } + + public setConnectListener(func: Function) { + this.rfb.addEventListener('connect', func); + } + + public setDisconnectListener(func: Function) { + this.rfb.addEventListener('disconnect', func); + } + + public setSecurityFailureListener(func: Function) { + this.rfb.addEventListener('securityfailure', func); + } + + public sendCtrlAltDel() { + this.rfb.sendCtrlAltDel(); + } +} diff --git a/src/app/services/proxmox/proxmox.service.ts b/src/app/services/proxmox/proxmox.service.ts new file mode 100644 index 00000000..a150841e --- /dev/null +++ b/src/app/services/proxmox/proxmox.service.ts @@ -0,0 +1,18 @@ +/** + * Copyright 2021 Carnegie Mellon University. All Rights Reserved. + * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. + */ + +import { Injectable } from '@angular/core'; +import { NoVNCService } from '../novnc/novnc.service'; + +@Injectable({ + providedIn: 'root', +}) +export class ProxmoxService { + constructor(private novncService: NoVNCService) {} + + public sendCtrlAltDel() { + this.novncService.sendCtrlAltDel(); + } +} diff --git a/src/app/services/signalr/signalr.service.ts b/src/app/services/signalr/signalr.service.ts index 1f31b1fd..dcf8ec2a 100644 --- a/src/app/services/signalr/signalr.service.ts +++ b/src/app/services/signalr/signalr.service.ts @@ -8,7 +8,7 @@ import { ComnAuthService } from '@cmusei/crucible-common'; import * as signalR from '@microsoft/signalr'; import { BASE_PATH } from '../../generated/vm-api'; import { UserService } from '../../state/user/user.service'; -import { VmService } from '../../state/vm/vm.service'; +import { VsphereService } from '../../state/vsphere/vsphere.service'; @Injectable({ providedIn: 'root', @@ -24,7 +24,7 @@ export class SignalRService { constructor( private authService: ComnAuthService, - private vmService: VmService, + private vmService: VsphereService, private userService: UserService, @Inject(BASE_PATH) basePath: string ) { diff --git a/src/app/state/vm/vm.query.ts b/src/app/state/vm/vm.query.ts index 68e48543..797f8148 100644 --- a/src/app/state/vm/vm.query.ts +++ b/src/app/state/vm/vm.query.ts @@ -1,13 +1,13 @@ -/** - * Copyright 2021 Carnegie Mellon University. All Rights Reserved. - * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - */ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ import { Injectable } from '@angular/core'; import { QueryEntity } from '@datorama/akita'; import { Observable } from 'rxjs'; import { filter } from 'rxjs/operators'; -import { VsphereVirtualMachine } from '../../generated/vm-api'; +import { Vm } from '../../generated/vm-api'; import { VmStore, VmState } from './vm.store'; @Injectable({ providedIn: 'root' }) @@ -16,7 +16,7 @@ export class VmQuery extends QueryEntity { super(store); } - public selectEntityNotNull(id: string): Observable { + public selectEntityNotNull(id: string): Observable { return super.selectEntity(id).pipe(filter((vm) => vm != null)); } } diff --git a/src/app/state/vm/vm.service.ts b/src/app/state/vm/vm.service.ts index babacee0..8e4ae3ca 100644 --- a/src/app/state/vm/vm.service.ts +++ b/src/app/state/vm/vm.service.ts @@ -1,69 +1,38 @@ -/** - * Copyright 2021 Carnegie Mellon University. All Rights Reserved. - * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - */ - -import { HttpClient } from '@angular/common/http'; -import { Inject, Injectable } from '@angular/core'; -import { BehaviorSubject, interval, Observable } from 'rxjs'; -import { startWith, take, takeWhile, tap } from 'rxjs/operators'; -import { - BASE_PATH, - ChangeVsphereVirtualMachineNetwork, - MountVsphereIso, - SetVsphereVirtualMachineResolution, - ValidateVsphereVirtualMachineCredentials, - VmsService, - VsphereService, - VsphereVirtualMachine, -} from '../../generated/vm-api'; -import { IsoResult } from '../../models/vm/iso-result'; -import { - VirtualMachineToolsStatus, - VmResolution, -} from '../../models/vm/vm-model'; +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ + +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; +import { tap } from 'rxjs/operators'; +import { Vm, VmsService } from '../../generated/vm-api'; +import { ProxmoxService } from '../../services/proxmox/proxmox.service'; +import { VmQuery } from './vm.query'; import { VmStore } from './vm.store'; -declare var WMKS: any; // needed to check values - @Injectable({ providedIn: 'root' }) export class VmService { - public wmks; - public model = {} as VsphereVirtualMachine; - public showLoading = true; - public showPower = false; - public showPoweringOff = false; - public showError = false; - public showLock = false; - public uploadConfig: any = { - username: '', - password: '', - filepath: '', - }; - - public vmClipBoard = new BehaviorSubject(''); - public vmResolution = new BehaviorSubject({ - width: 1024, - height: 768, - }); - - private apiUrl: string; - constructor( - private http: HttpClient, - private vmsService: VmsService, - private vsphereService: VsphereService, private vmStore: VmStore, - @Inject(BASE_PATH) basePath: string - ) { - this.apiUrl = basePath; + private vmsService: VmsService, + private vmQuery: VmQuery, + private proxmoxService: ProxmoxService + ) {} + + get(id: string) { + return this.vmsService.getVm(id).pipe( + tap((vm: Vm) => { + this.vmStore.upsert(id, vm); + }) + ); } - add(vm: VsphereVirtualMachine) { + add(vm: Vm) { this.vmStore.add(vm); } - update(id, vm: Partial) { + update(id, vm: Partial) { this.vmStore.update(id, vm); } @@ -71,325 +40,17 @@ export class VmService { this.vmStore.remove(id); } - setActive(id: string) { - this.vmStore.setActive(id); - } - - public getVm(id: string): Observable { - return this.vsphereService - .getVsphereVirtualMachine(id) - .pipe(tap((vm) => this.vmStore.upsert(id, vm))); - } - - public getVmPermissions(id: string): Observable { + getVmPermissions(id: string): Observable { return this.vmsService.getVmPermissions(id); } - public sendPowerOn(id: string) { - return this.vsphereService.powerOnVsphereVirtualMachine(id); - } - - public sendPowerOff(id: string) { - return this.vsphereService.powerOffVsphereVirtualMachine(id); - } - - public sendReboot(id: string) { - return this.vsphereService.rebootVsphereVirtualMachine(id); - } - - public sendShutdownOS(id: string) { - return this.vsphereService.shutdownVsphereVirtualMachine(id); - } - - public checkForVmTools(id: string) { - return this.vsphereService - .getVsphereVirtualMachineToolsStatus(id) - .pipe(tap((x) => this.vmStore.update(id, { vmToolsStatus: x }))); - } - - public verifyCredentials(id: string) { - const data: ValidateVsphereVirtualMachineCredentials = { - username: this.uploadConfig.username, - password: this.uploadConfig.password, - filePath: this.uploadConfig.filepath, - }; - - return this.vsphereService.validateVsphereVirtualMachineCredentials( - id, - data - ); - } - - public sendFileToVm(id: string, files: FileList) { - const formData: FormData = new FormData(); - formData.append('username', this.uploadConfig.username); - formData.append('password', this.uploadConfig.password); - formData.append('filepath', this.uploadConfig.filepath); - for (let i = 0; i < files.length; i++) { - formData.append(files[i].name, files[i]); - } - console.log('sending ' + files.length.toString() + ' files to the api'); - return this.http.post( - `${this.apiUrl}/api/vms/vsphere/${id}/actions/upload-file`, - formData - ); - } - - public changeNic(id: string, adapter: string, nic: string) { - const data: ChangeVsphereVirtualMachineNetwork = { - adapter: adapter, - network: nic, - }; - return this.vsphereService.changeVsphereVirtualMachineNetwork(id, data); - } - - public async connect(id: string, readOnly: boolean) { - console.log('Attempting to connect to vm'); + sendCtrlAltDel(id: string) { + const vm = this.vmQuery.getEntity(id); - this.getVm(id) - .pipe(take(1)) - .subscribe( - (model) => { - this.model = model; - - // console.log('got vm model'); - if (model.state === 'error') { - console.log('could not get power state'); - this.showError = true; - this.showPower = false; - this.showPoweringOff = false; - this.showLoading = false; - return; - } else if (model.state === 'off') { - this.showError = false; - this.showPower = true; - this.showPoweringOff = false; - this.showLoading = false; - // console.log('vm is off'); - return; - } else if (model.state === '') { - this.showError = false; - this.showPower = false; - this.showPoweringOff = false; - this.showLoading = true; - // console.log('vm is off'); - return; - } else if (model.state === 'on') { - this.showError = false; - this.showPower = false; - this.showPoweringOff = false; - this.showLoading = true; - // console.log('vm is on'); - } - - if (this.model.ticket) { - if (this.wmks != null) { - this.wmks.disconnect(); - this.wmks = null; - } - this.CreateWmks(readOnly); - const state = this.wmks.getConnectionState(); - if (state === WMKS.CONST.ConnectionState.DISCONNECTED) { - // console.log('connecting to ' + this.model.ticket); - this.wmks.connect(this.model.ticket); - } - // ticket is one time use so unset it - this.model.ticket = null; - this.showLoading = false; - } - }, - (error) => { - this.model.name = 'Virtual Machine'; - this.model.id = id; // make sure that we dont lose the id - this.model.state = error.message; - } - ); - } - - public CreateWmks(readOnly: boolean) { - this.wmks = WMKS.createWMKS('wmksContainer', { - changeResolution: this.model.isOwner, - rescale: true, - position: WMKS.CONST.Position.CENTER, - retryConnectionInterval: 5000, // Changed to 5 seconds. This affects initial connection to console. - }); - - if (readOnly) { - const elem = document.getElementById('mainCanvas'); - elem.style.pointerEvents = 'none'; - elem.tabIndex = -1; - - const observer = new MutationObserver((mutations) => { - mutations.forEach((m) => { - if ( - m.attributeName === 'style' && - elem.style.pointerEvents !== 'none' - ) { - elem.style.pointerEvents = 'none'; - } else if (m.attributeName === 'tabindex' && elem.tabIndex !== -1) { - elem.tabIndex = -1; - } - }); - }); - - observer.observe(elem, { - attributes: true, - attributeFilter: ['style', 'tabindex'], - }); + switch (vm.type) { + case 'Proxmox': + this.proxmoxService.sendCtrlAltDel(); + break; } - - this.wmks.register( - WMKS.CONST.Events.CONNECTION_STATE_CHANGE, - (event: any, data: any) => { - console.log('Connection State: ' + data.state); - if (data.state === WMKS.CONST.ConnectionState.CONNECTED) { - // console.log('connection state change : connected'); - this.showLoading = false; - this.showPower = false; - this.showPoweringOff = false; - this.showError = false; - this.showLock = false; - this.model.vmToolsStatus = VirtualMachineToolsStatus.toolsNotRunning; - - interval(10000) - .pipe( - startWith(0), - takeWhile( - () => - this.model.vmToolsStatus === - VirtualMachineToolsStatus.toolsNotRunning - ) - ) - .subscribe(() => { - this.checkForVmTools(this.model.id) - .pipe(take(1)) - .subscribe((val) => { - this.model.vmToolsStatus = val as VirtualMachineToolsStatus; - }); - }); - } else if (data.state === WMKS.CONST.ConnectionState.CONNECTING) { - // console.log('connection state change : connecting'); - this.showLoading = true; - this.showPower = false; - this.showPoweringOff = false; - this.showError = false; - this.showLock = false; - } else if (data.state === WMKS.CONST.ConnectionState.DISCONNECTED) { - // console.log('connection state change : disconnected'); - // we should not connect if we sent poweroff - if (this.showPower === false) { - this.showLoading = true; - } - - // When this.showPoweringOff is false, the disconnect came from the VM shutting itself down - if (this.showPoweringOff === false) { - // This is weird but there is no easy way to reload the wmks after it destroys itself when - // a VM shuts itself down. Wait a few seconds and then reload the page which will trigger - // a reconnect to the already shutdown VM - setTimeout(() => { - console.log('attempt reload'); - window.location.reload(); - }, 3000); - } - this.showPoweringOff = false; - this.showError = false; - this.showLock = false; - console.log('disconnect complete'); - } - } - ); - - // Register the COPY event from the VM. - this.wmks.register(WMKS.CONST.Events.COPY, (event: any, data: string) => { - if (data) { - this.vmClipBoard.next(data); - } - }); - } - - public powerOn(id: string) { - this.sendPowerOn(id).subscribe( - (response) => { - // console.log(response); - if (response === 'poweron submitted') { - console.log('poweron submitted'); - } else if (response === 'already on') { - console.log('already powered on'); - } else if (response === 'poweron error') { - console.log('poweron error received'); - } - }, - () => { - console.log('error sending poweron console API'); - } - ); - } - - public powerOff(id: string) { - this.sendPowerOff(id).subscribe( - (response) => { - if (response === 'poweroff submitted') { - this.showPoweringOff = true; - // Wait before submitting the destroy to allow events from wmks to finish. - setTimeout(() => { - this.wmks.destroy(); - }, 1000); - } else if (response === 'already off') { - } else if (response === 'poweroff error') { - console.log('poweroff error received'); - } - }, - () => { - console.log('error sending poweroff to console API'); - } - ); - } - - public reBoot(id: string) { - // console.log('reboot requested'); - this.sendReboot(id).subscribe( - () => { - // console.log(response); - }, - () => { - console.log('error sending reboot to console API'); - this.model.ticket = null; - } - ); - } - - public shutdownOS(id: string) { - this.sendShutdownOS(id).subscribe( - (response) => { - console.log(response); - }, - () => { - console.log('error sending reboot to console API'); - this.model.ticket = null; - } - ); - } - - public getUploadConfig(): Observable { - return this.uploadConfig.asObservable(); - } - - public getIsos(id: string): Observable { - return this.vsphereService.getVsphereVirtualMachineIsos(id) as Observable< - IsoResult[] - >; - } - - public mountIso(id: string, iso: string) { - const data: MountVsphereIso = { iso: iso }; - return this.vsphereService.mountVsphereVirtualMachineIso(id, data); - } - - public setResolution(id: string, resolution: VmResolution) { - const data: SetVsphereVirtualMachineResolution = { - height: resolution.height, - width: resolution.width, - }; - return this.vsphereService.setVsphereVirtualMachineResolution(id, data); } } diff --git a/src/app/state/vm/vm.store.ts b/src/app/state/vm/vm.store.ts index f6cf0e0b..c672ae4e 100644 --- a/src/app/state/vm/vm.store.ts +++ b/src/app/state/vm/vm.store.ts @@ -1,20 +1,13 @@ -/** - * Copyright 2021 Carnegie Mellon University. All Rights Reserved. - * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - */ +/* +Copyright 2021 Carnegie Mellon University. All Rights Reserved. + Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. +*/ import { Injectable } from '@angular/core'; -import { - EntityState, - EntityStore, - StoreConfig, - ActiveState, -} from '@datorama/akita'; -import { VsphereVirtualMachine } from '../../generated/vm-api/model/vsphereVirtualMachine'; +import { EntityState, EntityStore, StoreConfig } from '@datorama/akita'; +import { Vm } from '../../generated/vm-api'; -export interface VmState - extends EntityState, - ActiveState {} +export interface VmState extends EntityState {} @Injectable({ providedIn: 'root' }) @StoreConfig({ name: 'vm' }) diff --git a/src/app/state/vsphere/vsphere.query.ts b/src/app/state/vsphere/vsphere.query.ts new file mode 100644 index 00000000..ffcacfda --- /dev/null +++ b/src/app/state/vsphere/vsphere.query.ts @@ -0,0 +1,22 @@ +/** + * Copyright 2021 Carnegie Mellon University. All Rights Reserved. + * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. + */ + +import { Injectable } from '@angular/core'; +import { QueryEntity } from '@datorama/akita'; +import { Observable } from 'rxjs'; +import { filter } from 'rxjs/operators'; +import { VsphereVirtualMachine } from '../../generated/vm-api'; +import { VmStore, VsphereState } from './vsphere.store'; + +@Injectable({ providedIn: 'root' }) +export class VsphereQuery extends QueryEntity { + constructor(protected store: VmStore) { + super(store); + } + + public selectEntityNotNull(id: string): Observable { + return super.selectEntity(id).pipe(filter((vm) => vm != null)); + } +} diff --git a/src/app/state/vsphere/vsphere.service.ts b/src/app/state/vsphere/vsphere.service.ts new file mode 100644 index 00000000..1f227dc6 --- /dev/null +++ b/src/app/state/vsphere/vsphere.service.ts @@ -0,0 +1,391 @@ +/** + * Copyright 2021 Carnegie Mellon University. All Rights Reserved. + * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. + */ + +import { HttpClient } from '@angular/common/http'; +import { Inject, Injectable } from '@angular/core'; +import { BehaviorSubject, interval, Observable } from 'rxjs'; +import { startWith, take, takeWhile, tap } from 'rxjs/operators'; +import { + BASE_PATH, + ChangeVsphereVirtualMachineNetwork, + MountVsphereIso, + SetVsphereVirtualMachineResolution, + ValidateVsphereVirtualMachineCredentials, + VmsService, + VsphereService as ApiVsphereService, + VsphereVirtualMachine, +} from '../../generated/vm-api'; +import { IsoResult } from '../../models/vm/iso-result'; +import { + VirtualMachineToolsStatus, + VmResolution, +} from '../../models/vm/vm-model'; +import { VmStore } from './vsphere.store'; + +declare var WMKS: any; // needed to check values + +@Injectable({ providedIn: 'root' }) +export class VsphereService { + public wmks; + public model = {} as VsphereVirtualMachine; + public showLoading = true; + public showPower = false; + public showPoweringOff = false; + public showError = false; + public showLock = false; + public uploadConfig: any = { + username: '', + password: '', + filepath: '', + }; + + public vmClipBoard = new BehaviorSubject(''); + public vmResolution = new BehaviorSubject({ + width: 1024, + height: 768, + }); + + private apiUrl: string; + + constructor( + private http: HttpClient, + private vmsService: VmsService, + private vsphereService: ApiVsphereService, + private vmStore: VmStore, + @Inject(BASE_PATH) basePath: string + ) { + this.apiUrl = basePath; + } + + add(vm: VsphereVirtualMachine) { + this.vmStore.add(vm); + } + + update(id, vm: Partial) { + this.vmStore.update(id, vm); + } + + remove(id: string) { + this.vmStore.remove(id); + } + + setActive(id: string) { + this.vmStore.setActive(id); + } + + public getVm(id: string): Observable { + return this.vsphereService + .getVsphereVirtualMachine(id) + .pipe(tap((vm) => this.vmStore.upsert(id, vm))); + } + + public sendPowerOn(id: string) { + return this.vsphereService.powerOnVsphereVirtualMachine(id); + } + + public sendPowerOff(id: string) { + return this.vsphereService.powerOffVsphereVirtualMachine(id); + } + + public sendReboot(id: string) { + return this.vsphereService.rebootVsphereVirtualMachine(id); + } + + public sendShutdownOS(id: string) { + return this.vsphereService.shutdownVsphereVirtualMachine(id); + } + + public checkForVmTools(id: string) { + return this.vsphereService + .getVsphereVirtualMachineToolsStatus(id) + .pipe(tap((x) => this.vmStore.update(id, { vmToolsStatus: x }))); + } + + public verifyCredentials(id: string) { + const data: ValidateVsphereVirtualMachineCredentials = { + username: this.uploadConfig.username, + password: this.uploadConfig.password, + filePath: this.uploadConfig.filepath, + }; + + return this.vsphereService.validateVsphereVirtualMachineCredentials( + id, + data + ); + } + + public sendFileToVm(id: string, files: FileList) { + const formData: FormData = new FormData(); + formData.append('username', this.uploadConfig.username); + formData.append('password', this.uploadConfig.password); + formData.append('filepath', this.uploadConfig.filepath); + for (let i = 0; i < files.length; i++) { + formData.append(files[i].name, files[i]); + } + console.log('sending ' + files.length.toString() + ' files to the api'); + return this.http.post( + `${this.apiUrl}/api/vms/vsphere/${id}/actions/upload-file`, + formData + ); + } + + public changeNic(id: string, adapter: string, nic: string) { + const data: ChangeVsphereVirtualMachineNetwork = { + adapter: adapter, + network: nic, + }; + return this.vsphereService.changeVsphereVirtualMachineNetwork(id, data); + } + + public async connect(id: string, readOnly: boolean) { + console.log('Attempting to connect to vm'); + + this.getVm(id) + .pipe(take(1)) + .subscribe( + (model) => { + this.model = model; + + // console.log('got vm model'); + if (model.state === 'error') { + console.log('could not get power state'); + this.showError = true; + this.showPower = false; + this.showPoweringOff = false; + this.showLoading = false; + return; + } else if (model.state === 'off') { + this.showError = false; + this.showPower = true; + this.showPoweringOff = false; + this.showLoading = false; + // console.log('vm is off'); + return; + } else if (model.state === '') { + this.showError = false; + this.showPower = false; + this.showPoweringOff = false; + this.showLoading = true; + // console.log('vm is off'); + return; + } else if (model.state === 'on') { + this.showError = false; + this.showPower = false; + this.showPoweringOff = false; + this.showLoading = true; + // console.log('vm is on'); + } + + if (this.model.ticket) { + if (this.wmks != null) { + this.wmks.disconnect(); + this.wmks = null; + } + this.CreateWmks(readOnly); + const state = this.wmks.getConnectionState(); + if (state === WMKS.CONST.ConnectionState.DISCONNECTED) { + // console.log('connecting to ' + this.model.ticket); + this.wmks.connect(this.model.ticket); + } + // ticket is one time use so unset it + this.model.ticket = null; + this.showLoading = false; + } + }, + (error) => { + this.model.name = 'Virtual Machine'; + this.model.id = id; // make sure that we dont lose the id + this.model.state = error.message; + } + ); + } + + public CreateWmks(readOnly: boolean) { + this.wmks = WMKS.createWMKS('wmksContainer', { + changeResolution: this.model.isOwner, + rescale: true, + position: WMKS.CONST.Position.CENTER, + retryConnectionInterval: 5000, // Changed to 5 seconds. This affects initial connection to console. + }); + + if (readOnly) { + const elem = document.getElementById('mainCanvas'); + elem.style.pointerEvents = 'none'; + elem.tabIndex = -1; + + const observer = new MutationObserver((mutations) => { + mutations.forEach((m) => { + if ( + m.attributeName === 'style' && + elem.style.pointerEvents !== 'none' + ) { + elem.style.pointerEvents = 'none'; + } else if (m.attributeName === 'tabindex' && elem.tabIndex !== -1) { + elem.tabIndex = -1; + } + }); + }); + + observer.observe(elem, { + attributes: true, + attributeFilter: ['style', 'tabindex'], + }); + } + + this.wmks.register( + WMKS.CONST.Events.CONNECTION_STATE_CHANGE, + (event: any, data: any) => { + console.log('Connection State: ' + data.state); + if (data.state === WMKS.CONST.ConnectionState.CONNECTED) { + // console.log('connection state change : connected'); + this.showLoading = false; + this.showPower = false; + this.showPoweringOff = false; + this.showError = false; + this.showLock = false; + this.model.vmToolsStatus = VirtualMachineToolsStatus.toolsNotRunning; + + interval(10000) + .pipe( + startWith(0), + takeWhile( + () => + this.model.vmToolsStatus === + VirtualMachineToolsStatus.toolsNotRunning + ) + ) + .subscribe(() => { + this.checkForVmTools(this.model.id) + .pipe(take(1)) + .subscribe((val) => { + this.model.vmToolsStatus = val as VirtualMachineToolsStatus; + }); + }); + } else if (data.state === WMKS.CONST.ConnectionState.CONNECTING) { + // console.log('connection state change : connecting'); + this.showLoading = true; + this.showPower = false; + this.showPoweringOff = false; + this.showError = false; + this.showLock = false; + } else if (data.state === WMKS.CONST.ConnectionState.DISCONNECTED) { + // console.log('connection state change : disconnected'); + // we should not connect if we sent poweroff + if (this.showPower === false) { + this.showLoading = true; + } + + // When this.showPoweringOff is false, the disconnect came from the VM shutting itself down + if (this.showPoweringOff === false) { + // This is weird but there is no easy way to reload the wmks after it destroys itself when + // a VM shuts itself down. Wait a few seconds and then reload the page which will trigger + // a reconnect to the already shutdown VM + setTimeout(() => { + console.log('attempt reload'); + window.location.reload(); + }, 3000); + } + this.showPoweringOff = false; + this.showError = false; + this.showLock = false; + console.log('disconnect complete'); + } + } + ); + + // Register the COPY event from the VM. + this.wmks.register(WMKS.CONST.Events.COPY, (event: any, data: string) => { + if (data) { + this.vmClipBoard.next(data); + } + }); + } + + public powerOn(id: string) { + this.sendPowerOn(id).subscribe( + (response) => { + // console.log(response); + if (response === 'poweron submitted') { + console.log('poweron submitted'); + } else if (response === 'already on') { + console.log('already powered on'); + } else if (response === 'poweron error') { + console.log('poweron error received'); + } + }, + () => { + console.log('error sending poweron console API'); + } + ); + } + + public powerOff(id: string) { + this.sendPowerOff(id).subscribe( + (response) => { + if (response === 'poweroff submitted') { + this.showPoweringOff = true; + // Wait before submitting the destroy to allow events from wmks to finish. + setTimeout(() => { + this.wmks.destroy(); + }, 1000); + } else if (response === 'already off') { + } else if (response === 'poweroff error') { + console.log('poweroff error received'); + } + }, + () => { + console.log('error sending poweroff to console API'); + } + ); + } + + public reBoot(id: string) { + // console.log('reboot requested'); + this.sendReboot(id).subscribe( + () => { + // console.log(response); + }, + () => { + console.log('error sending reboot to console API'); + this.model.ticket = null; + } + ); + } + + public shutdownOS(id: string) { + this.sendShutdownOS(id).subscribe( + (response) => { + console.log(response); + }, + () => { + console.log('error sending reboot to console API'); + this.model.ticket = null; + } + ); + } + + public getUploadConfig(): Observable { + return this.uploadConfig.asObservable(); + } + + public getIsos(id: string): Observable { + return this.vsphereService.getVsphereVirtualMachineIsos(id) as Observable< + IsoResult[] + >; + } + + public mountIso(id: string, iso: string) { + const data: MountVsphereIso = { iso: iso }; + return this.vsphereService.mountVsphereVirtualMachineIso(id, data); + } + + public setResolution(id: string, resolution: VmResolution) { + const data: SetVsphereVirtualMachineResolution = { + height: resolution.height, + width: resolution.width, + }; + return this.vsphereService.setVsphereVirtualMachineResolution(id, data); + } +} diff --git a/src/app/state/vsphere/vsphere.store.ts b/src/app/state/vsphere/vsphere.store.ts new file mode 100644 index 00000000..2a33f2c5 --- /dev/null +++ b/src/app/state/vsphere/vsphere.store.ts @@ -0,0 +1,25 @@ +/** + * Copyright 2021 Carnegie Mellon University. All Rights Reserved. + * Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. + */ + +import { Injectable } from '@angular/core'; +import { + EntityState, + EntityStore, + StoreConfig, + ActiveState, +} from '@datorama/akita'; +import { VsphereVirtualMachine } from '../../generated/vm-api/model/vsphereVirtualMachine'; + +export interface VsphereState + extends EntityState, + ActiveState {} + +@Injectable({ providedIn: 'root' }) +@StoreConfig({ name: 'vm' }) +export class VmStore extends EntityStore { + constructor() { + super(); + } +} diff --git a/src/styles.scss b/src/styles.scss deleted file mode 100644 index d257aab6..00000000 --- a/src/styles.scss +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2021 Carnegie Mellon University. All Rights Reserved. -// Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information. - -/* You can add global styles to this file, and also import other style files */ -$mdi-font-path: '~@mdi/font/fonts'; -@import '~@mdi/font/scss/materialdesignicons'; - -/* #f4f4f4 is the Player gray background color */ -html, -body { - min-height: 100vh; - height: auto; - margin: 0; -} -body { - margin: 0; - background-color: #f4f4f4; -} - -.app-base-color { - background-color: maroon; -} - -.cdk-overlay-container { - z-index: 500 !important; -} diff --git a/src/styles/styles.scss b/src/styles/styles.scss index 95dd1238..c2f136db 100644 --- a/src/styles/styles.scss +++ b/src/styles/styles.scss @@ -28,3 +28,26 @@ box-shadow: 0 2px 4px -1px rgba(0, 0, 0, 0.2), 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12); } + +html, +body { + height: 100%; + margin: 0; +} +body { + margin: 0; +} + +.cdk-overlay-container { + z-index: 500 !important; +} + +.full-height { + height: 100%; + display: block; +} + +app-root { + display: block; + height: 100%; +} \ No newline at end of file