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