summaryrefslogtreecommitdiff
path: root/src/views/Control
diff options
context:
space:
mode:
Diffstat (limited to 'src/views/Control')
-rw-r--r--src/views/Control/FactoryReset/FactoryReset.vue117
-rw-r--r--src/views/Control/FactoryReset/FactoryResetModal.vue113
-rw-r--r--src/views/Control/FactoryReset/index.js2
-rw-r--r--src/views/Control/Kvm/Kvm.vue24
-rw-r--r--src/views/Control/Kvm/KvmConsole.vue170
-rw-r--r--src/views/Control/Kvm/index.js2
-rw-r--r--src/views/Control/ManagePowerUsage/ManagePowerUsage.vue165
-rw-r--r--src/views/Control/ManagePowerUsage/index.js2
-rw-r--r--src/views/Control/PowerRestorePolicy/PowerRestorePolicy.vue80
-rw-r--r--src/views/Control/PowerRestorePolicy/index.js2
-rw-r--r--src/views/Control/RebootBmc/RebootBmc.vue83
-rw-r--r--src/views/Control/RebootBmc/index.js2
-rw-r--r--src/views/Control/SerialOverLan/SerialOverLan.vue24
-rw-r--r--src/views/Control/SerialOverLan/SerialOverLanConsole.vue148
-rw-r--r--src/views/Control/SerialOverLan/index.js2
-rw-r--r--src/views/Control/ServerLed/ServerLed.vue71
-rw-r--r--src/views/Control/ServerLed/index.js2
-rw-r--r--src/views/Control/ServerPowerOperations/BootSettings.vue140
-rw-r--r--src/views/Control/ServerPowerOperations/ServerPowerOperations.vue260
-rw-r--r--src/views/Control/ServerPowerOperations/index.js2
-rw-r--r--src/views/Control/VirtualMedia/ModalConfigureConnection.vue145
-rw-r--r--src/views/Control/VirtualMedia/VirtualMedia.vue221
-rw-r--r--src/views/Control/VirtualMedia/index.js2
23 files changed, 0 insertions, 1779 deletions
diff --git a/src/views/Control/FactoryReset/FactoryReset.vue b/src/views/Control/FactoryReset/FactoryReset.vue
deleted file mode 100644
index 897348fc..00000000
--- a/src/views/Control/FactoryReset/FactoryReset.vue
+++ /dev/null
@@ -1,117 +0,0 @@
-<template>
- <b-container fluid="xl">
- <page-title :description="$t('pageFactoryReset.description')" />
-
- <!-- Reset Form -->
- <b-form id="factory-reset" @submit.prevent="onResetSubmit">
- <b-row>
- <b-col md="8">
- <b-form-group :label="$t('pageFactoryReset.form.resetOptionsLabel')">
- <b-form-radio-group
- id="factory-reset-options"
- v-model="resetOption"
- stacked
- >
- <b-form-radio
- class="mb-1"
- value="resetBios"
- aria-describedby="reset-bios"
- data-test-id="factoryReset-radio-resetBios"
- >
- {{ $t('pageFactoryReset.form.resetBiosOptionLabel') }}
- </b-form-radio>
- <b-form-text id="reset-bios" class="ml-4 mb-3">
- {{ $t('pageFactoryReset.form.resetBiosOptionHelperText') }}
- </b-form-text>
-
- <b-form-radio
- class="mb-1"
- value="resetToDefaults"
- aria-describedby="reset-to-defaults"
- data-test-id="factoryReset-radio-resetToDefaults"
- >
- {{ $t('pageFactoryReset.form.resetToDefaultsOptionLabel') }}
- </b-form-radio>
- <b-form-text id="reset-to-defaults" class="ml-4 mb-3">
- {{
- $t('pageFactoryReset.form.resetToDefaultsOptionHelperText')
- }}
- </b-form-text>
- </b-form-radio-group>
- </b-form-group>
- <b-button
- type="submit"
- variant="primary"
- data-test-id="factoryReset-button-submit"
- >
- {{ $t('global.action.reset') }}
- </b-button>
- </b-col>
- </b-row>
- </b-form>
-
- <!-- Modals -->
- <modal-reset :reset-type="resetOption" @okConfirm="onOkConfirm" />
- </b-container>
-</template>
-
-<script>
-import PageTitle from '@/components/Global/PageTitle';
-import BVToastMixin from '@/components/Mixins/BVToastMixin';
-import LoadingBarMixin from '@/components/Mixins/LoadingBarMixin';
-import ModalReset from './FactoryResetModal';
-
-export default {
- name: 'FactoryReset',
- components: { PageTitle, ModalReset },
- mixins: [LoadingBarMixin, BVToastMixin],
- data() {
- return {
- resetOption: 'resetBios',
- };
- },
- created() {
- this.hideLoader();
- },
- methods: {
- onResetSubmit() {
- this.$bvModal.show('modal-reset');
- },
- onOkConfirm() {
- if (this.resetOption == 'resetBios') {
- this.onResetBiosConfirm();
- } else {
- this.onResetToDefaultsConfirm();
- }
- },
- onResetBiosConfirm() {
- this.$store
- .dispatch('factoryReset/resetBios')
- .then((title) => {
- this.successToast('', {
- title,
- });
- })
- .catch(({ message }) => {
- this.errorToast('', {
- title: message,
- });
- });
- },
- onResetToDefaultsConfirm() {
- this.$store
- .dispatch('factoryReset/resetToDefaults')
- .then((title) => {
- this.successToast('', {
- title,
- });
- })
- .catch(({ message }) => {
- this.errorToast('', {
- title: message,
- });
- });
- },
- },
-};
-</script>
diff --git a/src/views/Control/FactoryReset/FactoryResetModal.vue b/src/views/Control/FactoryReset/FactoryResetModal.vue
deleted file mode 100644
index 170bf284..00000000
--- a/src/views/Control/FactoryReset/FactoryResetModal.vue
+++ /dev/null
@@ -1,113 +0,0 @@
-<template>
- <b-modal
- id="modal-reset"
- ref="modal"
- :title="$t(`pageFactoryReset.modal.${resetType}Title`)"
- title-tag="h2"
- @hidden="resetConfirm"
- >
- <p class="mb-2">
- <strong>{{ $t(`pageFactoryReset.modal.${resetType}Header`) }}</strong>
- </p>
- <ul class="pl-3 mb-4">
- <li
- v-for="(item, index) in $t(
- `pageFactoryReset.modal.${resetType}SettingsList`
- )"
- :key="index"
- class="mt-1 mb-1"
- >
- {{ $t(item) }}
- </li>
- </ul>
-
- <!-- Warning message -->
- <template v-if="!isServerOff">
- <p class="d-flex mb-2">
- <status-icon status="danger" />
- <span id="reset-to-default-warning" class="ml-1">
- {{ $t(`pageFactoryReset.modal.resetWarningMessage`) }}
- </span>
- </p>
- <b-form-checkbox
- v-model="confirm"
- aria-describedby="reset-to-default-warning"
- @input="$v.confirm.$touch()"
- >
- {{ $t(`pageFactoryReset.modal.resetWarningCheckLabel`) }}
- </b-form-checkbox>
- <b-form-invalid-feedback
- role="alert"
- :state="getValidationState($v.confirm)"
- >
- {{ $t('global.form.fieldRequired') }}
- </b-form-invalid-feedback>
- </template>
-
- <template #modal-footer="{ cancel }">
- <b-button
- variant="secondary"
- data-test-id="factoryReset-button-cancel"
- @click="cancel()"
- >
- {{ $t('global.action.cancel') }}
- </b-button>
- <b-button
- type="sumbit"
- variant="primary"
- data-test-id="factoryReset-button-confirm"
- @click="handleConfirm"
- >
- {{ $t(`pageFactoryReset.modal.${resetType}SubmitText`) }}
- </b-button>
- </template>
- </b-modal>
-</template>
-<script>
-import StatusIcon from '@/components/Global/StatusIcon';
-import VuelidateMixin from '@/components/Mixins/VuelidateMixin';
-
-export default {
- components: { StatusIcon },
- mixins: [VuelidateMixin],
- props: {
- resetType: {
- type: String,
- default: null,
- },
- },
- data() {
- return {
- confirm: false,
- };
- },
- computed: {
- serverStatus() {
- return this.$store.getters['global/serverStatus'];
- },
- isServerOff() {
- return this.serverStatus === 'off' ? true : false;
- },
- },
- validations: {
- confirm: {
- mustBeTrue: function (value) {
- return this.isServerOff || value === true;
- },
- },
- },
- methods: {
- handleConfirm() {
- this.$v.$touch();
- if (this.$v.$invalid) return;
- this.$emit('okConfirm');
- this.$nextTick(() => this.$refs.modal.hide());
- this.resetConfirm();
- },
- resetConfirm() {
- this.confirm = false;
- this.$v.$reset();
- },
- },
-};
-</script>
diff --git a/src/views/Control/FactoryReset/index.js b/src/views/Control/FactoryReset/index.js
deleted file mode 100644
index eae747e0..00000000
--- a/src/views/Control/FactoryReset/index.js
+++ /dev/null
@@ -1,2 +0,0 @@
-import FactoryReset from './FactoryReset.vue';
-export default FactoryReset;
diff --git a/src/views/Control/Kvm/Kvm.vue b/src/views/Control/Kvm/Kvm.vue
deleted file mode 100644
index 1a41baaf..00000000
--- a/src/views/Control/Kvm/Kvm.vue
+++ /dev/null
@@ -1,24 +0,0 @@
-<template>
- <b-container fluid="xl">
- <page-title />
- <div class="terminal-container">
- <kvm-console :is-full-window="false" />
- </div>
- </b-container>
-</template>
-
-<script>
-import PageTitle from '@/components/Global/PageTitle';
-import KvmConsole from './KvmConsole';
-
-export default {
- name: 'Kvm',
- components: { PageTitle, KvmConsole },
-};
-</script>
-
-<style scoped>
-.terminal-container {
- width: 100%;
-}
-</style>
diff --git a/src/views/Control/Kvm/KvmConsole.vue b/src/views/Control/Kvm/KvmConsole.vue
deleted file mode 100644
index c028a9fc..00000000
--- a/src/views/Control/Kvm/KvmConsole.vue
+++ /dev/null
@@ -1,170 +0,0 @@
-<template>
- <div :class="marginClass">
- <div ref="toolbar" class="kvm-toolbar">
- <b-row class="d-flex">
- <b-col class="d-flex flex-column justify-content-end" cols="4">
- <dl class="mb-2" sm="2" md="2">
- <dt class="d-inline font-weight-bold mr-1">
- {{ $t('pageKvm.status') }}:
- </dt>
- <dd class="d-inline">
- <status-icon :status="serverStatusIcon" />
- <span class="d-none d-md-inline"> {{ serverStatus }}</span>
- </dd>
- </dl>
- </b-col>
-
- <b-col class="d-flex justify-content-end pr-1">
- <b-button
- v-if="isConnected"
- variant="link"
- type="button"
- @click="sendCtrlAltDel"
- >
- <icon-arrow-down />
- {{ $t('pageKvm.buttonCtrlAltDelete') }}
- </b-button>
- <b-button
- v-if="!isFullWindow"
- variant="link"
- type="button"
- @click="openConsoleWindow()"
- >
- <icon-launch />
- {{ $t('pageKvm.openNewTab') }}
- </b-button>
- </b-col>
- </b-row>
- </div>
- <div id="terminal-kvm" ref="panel" :class="terminalClass"></div>
- </div>
-</template>
-
-<script>
-import RFB from '@novnc/novnc/core/rfb';
-import StatusIcon from '@/components/Global/StatusIcon';
-import IconLaunch from '@carbon/icons-vue/es/launch/20';
-import IconArrowDown from '@carbon/icons-vue/es/arrow--down/16';
-import { throttle } from 'lodash';
-
-const Connecting = 0;
-const Connected = 1;
-const Disconnected = 2;
-
-export default {
- name: 'KvmConsole',
- components: { StatusIcon, IconLaunch, IconArrowDown },
- props: {
- isFullWindow: {
- type: Boolean,
- default: true,
- },
- },
- data() {
- return {
- rfb: null,
- isConnected: false,
- terminalClass: this.isFullWindow ? 'full-window' : '',
- marginClass: this.isFullWindow ? 'margin-left-full-window' : '',
- status: Connecting,
- convasRef: null,
- resizeKvmWindow: null,
- };
- },
- computed: {
- serverStatusIcon() {
- if (this.status === Connected) {
- return 'success';
- } else if (this.status === Disconnected) {
- return 'danger';
- }
- return 'secondary';
- },
- serverStatus() {
- if (this.status === Connected) {
- return this.$t('pageKvm.connected');
- } else if (this.status === Disconnected) {
- return this.$t('pageKvm.disconnected');
- }
- return this.$t('pageKvm.connecting');
- },
- },
- mounted() {
- this.openTerminal();
- },
- beforeDestroy() {
- window.removeEventListener('resize', this.resizeKvmWindow);
- this.closeTerminal();
- },
- methods: {
- sendCtrlAltDel() {
- this.rfb.sendCtrlAltDel();
- },
- closeTerminal() {
- this.rfb.disconnect();
- this.rfb = null;
- },
- openTerminal() {
- const token = this.$store.getters['authentication/token'];
- this.rfb = new RFB(
- this.$refs.panel,
- `wss://${window.location.host}/kvm/0`,
- { wsProtocols: [token] }
- );
-
- this.rfb.scaleViewport = true;
- this.rfb.clipViewport = true;
- const that = this;
-
- this.resizeKvmWindow = throttle(() => {
- setTimeout(that.setWidthToolbar, 0);
- }, 1000);
- window.addEventListener('resize', this.resizeKvmWindow);
-
- this.rfb.addEventListener('connect', () => {
- that.isConnected = true;
- that.status = Connected;
- that.setWidthToolbar();
- });
-
- this.rfb.addEventListener('disconnect', () => {
- this.isConnected = false;
- that.status = Disconnected;
- });
- },
- setWidthToolbar() {
- if (
- this.$refs.panel.children &&
- this.$refs.panel.children.length > 0 &&
- this.$refs.panel.children[0].children.length > 0
- ) {
- this.$refs.toolbar.style.width =
- this.$refs.panel.children[0].children[0].clientWidth - 10 + 'px';
- }
- },
- openConsoleWindow() {
- window.open(
- '#/console/kvm',
- '_blank',
- 'directories=no,titlebar=no,toolbar=no,location=no,status=no,menubar=no,scrollbars=no,resizable=yes,width=700,height=550'
- );
- },
- },
-};
-</script>
-
-<style scoped lang="scss">
-.button-ctrl-alt-delete {
- float: right;
-}
-
-.kvm-status {
- padding-top: $spacer / 2;
- padding-left: $spacer / 4;
- display: inline-block;
-}
-
-.margin-left-full-window {
- margin-left: 5px;
-}
-</style>
diff --git a/src/views/Control/Kvm/index.js b/src/views/Control/Kvm/index.js
deleted file mode 100644
index ac4f9667..00000000
--- a/src/views/Control/Kvm/index.js
+++ /dev/null
@@ -1,2 +0,0 @@
-import Kvm from './Kvm.vue';
-export default Kvm;
diff --git a/src/views/Control/ManagePowerUsage/ManagePowerUsage.vue b/src/views/Control/ManagePowerUsage/ManagePowerUsage.vue
deleted file mode 100644
index 38dbf0b8..00000000
--- a/src/views/Control/ManagePowerUsage/ManagePowerUsage.vue
+++ /dev/null
@@ -1,165 +0,0 @@
-<template>
- <b-container fluid="xl">
- <page-title :description="$t('pageManagePowerUsage.description')" />
-
- <b-row>
- <b-col sm="8" md="6" xl="12">
- <dl>
- <dt>{{ $t('pageManagePowerUsage.powerConsumption') }}</dt>
- <dd>
- {{
- powerConsumptionValue
- ? `${powerConsumptionValue} W`
- : $t('global.status.notAvailable')
- }}
- </dd>
- </dl>
- </b-col>
- </b-row>
-
- <b-form @submit.prevent="submitForm">
- <b-form-group :disabled="loading">
- <b-row>
- <b-col sm="8" md="6" xl="12">
- <b-form-group
- :label="$t('pageManagePowerUsage.powerCapSettingLabel')"
- >
- <b-form-checkbox
- v-model="isPowerCapFieldEnabled"
- data-test-id="managePowerUsage-checkbox-togglePowerCapField"
- name="power-cap-setting"
- >
- {{ $t('pageManagePowerUsage.powerCapSettingData') }}
- </b-form-checkbox>
- </b-form-group>
- </b-col>
- </b-row>
-
- <b-row>
- <b-col sm="8" md="6" xl="3">
- <b-form-group
- id="input-group-1"
- :label="$t('pageManagePowerUsage.powerCapLabel')"
- label-for="input-1"
- >
- <b-form-text id="power-help-text">
- {{
- $t('pageManagePowerUsage.powerCapLabelTextInfo', {
- min: 1,
- max: 10000,
- })
- }}
- </b-form-text>
-
- <b-form-input
- id="input-1"
- v-model.number="powerCapValue"
- :disabled="!isPowerCapFieldEnabled"
- data-test-id="managePowerUsage-input-powerCapValue"
- type="number"
- aria-describedby="power-help-text"
- :state="getValidationState($v.powerCapValue)"
- ></b-form-input>
-
- <b-form-invalid-feedback id="input-live-feedback" role="alert">
- <template v-if="!$v.powerCapValue.required">
- {{ $t('global.form.fieldRequired') }}
- </template>
- <template v-else-if="!$v.powerCapValue.between">
- {{ $t('global.form.invalidValue') }}
- </template>
- </b-form-invalid-feedback>
- </b-form-group>
- </b-col>
- </b-row>
-
- <b-button
- variant="primary"
- type="submit"
- data-test-id="managePowerUsage-button-savePowerCapValue"
- >
- {{ $t('global.action.save') }}
- </b-button>
- </b-form-group>
- </b-form>
- </b-container>
-</template>
-
-<script>
-import PageTitle from '@/components/Global/PageTitle';
-import LoadingBarMixin, { loading } from '@/components/Mixins/LoadingBarMixin';
-import VuelidateMixin from '@/components/Mixins/VuelidateMixin.js';
-import BVToastMixin from '@/components/Mixins/BVToastMixin';
-import { requiredIf, between } from 'vuelidate/lib/validators';
-import { mapGetters } from 'vuex';
-
-export default {
- name: 'ManagePowerUsage',
- components: { PageTitle },
- mixins: [VuelidateMixin, BVToastMixin, LoadingBarMixin],
- beforeRouteLeave(to, from, next) {
- this.hideLoader();
- next();
- },
- data() {
- return {
- loading,
- };
- },
- computed: {
- ...mapGetters({
- powerConsumptionValue: 'powerControl/powerConsumptionValue',
- }),
-
- /**
- Computed property isPowerCapFieldEnabled is used to enable or disable the input field.
- The input field is enabled when the powercapValue property is not null.
- **/
- isPowerCapFieldEnabled: {
- get() {
- return this.powerCapValue !== null;
- },
- set(value) {
- let newValue = value ? '' : null;
- this.$v.$reset();
- this.$store.dispatch('powerControl/setPowerCapUpdatedValue', newValue);
- },
- },
- powerCapValue: {
- get() {
- return this.$store.getters['powerControl/powerCapValue'];
- },
- set(value) {
- this.$v.$touch();
- this.$store.dispatch('powerControl/setPowerCapUpdatedValue', value);
- },
- },
- },
- created() {
- this.startLoader();
- this.$store
- .dispatch('powerControl/getPowerControl')
- .finally(() => this.endLoader());
- },
- validations: {
- powerCapValue: {
- between: between(1, 10000),
- required: requiredIf(function () {
- return this.isPowerCapFieldEnabled;
- }),
- },
- },
- methods: {
- submitForm() {
- this.$v.$touch();
- if (this.$v.$invalid) return;
- this.startLoader();
- this.$store
- .dispatch('powerControl/setPowerControl', this.powerCapValue)
- .then((message) => this.successToast(message))
- .catch(({ message }) => this.errorToast(message))
- .finally(() => this.endLoader());
- },
- },
-};
-</script>
diff --git a/src/views/Control/ManagePowerUsage/index.js b/src/views/Control/ManagePowerUsage/index.js
deleted file mode 100644
index f3e95ac1..00000000
--- a/src/views/Control/ManagePowerUsage/index.js
+++ /dev/null
@@ -1,2 +0,0 @@
-import ManagePowerUsage from './ManagePowerUsage.vue';
-export default ManagePowerUsage;
diff --git a/src/views/Control/PowerRestorePolicy/PowerRestorePolicy.vue b/src/views/Control/PowerRestorePolicy/PowerRestorePolicy.vue
deleted file mode 100644
index 8589aed3..00000000
--- a/src/views/Control/PowerRestorePolicy/PowerRestorePolicy.vue
+++ /dev/null
@@ -1,80 +0,0 @@
-<template>
- <b-container fluid="xl">
- <page-title :description="$t('pagePowerRestorePolicy.description')" />
-
- <b-row>
- <b-col sm="8" md="6" xl="12">
- <b-form-group :label="$t('pagePowerRestorePolicy.powerPoliciesLabel')">
- <b-form-radio
- v-for="policy in powerRestorePolicies"
- :key="policy.state"
- v-model="currentPowerRestorePolicy"
- :value="policy.state"
- name="power-restore-policy"
- >
- {{ policy.desc }}
- </b-form-radio>
- </b-form-group>
- </b-col>
- </b-row>
-
- <b-button variant="primary" type="submit" @click="submitForm">
- {{ $t('global.action.saveSettings') }}
- </b-button>
- </b-container>
-</template>
-
-<script>
-import PageTitle from '@/components/Global/PageTitle';
-import LoadingBarMixin from '@/components/Mixins/LoadingBarMixin';
-import VuelidateMixin from '@/components/Mixins/VuelidateMixin.js';
-import BVToastMixin from '@/components/Mixins/BVToastMixin';
-
-export default {
- name: 'PowerRestorePolicy',
- components: { PageTitle },
- mixins: [VuelidateMixin, BVToastMixin, LoadingBarMixin],
- beforeRouteLeave(to, from, next) {
- this.hideLoader();
- next();
- },
- data() {
- return {
- policyValue: null,
- };
- },
- computed: {
- powerRestorePolicies() {
- return this.$store.getters['powerPolicy/powerRestorePolicies'];
- },
- currentPowerRestorePolicy: {
- get() {
- return this.$store.getters['powerPolicy/powerRestoreCurrentPolicy'];
- },
- set(policy) {
- this.policyValue = policy;
- },
- },
- },
- created() {
- this.startLoader();
- Promise.all([
- this.$store.dispatch('powerPolicy/getPowerRestorePolicies'),
- this.$store.dispatch('powerPolicy/getPowerRestoreCurrentPolicy'),
- ]).finally(() => this.endLoader());
- },
- methods: {
- submitForm() {
- this.startLoader();
- this.$store
- .dispatch(
- 'powerPolicy/setPowerRestorePolicy',
- this.policyValue || this.currentPowerRestorePolicy
- )
- .then((message) => this.successToast(message))
- .catch(({ message }) => this.errorToast(message))
- .finally(() => this.endLoader());
- },
- },
-};
-</script>
diff --git a/src/views/Control/PowerRestorePolicy/index.js b/src/views/Control/PowerRestorePolicy/index.js
deleted file mode 100644
index fab0d477..00000000
--- a/src/views/Control/PowerRestorePolicy/index.js
+++ /dev/null
@@ -1,2 +0,0 @@
-import PowerRestorePolicy from './PowerRestorePolicy.vue';
-export default PowerRestorePolicy;
diff --git a/src/views/Control/RebootBmc/RebootBmc.vue b/src/views/Control/RebootBmc/RebootBmc.vue
deleted file mode 100644
index 900619cd..00000000
--- a/src/views/Control/RebootBmc/RebootBmc.vue
+++ /dev/null
@@ -1,83 +0,0 @@
-<template>
- <b-container fluid="xl">
- <page-title />
- <b-row>
- <b-col md="8" lg="8" xl="6">
- <page-section>
- <b-row>
- <b-col>
- <dl>
- <dt>
- {{ $t('pageRebootBmc.lastReboot') }}
- </dt>
- <dd v-if="lastBmcRebootTime">
- {{ lastBmcRebootTime | formatDate }}
- {{ lastBmcRebootTime | formatTime }}
- </dd>
- <dd v-else>--</dd>
- </dl>
- </b-col>
- </b-row>
- {{ $t('pageRebootBmc.rebootInformation') }}
- <b-button
- variant="primary"
- class="d-block mt-5"
- data-test-id="rebootBmc-button-reboot"
- @click="onClick"
- >
- {{ $t('pageRebootBmc.rebootBmc') }}
- </b-button>
- </page-section>
- </b-col>
- </b-row>
- </b-container>
-</template>
-
-<script>
-import PageTitle from '@/components/Global/PageTitle';
-import PageSection from '@/components/Global/PageSection';
-import BVToastMixin from '@/components/Mixins/BVToastMixin';
-import LoadingBarMixin from '@/components/Mixins/LoadingBarMixin';
-
-export default {
- name: 'RebootBmc',
- components: { PageTitle, PageSection },
- mixins: [BVToastMixin, LoadingBarMixin],
- beforeRouteLeave(to, from, next) {
- this.hideLoader();
- next();
- },
- computed: {
- lastBmcRebootTime() {
- return this.$store.getters['controls/lastBmcRebootTime'];
- },
- },
- created() {
- this.startLoader();
- this.$store
- .dispatch('controls/getLastBmcRebootTime')
- .finally(() => this.endLoader());
- },
- methods: {
- onClick() {
- this.$bvModal
- .msgBoxConfirm(this.$t('pageRebootBmc.modal.confirmMessage'), {
- title: this.$t('pageRebootBmc.modal.confirmTitle'),
- okTitle: this.$t('global.action.confirm'),
- cancelTitle: this.$t('global.action.cancel'),
- })
- .then((confirmed) => {
- if (confirmed) this.rebootBmc();
- });
- },
- rebootBmc() {
- this.$store
- .dispatch('controls/rebootBmc')
- .then((message) => this.successToast(message))
- .catch(({ message }) => this.errorToast(message));
- },
- },
-};
-</script>
-
-<style lang="scss" scoped></style>
diff --git a/src/views/Control/RebootBmc/index.js b/src/views/Control/RebootBmc/index.js
deleted file mode 100644
index ac31417e..00000000
--- a/src/views/Control/RebootBmc/index.js
+++ /dev/null
@@ -1,2 +0,0 @@
-import RebootBmc from './RebootBmc.vue';
-export default RebootBmc;
diff --git a/src/views/Control/SerialOverLan/SerialOverLan.vue b/src/views/Control/SerialOverLan/SerialOverLan.vue
deleted file mode 100644
index 48a68345..00000000
--- a/src/views/Control/SerialOverLan/SerialOverLan.vue
+++ /dev/null
@@ -1,24 +0,0 @@
-<template>
- <b-container fluid="xl">
- <page-title class="mb-4" :description="$t('pageSerialOverLan.subTitle')" />
-
- <page-section class="mb-0">
- <serial-over-lan-console :is-full-window="false" />
- </page-section>
- </b-container>
-</template>
-
-<script>
-import PageTitle from '@/components/Global/PageTitle';
-import PageSection from '@/components/Global/PageSection';
-import SerialOverLanConsole from './SerialOverLanConsole';
-
-export default {
- name: 'SerialOverLan',
- components: {
- PageSection,
- PageTitle,
- SerialOverLanConsole,
- },
-};
-</script>
diff --git a/src/views/Control/SerialOverLan/SerialOverLanConsole.vue b/src/views/Control/SerialOverLan/SerialOverLanConsole.vue
deleted file mode 100644
index 0bda43db..00000000
--- a/src/views/Control/SerialOverLan/SerialOverLanConsole.vue
+++ /dev/null
@@ -1,148 +0,0 @@
-<template>
- <div :class="isFullWindow ? 'full-window-container' : 'terminal-container'">
- <b-row class="d-flex">
- <b-col class="d-flex flex-column justify-content-end">
- <dl class="mb-2" sm="6" md="6">
- <dt class="d-inline font-weight-bold mr-1">
- {{ $t('pageSerialOverLan.status') }}:
- </dt>
- <dd class="d-inline">
- <status-icon :status="serverStatusIcon" /> {{ connectionStatus }}
- </dd>
- </dl>
- </b-col>
-
- <b-col v-if="!isFullWindow" class="d-flex justify-content-end">
- <b-button variant="link" type="button" @click="openConsoleWindow()">
- <icon-launch />
- {{ $t('pageSerialOverLan.openNewTab') }}
- </b-button>
- </b-col>
- </b-row>
- <div id="terminal" ref="panel"></div>
- </div>
-</template>
-
-<script>
-import { AttachAddon } from 'xterm-addon-attach';
-import { FitAddon } from 'xterm-addon-fit';
-import { Terminal } from 'xterm';
-import { throttle } from 'lodash';
-import IconLaunch from '@carbon/icons-vue/es/launch/20';
-import StatusIcon from '@/components/Global/StatusIcon';
-
-export default {
- name: 'SerialOverLanConsole',
- components: {
- IconLaunch,
- StatusIcon,
- },
- props: {
- isFullWindow: {
- type: Boolean,
- default: true,
- },
- },
- data() {
- return {
- resizeConsoleWindow: null,
- };
- },
- computed: {
- serverStatus() {
- return this.$store.getters['global/serverStatus'];
- },
- serverStatusIcon() {
- return this.serverStatus === 'on' ? 'success' : 'danger';
- },
- connectionStatus() {
- return this.serverStatus === 'on'
- ? this.$t('pageSerialOverLan.connected')
- : this.$t('pageSerialOverLan.disconnected');
- },
- },
- created() {
- this.$store.dispatch('global/getServerStatus');
- },
- mounted() {
- this.openTerminal();
- },
- beforeDestroy() {
- window.removeEventListener('resize', this.resizeConsoleWindow);
- },
- methods: {
- openTerminal() {
- const token = this.$store.getters['authentication/token'];
-
- const ws = new WebSocket(`wss://${window.location.host}/console0`, [
- token,
- ]);
-
- // Refer https://github.com/xtermjs/xterm.js/ for xterm implementation and addons.
-
- const term = new Terminal({
- fontSize: 15,
- fontFamily:
- 'SFMono-Regular, Menlo, Monaco, Consolas, Liberation Mono, Courier New, monospace',
- });
-
- const attachAddon = new AttachAddon(ws);
- term.loadAddon(attachAddon);
-
- const fitAddon = new FitAddon();
- term.loadAddon(fitAddon);
-
- const SOL_THEME = {
- background: '#19273c',
- cursor: 'rgba(83, 146, 255, .5)',
- scrollbar: 'rgba(83, 146, 255, .5)',
- };
- term.setOption('theme', SOL_THEME);
-
- term.open(this.$refs.panel);
- fitAddon.fit();
-
- this.resizeConsoleWindow = throttle(() => {
- fitAddon.fit();
- }, 1000);
- window.addEventListener('resize', this.resizeConsoleWindow);
-
- try {
- ws.onopen = function () {
- console.log('websocket console0/ opened');
- };
- ws.onclose = function (event) {
- console.log(
- 'websocket console0/ closed. code: ' +
- event.code +
- ' reason: ' +
- event.reason
- );
- };
- } catch (error) {
- console.log(error);
- }
- },
- openConsoleWindow() {
- window.open(
- '#/console/serial-over-lan-console',
- '_blank',
- 'directories=no,titlebar=no,toolbar=no,location=no,status=no,menubar=no,scrollbars=no,resizable=yes,width=600,height=550'
- );
- },
- },
-};
-</script>
-
-<style lang="scss" scoped>
-@import '~xterm/css/xterm.css';
-
-#terminal {
- overflow: auto;
-}
-
-.full-window-container {
- width: 97%;
- margin: 1.5%;
-}
-</style>
diff --git a/src/views/Control/SerialOverLan/index.js b/src/views/Control/SerialOverLan/index.js
deleted file mode 100644
index 7c8bc7c0..00000000
--- a/src/views/Control/SerialOverLan/index.js
+++ /dev/null
@@ -1,2 +0,0 @@
-import SerialOverLan from './SerialOverLan.vue';
-export default SerialOverLan;
diff --git a/src/views/Control/ServerLed/ServerLed.vue b/src/views/Control/ServerLed/ServerLed.vue
deleted file mode 100644
index 72726bab..00000000
--- a/src/views/Control/ServerLed/ServerLed.vue
+++ /dev/null
@@ -1,71 +0,0 @@
-<template>
- <b-container fluid="xl">
- <page-title />
- <b-row>
- <b-col md="12">
- <page-section :section-title="$t('pageServerLed.serverLedTitle')">
- <b-form-group :label="$t('pageServerLed.serverLedSubTitle')">
- <b-form-checkbox
- v-model="indicatorLedActiveState"
- data-test-id="serverLed-checkbox-switchIndicatorLed"
- name="check-button"
- switch
- @change="changeLedValue"
- >
- <span v-if="indicatorLedActiveState">
- {{ $t('global.status.on') }}
- </span>
- <span v-else>
- {{ $t('global.status.off') }}
- </span>
- </b-form-checkbox>
- </b-form-group>
- </page-section>
- </b-col>
- </b-row>
- </b-container>
-</template>
-
-<script>
-import PageTitle from '@/components/Global/PageTitle';
-import PageSection from '@/components/Global/PageSection';
-import BVToastMixin from '@/components/Mixins/BVToastMixin';
-import LoadingBarMixin from '@/components/Mixins/LoadingBarMixin';
-
-export default {
- name: 'ServerLed',
- components: { PageTitle, PageSection },
- mixins: [LoadingBarMixin, BVToastMixin],
- beforeRouteLeave(to, from, next) {
- this.hideLoader();
- next();
- },
- computed: {
- indicatorLedActiveState: {
- get() {
- return this.$store.getters['serverLed/getIndicatorLedActiveState'];
- },
- set(newValue) {
- return newValue;
- },
- },
- },
- created() {
- this.startLoader();
- this.$store
- .dispatch('serverLed/getIndicatorLedActiveState')
- .finally(() => this.endLoader());
- },
- methods: {
- changeLedValue(indicatorLedActiveState) {
- this.$store
- .dispatch(
- 'serverLed/saveIndicatorLedActiveState',
- indicatorLedActiveState
- )
- .then((message) => this.successToast(message))
- .catch(({ message }) => this.errorToast(message));
- },
- },
-};
-</script>
diff --git a/src/views/Control/ServerLed/index.js b/src/views/Control/ServerLed/index.js
deleted file mode 100644
index 1926dae8..00000000
--- a/src/views/Control/ServerLed/index.js
+++ /dev/null
@@ -1,2 +0,0 @@
-import ServerLed from './ServerLed.vue';
-export default ServerLed;
diff --git a/src/views/Control/ServerPowerOperations/BootSettings.vue b/src/views/Control/ServerPowerOperations/BootSettings.vue
deleted file mode 100644
index efd8d347..00000000
--- a/src/views/Control/ServerPowerOperations/BootSettings.vue
+++ /dev/null
@@ -1,140 +0,0 @@
-<template>
- <div class="form-background p-3">
- <b-form novalidate @submit.prevent="handleSubmit">
- <b-form-group
- :label="
- $t('pageServerPowerOperations.bootSettings.bootSettingsOverride')
- "
- label-for="boot-option"
- class="mb-3"
- >
- <b-form-select
- id="boot-option"
- v-model="form.bootOption"
- :disabled="bootSourceOptions.length === 0"
- :options="bootSourceOptions"
- @change="onChangeSelect"
- >
- </b-form-select>
- </b-form-group>
- <b-form-checkbox
- v-model="form.oneTimeBoot"
- class="mb-4"
- :disabled="form.bootOption === 'None'"
- @change="$v.form.oneTimeBoot.$touch()"
- >
- {{ $t('pageServerPowerOperations.bootSettings.enableOneTimeBoot') }}
- </b-form-checkbox>
- <b-form-group
- :label="$t('pageServerPowerOperations.bootSettings.tpmRequiredPolicy')"
- >
- <b-form-text id="tpm-required-policy-help-block">
- {{
- $t('pageServerPowerOperations.bootSettings.tpmRequiredPolicyHelper')
- }}
- </b-form-text>
- <b-form-checkbox
- id="tpm-required-policy"
- v-model="form.tpmPolicyOn"
- aria-describedby="tpm-required-policy-help-block"
- @change="$v.form.tpmPolicyOn.$touch()"
- >
- {{ $t('global.status.enabled') }}
- </b-form-checkbox>
- </b-form-group>
- <b-button variant="primary" type="submit" class="mb-3">
- {{ $t('global.action.save') }}
- </b-button>
- </b-form>
- </div>
-</template>
-
-<script>
-import { mapState } from 'vuex';
-import BVToastMixin from '@/components/Mixins/BVToastMixin';
-import LoadingBarMixin from '@/components/Mixins/LoadingBarMixin';
-
-export default {
- name: 'BootSettings',
- mixins: [BVToastMixin, LoadingBarMixin],
- data() {
- return {
- form: {
- bootOption: this.$store.getters['serverBootSettings/bootSource'],
- oneTimeBoot: this.$store.getters['serverBootSettings/overrideEnabled'],
- tpmPolicyOn: this.$store.getters['serverBootSettings/tpmEnabled'],
- },
- };
- },
- computed: {
- ...mapState('serverBootSettings', [
- 'bootSourceOptions',
- 'bootSource',
- 'overrideEnabled',
- 'tpmEnabled',
- ]),
- },
- watch: {
- bootSource: function (value) {
- this.form.bootOption = value;
- },
- overrideEnabled: function (value) {
- this.form.oneTimeBoot = value;
- },
- tpmEnabled: function (value) {
- this.form.tpmPolicyOn = value;
- },
- },
- validations: {
- // Empty validations to leverage vuelidate form states
- // to check for changed values
- form: {
- bootOption: {},
- oneTimeBoot: {},
- tpmPolicyOn: {},
- },
- },
- created() {
- this.$store
- .dispatch('serverBootSettings/getTpmPolicy')
- .finally(() =>
- this.$root.$emit('server-power-operations-boot-settings-complete')
- );
- },
- methods: {
- handleSubmit() {
- this.startLoader();
- const bootSettingsChanged =
- this.$v.form.bootOption.$dirty || this.$v.form.oneTimeBoot.$dirty;
- const tpmPolicyChanged = this.$v.form.tpmPolicyOn.$dirty;
- let settings;
- let bootSource = null;
- let overrideEnabled = null;
- let tpmEnabled = null;
-
- if (bootSettingsChanged) {
- // If bootSource or overrideEnabled changed get
- // both current values to send with request
- bootSource = this.form.bootOption;
- overrideEnabled = this.form.oneTimeBoot;
- }
- if (tpmPolicyChanged) tpmEnabled = this.form.tpmPolicyOn;
- settings = { bootSource, overrideEnabled, tpmEnabled };
-
- this.$store
- .dispatch('serverBootSettings/saveSettings', settings)
- .then((message) => this.successToast(message))
- .catch(({ message }) => this.errorToast(message))
- .finally(() => {
- this.$v.form.$reset();
- this.endLoader();
- });
- },
- onChangeSelect(selectedOption) {
- this.$v.form.bootOption.$touch();
- // Disable one time boot if selected boot option is 'None'
- if (selectedOption === 'None') this.form.oneTimeBoot = false;
- },
- },
-};
-</script>
diff --git a/src/views/Control/ServerPowerOperations/ServerPowerOperations.vue b/src/views/Control/ServerPowerOperations/ServerPowerOperations.vue
deleted file mode 100644
index 9e030837..00000000
--- a/src/views/Control/ServerPowerOperations/ServerPowerOperations.vue
+++ /dev/null
@@ -1,260 +0,0 @@
-<template>
- <b-container fluid="xl">
- <page-title />
- <b-row class="mb-4">
- <b-col md="8" xl="6">
- <page-section
- :section-title="$t('pageServerPowerOperations.currentStatus')"
- >
- <b-row>
- <b-col>
- <dl>
- <dt>{{ $t('pageServerPowerOperations.serverStatus') }}</dt>
- <dd
- v-if="serverStatus === 'on'"
- data-test-id="powerServerOps-text-hostStatus"
- >
- {{ $t('global.status.on') }}
- </dd>
- <dd
- v-else-if="serverStatus === 'off'"
- data-test-id="powerServerOps-text-hostStatus"
- >
- {{ $t('global.status.off') }}
- </dd>
- <dd v-else>
- {{ $t('global.status.notAvailable') }}
- </dd>
- </dl>
- </b-col>
- </b-row>
- <b-row>
- <b-col>
- <dl>
- <dt>
- {{ $t('pageServerPowerOperations.lastPowerOperation') }}
- </dt>
- <dd
- v-if="lastPowerOperationTime"
- data-test-id="powerServerOps-text-lastPowerOp"
- >
- {{ lastPowerOperationTime | formatDate }}
- {{ lastPowerOperationTime | formatTime }}
- </dd>
- <dd v-else>--</dd>
- </dl>
- </b-col>
- </b-row>
- </page-section>
- </b-col>
- </b-row>
- <b-row>
- <b-col v-if="hasBootSourceOptions" sm="8" md="6" xl="4">
- <page-section
- :section-title="$t('pageServerPowerOperations.serverBootSettings')"
- >
- <boot-settings />
- </page-section>
- </b-col>
- <b-col sm="8" md="6" xl="7">
- <page-section
- :section-title="$t('pageServerPowerOperations.operations')"
- >
- <alert :show="oneTimeBootEnabled" variant="warning">
- {{ $t('pageServerPowerOperations.oneTimeBootWarning') }}
- </alert>
- <template v-if="isOperationInProgress">
- <alert variant="info">
- {{ $t('pageServerPowerOperations.operationInProgress') }}
- </alert>
- </template>
- <template v-else-if="serverStatus === 'off'">
- <b-button
- variant="primary"
- data-test-id="serverPowerOperations-button-powerOn"
- @click="powerOn"
- >
- {{ $t('pageServerPowerOperations.powerOn') }}
- </b-button>
- </template>
- <template v-else>
- <!-- Reboot server options -->
- <b-form novalidate class="mb-5" @submit.prevent="rebootServer">
- <b-form-group
- :label="$t('pageServerPowerOperations.rebootServer')"
- >
- <b-form-radio
- v-model="form.rebootOption"
- name="reboot-option"
- data-test-id="serverPowerOperations-radio-rebootOrderly"
- value="orderly"
- >
- {{ $t('pageServerPowerOperations.orderlyReboot') }}
- </b-form-radio>
- <b-form-radio
- v-model="form.rebootOption"
- name="reboot-option"
- data-test-id="serverPowerOperations-radio-rebootImmediate"
- value="immediate"
- >
- {{ $t('pageServerPowerOperations.immediateReboot') }}
- </b-form-radio>
- </b-form-group>
- <b-button
- variant="primary"
- type="submit"
- data-test-id="serverPowerOperations-button-reboot"
- >
- {{ $t('pageServerPowerOperations.reboot') }}
- </b-button>
- </b-form>
- <!-- Shutdown server options -->
- <b-form novalidate @submit.prevent="shutdownServer">
- <b-form-group
- :label="$t('pageServerPowerOperations.shutdownServer')"
- >
- <b-form-radio
- v-model="form.shutdownOption"
- name="shutdown-option"
- data-test-id="serverPowerOperations-radio-shutdownOrderly"
- value="orderly"
- >
- {{ $t('pageServerPowerOperations.orderlyShutdown') }}
- </b-form-radio>
- <b-form-radio
- v-model="form.shutdownOption"
- name="shutdown-option"
- data-test-id="serverPowerOperations-radio-shutdownImmediate"
- value="immediate"
- >
- {{ $t('pageServerPowerOperations.immediateShutdown') }}
- </b-form-radio>
- </b-form-group>
- <b-button
- variant="primary"
- type="submit"
- data-test-id="serverPowerOperations-button-shutDown"
- >
- {{ $t('pageServerPowerOperations.shutDown') }}
- </b-button>
- </b-form>
- </template>
- </page-section>
- </b-col>
- </b-row>
- </b-container>
-</template>
-
-<script>
-import PageTitle from '@/components/Global/PageTitle';
-import PageSection from '@/components/Global/PageSection';
-import BVToastMixin from '@/components/Mixins/BVToastMixin';
-import BootSettings from './BootSettings';
-import LoadingBarMixin from '@/components/Mixins/LoadingBarMixin';
-import Alert from '@/components/Global/Alert';
-
-export default {
- name: 'ServerPowerOperations',
- components: { PageTitle, PageSection, BootSettings, Alert },
- mixins: [BVToastMixin, LoadingBarMixin],
- beforeRouteLeave(to, from, next) {
- this.hideLoader();
- next();
- },
- data() {
- return {
- form: {
- rebootOption: 'orderly',
- shutdownOption: 'orderly',
- },
- };
- },
- computed: {
- serverStatus() {
- return this.$store.getters['global/serverStatus'];
- },
- isOperationInProgress() {
- return this.$store.getters['controls/isOperationInProgress'];
- },
- lastPowerOperationTime() {
- return this.$store.getters['controls/lastPowerOperationTime'];
- },
- oneTimeBootEnabled() {
- return this.$store.getters['serverBootSettings/overrideEnabled'];
- },
- hasBootSourceOptions() {
- let bootOptions = this.$store.getters[
- 'serverBootSettings/bootSourceOptions'
- ];
- return bootOptions.length !== 0;
- },
- },
- created() {
- this.startLoader();
- const bootSettingsPromise = new Promise((resolve) => {
- this.$root.$on('server-power-operations-boot-settings-complete', () =>
- resolve()
- );
- });
- Promise.all([
- this.$store.dispatch('serverBootSettings/getBootSettings'),
- this.$store.dispatch('controls/getLastPowerOperationTime'),
- bootSettingsPromise,
- ]).finally(() => this.endLoader());
- },
- methods: {
- powerOn() {
- this.$store.dispatch('controls/serverPowerOn');
- },
- rebootServer() {
- const modalMessage = this.$t(
- 'pageServerPowerOperations.modal.confirmRebootMessage'
- );
- const modalOptions = {
- title: this.$t('pageServerPowerOperations.modal.confirmRebootTitle'),
- okTitle: this.$t('global.action.confirm'),
- cancelTitle: this.$t('global.action.cancel'),
- };
-
- if (this.form.rebootOption === 'orderly') {
- this.$bvModal
- .msgBoxConfirm(modalMessage, modalOptions)
- .then((confirmed) => {
- if (confirmed) this.$store.dispatch('controls/serverSoftReboot');
- });
- } else if (this.form.rebootOption === 'immediate') {
- this.$bvModal
- .msgBoxConfirm(modalMessage, modalOptions)
- .then((confirmed) => {
- if (confirmed) this.$store.dispatch('controls/serverHardReboot');
- });
- }
- },
- shutdownServer() {
- const modalMessage = this.$t(
- 'pageServerPowerOperations.modal.confirmShutdownMessage'
- );
- const modalOptions = {
- title: this.$t('pageServerPowerOperations.modal.confirmShutdownTitle'),
- okTitle: this.$t('global.action.confirm'),
- cancelTitle: this.$t('global.action.cancel'),
- };
-
- if (this.form.shutdownOption === 'orderly') {
- this.$bvModal
- .msgBoxConfirm(modalMessage, modalOptions)
- .then((confirmed) => {
- if (confirmed) this.$store.dispatch('controls/serverSoftPowerOff');
- });
- }
- if (this.form.shutdownOption === 'immediate') {
- this.$bvModal
- .msgBoxConfirm(modalMessage, modalOptions)
- .then((confirmed) => {
- if (confirmed) this.$store.dispatch('controls/serverHardPowerOff');
- });
- }
- },
- },
-};
-</script>
diff --git a/src/views/Control/ServerPowerOperations/index.js b/src/views/Control/ServerPowerOperations/index.js
deleted file mode 100644
index 10430047..00000000
--- a/src/views/Control/ServerPowerOperations/index.js
+++ /dev/null
@@ -1,2 +0,0 @@
-import ServerPowerOperations from './ServerPowerOperations.vue';
-export default ServerPowerOperations;
diff --git a/src/views/Control/VirtualMedia/ModalConfigureConnection.vue b/src/views/Control/VirtualMedia/ModalConfigureConnection.vue
deleted file mode 100644
index b0bcfb2b..00000000
--- a/src/views/Control/VirtualMedia/ModalConfigureConnection.vue
+++ /dev/null
@@ -1,145 +0,0 @@
-<template>
- <b-modal
- id="configure-connection"
- ref="modal"
- @ok="onOk"
- @hidden="resetForm"
- @show="initModal"
- >
- <template #modal-title>
- {{ $t('pageVirtualMedia.modal.title') }}
- </template>
- <b-form>
- <b-form-group
- :label="$t('pageVirtualMedia.modal.serverUri')"
- label-for="serverUri"
- >
- <b-form-input
- id="serverUri"
- v-model="form.serverUri"
- type="text"
- :state="getValidationState($v.form.serverUri)"
- data-test-id="configureConnection-input-serverUri"
- @input="$v.form.serverUri.$touch()"
- />
- <b-form-invalid-feedback role="alert">
- <template v-if="!$v.form.serverUri.required">
- {{ $t('global.form.fieldRequired') }}
- </template>
- </b-form-invalid-feedback>
- </b-form-group>
- <b-form-group
- :label="$t('pageVirtualMedia.modal.username')"
- label-for="username"
- >
- <b-form-input
- id="username"
- v-model="form.username"
- type="text"
- data-test-id="configureConnection-input-username"
- />
- </b-form-group>
- <b-form-group
- :label="$t('pageVirtualMedia.modal.password')"
- label-for="password"
- >
- <b-form-input
- id="password"
- v-model="form.password"
- type="password"
- data-test-id="configureConnection-input-password"
- />
- </b-form-group>
- <b-form-group>
- <b-form-checkbox
- v-model="form.isRW"
- data-test-id="configureConnection-input-isRW"
- name="check-button"
- >
- RW
- </b-form-checkbox>
- </b-form-group>
- </b-form>
- <template #modal-ok>
- {{ $t('global.action.save') }}
- </template>
- <template #modal-cancel>
- {{ $t('global.action.cancel') }}
- </template>
- </b-modal>
-</template>
-
-<script>
-import { required } from 'vuelidate/lib/validators';
-import VuelidateMixin from '@/components/Mixins/VuelidateMixin.js';
-
-export default {
- mixins: [VuelidateMixin],
- props: {
- connection: {
- type: Object,
- default: null,
- validator: (prop) => {
- console.log(prop);
- return true;
- },
- },
- },
- data() {
- return {
- form: {
- serverUri: null,
- username: null,
- password: null,
- isRW: false,
- },
- };
- },
- watch: {
- connection: function (value) {
- if (value === null) return;
- Object.assign(this.form, value);
- },
- },
- validations() {
- return {
- form: {
- serverUri: {
- required,
- },
- },
- };
- },
- methods: {
- handleSubmit() {
- this.$v.$touch();
- if (this.$v.$invalid) return;
- let connectionData = {};
- Object.assign(connectionData, this.form);
- this.$emit('ok', connectionData);
- this.closeModal();
- },
- initModal() {
- if (this.connection) {
- Object.assign(this.form, this.connection);
- }
- },
- closeModal() {
- this.$nextTick(() => {
- this.$refs.modal.hide();
- });
- },
- resetForm() {
- this.form.serverUri = null;
- this.form.username = null;
- this.form.password = null;
- this.form.isRW = false;
- this.$v.$reset();
- },
- onOk(bvModalEvt) {
- bvModalEvt.preventDefault();
- this.handleSubmit();
- },
- },
-};
-</script>
diff --git a/src/views/Control/VirtualMedia/VirtualMedia.vue b/src/views/Control/VirtualMedia/VirtualMedia.vue
deleted file mode 100644
index 8a3d5add..00000000
--- a/src/views/Control/VirtualMedia/VirtualMedia.vue
+++ /dev/null
@@ -1,221 +0,0 @@
-<template>
- <b-container fluid="xl">
- <page-title />
- <b-row class="mb-4">
- <b-col md="12">
- <page-section
- :section-title="$t('pageVirtualMedia.virtualMediaSubTitleFirst')"
- >
- <b-row>
- <b-col v-for="(dev, $index) in proxyDevices" :key="$index" md="6">
- <b-form-group :label="dev.id" label-class="bold">
- <form-file
- v-if="!dev.isActive"
- :id="concatId(dev.id)"
- v-model="dev.file"
- >
- <template #invalid>
- <b-form-invalid-feedback role="alert">
- {{ $t('global.form.required') }}
- </b-form-invalid-feedback>
- </template>
- </form-file>
- </b-form-group>
- <b-button
- v-if="!dev.isActive"
- variant="primary"
- :disabled="!dev.file"
- @click="startVM(dev)"
- >
- {{ $t('pageVirtualMedia.start') }}
- </b-button>
- <b-button
- v-if="dev.isActive"
- variant="primary"
- :disabled="!dev.file"
- @click="stopVM(dev)"
- >
- {{ $t('pageVirtualMedia.stop') }}
- </b-button>
- </b-col>
- </b-row>
- </page-section>
- </b-col>
- </b-row>
- <b-row v-if="loadImageFromExternalServer" class="mb-4">
- <b-col md="12">
- <page-section
- :section-title="$t('pageVirtualMedia.virtualMediaSubTitleSecond')"
- >
- <b-row>
- <b-col
- v-for="(device, $index) in legacyDevices"
- :key="$index"
- md="6"
- >
- <b-form-group
- :label="device.id"
- :label-for="device.id"
- label-class="bold"
- >
- <b-button
- variant="primary"
- :disabled="device.isActive"
- @click="configureConnection(device)"
- >
- {{ $t('pageVirtualMedia.configureConnection') }}
- </b-button>
-
- <b-button
- v-if="!device.isActive"
- variant="primary"
- class="float-right"
- :disabled="!device.serverUri"
- @click="startLegacy(device)"
- >
- {{ $t('pageVirtualMedia.start') }}
- </b-button>
- <b-button
- v-if="device.isActive"
- variant="primary"
- class="float-right"
- @click="stopLegacy(device)"
- >
- {{ $t('pageVirtualMedia.stop') }}
- </b-button>
- </b-form-group>
- </b-col>
- </b-row>
- </page-section>
- </b-col>
- </b-row>
- <modal-configure-connection
- :connection="modalConfigureConnection"
- @ok="saveConnection"
- />
- </b-container>
-</template>
-
-<script>
-import PageTitle from '@/components/Global/PageTitle';
-import PageSection from '@/components/Global/PageSection';
-import BVToastMixin from '@/components/Mixins/BVToastMixin';
-import LoadingBarMixin from '@/components/Mixins/LoadingBarMixin';
-import ModalConfigureConnection from './ModalConfigureConnection';
-import NbdServer from '@/utilities/NBDServer';
-import FormFile from '@/components/Global/FormFile';
-
-export default {
- name: 'VirtualMedia',
- components: { PageTitle, PageSection, ModalConfigureConnection, FormFile },
- mixins: [BVToastMixin, LoadingBarMixin],
- data() {
- return {
- modalConfigureConnection: null,
- loadImageFromExternalServer:
- process.env.VUE_APP_VIRTUAL_MEDIA_LIST_ENABLED === 'true'
- ? true
- : false,
- };
- },
- computed: {
- proxyDevices() {
- return this.$store.getters['virtualMedia/proxyDevices'];
- },
- legacyDevices() {
- return this.$store.getters['virtualMedia/legacyDevices'];
- },
- },
- created() {
- if (this.proxyDevices.length > 0 || this.legacyDevices.length > 0) return;
- this.startLoader();
- this.$store
- .dispatch('virtualMedia/getData')
- .finally(() => this.endLoader());
- },
- methods: {
- startVM(device) {
- const token = this.$store.getters['authentication/token'];
- device.nbd = new NbdServer(
- `wss://${window.location.host}${device.websocket}`,
- device.file,
- device.id,
- token
- );
- device.nbd.socketStarted = () =>
- this.successToast(this.$t('pageVirtualMedia.toast.serverRunning'));
- device.nbd.errorReadingFile = () =>
- this.errorToast(this.$t('pageVirtualMedia.toast.errorReadingFile'));
- device.nbd.socketClosed = (code) => {
- if (code === 1000)
- this.successToast(
- this.$t('pageVirtualMedia.toast.serverClosedSuccessfully')
- );
- else
- this.errorToast(
- this.$t('pageVirtualMedia.toast.serverClosedWithErrors')
- );
- device.file = null;
- device.isActive = false;
- };
-
- device.nbd.start();
- device.isActive = true;
- },
- stopVM(device) {
- device.nbd.stop();
- },
- startLegacy(connectionData) {
- var data = {};
- data.Image = connectionData.serverUri;
- data.UserName = connectionData.username;
- data.Password = connectionData.password;
- data.WriteProtected = !connectionData.isRW;
- this.startLoader();
- this.$store
- .dispatch('virtualMedia/mountImage', {
- id: connectionData.id,
- data: data,
- })
- .then(() => {
- this.successToast(
- this.$t('pageVirtualMedia.toast.serverConnectionEstablished')
- );
- connectionData.isActive = true;
- })
- .catch(() => {
- this.errorToast(this.$t('pageVirtualMedia.toast.errorMounting'));
- this.isActive = false;
- })
- .finally(() => this.endLoader());
- },
- stopLegacy(connectionData) {
- this.$store
- .dispatch('virtualMedia/unmountImage', connectionData.id)
- .then(() => {
- this.successToast(
- this.$t('pageVirtualMedia.toast.serverClosedSuccessfully')
- );
- connectionData.isActive = false;
- })
- .catch(() =>
- this.errorToast(this.$t('pageVirtualMedia.toast.errorUnmounting'))
- )
- .finally(() => this.endLoader());
- },
- saveConnection(connectionData) {
- this.modalConfigureConnection.serverUri = connectionData.serverUri;
- this.modalConfigureConnection.username = connectionData.username;
- this.modalConfigureConnection.password = connectionData.password;
- this.modalConfigureConnection.isRW = connectionData.isRW;
- },
- configureConnection(connectionData) {
- this.modalConfigureConnection = connectionData;
- this.$bvModal.show('configure-connection');
- },
- concatId(val) {
- return val.split(' ').join('_').toLowerCase();
- },
- },
-};
-</script>
diff --git a/src/views/Control/VirtualMedia/index.js b/src/views/Control/VirtualMedia/index.js
deleted file mode 100644
index 4573e865..00000000
--- a/src/views/Control/VirtualMedia/index.js
+++ /dev/null
@@ -1,2 +0,0 @@
-import VirtualMedia from './VirtualMedia.vue';
-export default VirtualMedia;