Update the default firmware page

- Minor updates made to the general layout and styles
  - Changes to some page copy
  - Moves update firmware form to bottom of page
- Adds dynamic TFTP upload option
- Adds dynamic card layout for BMC and host firmwre
  - 2 cards for combined
  - 4 cards for separate
- Removes FirmwareSingleImage components that were used for IBM builds

Signed-off-by: Yoshie Muranaka <yoshiemuranaka@gmail.com>
Change-Id: Ib5465ecc30dd1505824bf41c82d33b7655d5e598
diff --git a/src/env/components/FirmwareSingleImage/FirmwareAlertServerPower.vue b/src/env/components/FirmwareSingleImage/FirmwareAlertServerPower.vue
deleted file mode 100644
index f7ac0fc..0000000
--- a/src/env/components/FirmwareSingleImage/FirmwareAlertServerPower.vue
+++ /dev/null
@@ -1,60 +0,0 @@
-<template>
-  <b-row>
-    <b-col xl="10">
-      <!-- Operation in progress alert -->
-      <alert v-if="isOperationInProgress" variant="info" class="mb-5">
-        <p>
-          {{ $t('pageFirmware.singleFileUpload.alert.operationInProgress') }}
-        </p>
-      </alert>
-      <!-- Power off server warning alert -->
-      <alert v-else-if="!isHostOff" variant="warning" class="mb-5">
-        <p class="mb-0">
-          {{
-            $t('pageFirmware.singleFileUpload.alert.serverMustBePoweredOffTo')
-          }}
-        </p>
-        <ul class="m-0">
-          <li>
-            {{
-              $t(
-                'pageFirmware.singleFileUpload.alert.switchRunningAndBackupImages'
-              )
-            }}
-          </li>
-          <li>
-            {{ $t('pageFirmware.singleFileUpload.alert.updateFirmware') }}
-          </li>
-        </ul>
-        <template #action>
-          <b-link to="/control/server-power-operations">
-            {{
-              $t(
-                'pageFirmware.singleFileUpload.alert.viewServerPowerOperations'
-              )
-            }}
-          </b-link>
-        </template>
-      </alert>
-    </b-col>
-  </b-row>
-</template>
-
-<script>
-import Alert from '@/components/Global/Alert';
-
-export default {
-  components: { Alert },
-  props: {
-    isHostOff: {
-      required: true,
-      type: Boolean,
-    },
-  },
-  computed: {
-    isOperationInProgress() {
-      return this.$store.getters['controls/isOperationInProgress'];
-    },
-  },
-};
-</script>
diff --git a/src/env/components/FirmwareSingleImage/FirmwareCardsBmc.vue b/src/env/components/FirmwareSingleImage/FirmwareCardsBmc.vue
deleted file mode 100644
index 857adf0..0000000
--- a/src/env/components/FirmwareSingleImage/FirmwareCardsBmc.vue
+++ /dev/null
@@ -1,145 +0,0 @@
-<template>
-  <div>
-    <page-section :section-title="sectionTitle">
-      <b-card-group deck>
-        <!-- Running image -->
-        <b-card>
-          <template #header>
-            <p class="font-weight-bold m-0">
-              {{ $t('pageFirmware.singleFileUpload.cardTitleRunning') }}
-            </p>
-          </template>
-          <dl class="mb-0">
-            <dt>{{ $t('pageFirmware.singleFileUpload.cardBodyVersion') }}</dt>
-            <dd class="mb-0">{{ runningVersion }}</dd>
-          </dl>
-        </b-card>
-
-        <!-- Backup image -->
-        <b-card>
-          <template #header>
-            <p class="font-weight-bold m-0">
-              {{ $t('pageFirmware.singleFileUpload.cardTitleBackup') }}
-            </p>
-          </template>
-          <dl>
-            <dt>{{ $t('pageFirmware.singleFileUpload.cardBodyVersion') }}</dt>
-            <dd>
-              <status-icon v-if="showBackupImageStatus" status="danger" />
-              <span v-if="showBackupImageStatus" class="sr-only">
-                {{ backupStatus }}
-              </span>
-              {{ backupVersion }}
-            </dd>
-          </dl>
-          <b-btn
-            v-b-modal.modal-switch-to-running
-            data-test-id="firmware-button-switchToRunning"
-            variant="link"
-            size="sm"
-            class="py-0 px-1 mt-2"
-            :disabled="isPageDisabled || !backup"
-          >
-            <icon-switch class="d-none d-sm-inline-block" />
-            {{ $t('pageFirmware.singleFileUpload.cardActionSwitchToRunning') }}
-          </b-btn>
-        </b-card>
-      </b-card-group>
-    </page-section>
-    <modal-switch-to-running :backup="backupVersion" @ok="switchToRunning" />
-  </div>
-</template>
-
-<script>
-import IconSwitch from '@carbon/icons-vue/es/arrows--horizontal/20';
-import PageSection from '@/components/Global/PageSection';
-import LoadingBarMixin, { loading } from '@/components/Mixins/LoadingBarMixin';
-import BVToastMixin from '@/components/Mixins/BVToastMixin';
-
-import ModalSwitchToRunning from './FirmwareModalSwitchToRunning';
-
-export default {
-  components: { IconSwitch, ModalSwitchToRunning, PageSection },
-  mixins: [BVToastMixin, LoadingBarMixin],
-  props: {
-    isPageDisabled: {
-      required: true,
-      type: Boolean,
-      default: false,
-    },
-  },
-  data() {
-    return {
-      loading,
-    };
-  },
-  computed: {
-    isSingleFileUploadEnabled() {
-      return this.$store.getters[
-        'firmwareSingleImage/isSingleFileUploadEnabled'
-      ];
-    },
-    sectionTitle() {
-      if (this.isSingleFileUploadEnabled) {
-        return this.$t(
-          'pageFirmware.singleFileUpload.sectionTitleBmcCardsCombined'
-        );
-      }
-      return this.$t('pageFirmware.singleFileUpload.sectionTitleBmcCards');
-    },
-    running() {
-      return this.$store.getters['firmwareSingleImage/activeBmcFirmware'];
-    },
-    backup() {
-      return this.$store.getters['firmwareSingleImage/backupBmcFirmware'];
-    },
-    runningVersion() {
-      return this.running?.version || '--';
-    },
-    backupVersion() {
-      return this.backup?.version || '--';
-    },
-    backupStatus() {
-      return this.backup?.status || null;
-    },
-    showBackupImageStatus() {
-      return (
-        this.backupStatus === 'Critical' || this.backupStatus === 'Warning'
-      );
-    },
-  },
-  methods: {
-    switchToRunning() {
-      this.startLoader();
-      const timerId = setTimeout(() => {
-        this.endLoader();
-        this.infoToast(
-          this.$t('pageFirmware.singleFileUpload.toast.verifySwitchMessage'),
-          {
-            title: this.$t('pageFirmware.singleFileUpload.toast.verifySwitch'),
-            refreshAction: true,
-          }
-        );
-      }, 60000);
-
-      this.$store
-        .dispatch('firmwareSingleImage/switchFirmwareAndReboot')
-        .then(() =>
-          this.infoToast(
-            this.$t('pageFirmware.singleFileUpload.toast.rebootStartedMessage'),
-            {
-              title: this.$t(
-                'pageFirmware.singleFileUpload.toast.rebootStarted'
-              ),
-            }
-          )
-        )
-        .catch(({ message }) => {
-          this.errorToast(message);
-          clearTimeout(timerId);
-          this.endLoader();
-        });
-    },
-  },
-};
-</script>
diff --git a/src/env/components/FirmwareSingleImage/FirmwareCardsHost.vue b/src/env/components/FirmwareSingleImage/FirmwareCardsHost.vue
deleted file mode 100644
index c47f60f..0000000
--- a/src/env/components/FirmwareSingleImage/FirmwareCardsHost.vue
+++ /dev/null
@@ -1,75 +0,0 @@
-<template>
-  <page-section
-    :section-title="$t('pageFirmware.singleFileUpload.sectionTitleHostCards')"
-  >
-    <b-card-group deck>
-      <!-- Running image -->
-      <b-card>
-        <template #header>
-          <p class="font-weight-bold m-0">
-            {{ $t('pageFirmware.singleFileUpload.cardTitleRunning') }}
-          </p>
-        </template>
-        <dl class="mb-0">
-          <dt>{{ $t('pageFirmware.singleFileUpload.cardBodyVersion') }}</dt>
-          <dd class="mb-0">{{ runningVersion }}</dd>
-        </dl>
-      </b-card>
-
-      <!-- Backup image -->
-      <b-card>
-        <template #header>
-          <p class="font-weight-bold m-0">
-            {{ $t('pageFirmware.singleFileUpload.cardTitleBackup') }}
-          </p>
-        </template>
-        <dl class="mb-0">
-          <dt>{{ $t('pageFirmware.singleFileUpload.cardBodyVersion') }}</dt>
-          <dd class="mb-0">
-            <status-icon v-if="showBackupImageStatus" status="danger" />
-            <span v-if="showBackupImageStatus" class="sr-only">
-              {{ backupStatus }}
-            </span>
-            {{ backupVersion }}
-          </dd>
-        </dl>
-      </b-card>
-    </b-card-group>
-  </page-section>
-</template>
-
-<script>
-import PageSection from '@/components/Global/PageSection';
-
-export default {
-  components: { PageSection },
-  computed: {
-    running() {
-      return this.$store.getters['firmwareSingleImage/activeHostFirmware'];
-    },
-    backup() {
-      return this.$store.getters['firmwareSingleImage/backupHostFirmware'];
-    },
-    runningVersion() {
-      return this.running?.version || '--';
-    },
-    backupVersion() {
-      return this.backup?.version || '--';
-    },
-    backupStatus() {
-      return this.backup?.status || null;
-    },
-    showBackupImageStatus() {
-      return (
-        this.backupStatus === 'Critical' || this.backupStatus === 'Warning'
-      );
-    },
-  },
-};
-</script>
-
-<style lang="scss" scoped>
-.page-section {
-  margin-top: -$spacer * 1.5;
-}
-</style>
diff --git a/src/env/components/FirmwareSingleImage/FirmwareFormUpdate.vue b/src/env/components/FirmwareSingleImage/FirmwareFormUpdate.vue
deleted file mode 100644
index f13b8e0..0000000
--- a/src/env/components/FirmwareSingleImage/FirmwareFormUpdate.vue
+++ /dev/null
@@ -1,235 +0,0 @@
-<template>
-  <div>
-    <div class="form-background p-3">
-      <b-form @submit.prevent="onSubmitUpload">
-        <b-form-group
-          v-if="isTftpUploadAvailable"
-          :label="
-            $t('pageFirmware.singleFileUpload.form.updateFirmware.fileSource')
-          "
-          :disabled="isPageDisabled"
-        >
-          <b-form-radio v-model="isWorkstationSelected" :value="true">
-            {{
-              $t(
-                'pageFirmware.singleFileUpload.form.updateFirmware.workstation'
-              )
-            }}
-          </b-form-radio>
-          <b-form-radio v-model="isWorkstationSelected" :value="false">
-            {{
-              $t('pageFirmware.singleFileUpload.form.updateFirmware.tftpServer')
-            }}
-          </b-form-radio>
-        </b-form-group>
-
-        <!-- Workstation Upload -->
-        <template v-if="isWorkstationSelected">
-          <b-form-group
-            :label="
-              $t('pageFirmware.singleFileUpload.form.updateFirmware.imageFile')
-            "
-            label-for="image-file"
-          >
-            <b-form-text id="image-file-help-block">
-              {{
-                $t(
-                  'pageFirmware.singleFileUpload.form.updateFirmware.imageFileHelperText'
-                )
-              }}
-            </b-form-text>
-            <form-file
-              id="image-file"
-              accept=".tar"
-              :disabled="isPageDisabled"
-              :state="getValidationState($v.file)"
-              aria-describedby="image-file-help-block"
-              @input="onFileUpload($event)"
-            >
-              <template #invalid>
-                <b-form-invalid-feedback role="alert">
-                  {{ $t('global.form.required') }}
-                </b-form-invalid-feedback>
-              </template>
-            </form-file>
-          </b-form-group>
-        </template>
-
-        <!-- TFTP Server Upload -->
-        <template v-else>
-          <b-form-group
-            :label="
-              $t(
-                'pageFirmware.singleFileUpload.form.updateFirmware.fileAddress'
-              )
-            "
-            label-for="tftp-address"
-          >
-            <b-form-input
-              id="tftp-address"
-              v-model="tftpFileAddress"
-              type="text"
-              :state="getValidationState($v.tftpFileAddress)"
-              :disabled="isPageDisabled"
-              @input="$v.tftpFileAddress.$touch()"
-            />
-            <b-form-invalid-feedback role="alert">
-              {{ $t('global.form.fieldRequired') }}
-            </b-form-invalid-feedback>
-          </b-form-group>
-        </template>
-        <b-btn
-          data-test-id="firmware-button-startUpdate"
-          type="submit"
-          variant="primary"
-          :disabled="isPageDisabled"
-        >
-          {{
-            $t('pageFirmware.singleFileUpload.form.updateFirmware.startUpdate')
-          }}
-        </b-btn>
-        <alert
-          v-if="isServerPowerOffRequired && !isHostOff"
-          variant="warning"
-          :small="true"
-          class="mt-4"
-        >
-          <p class="col-form-label">
-            {{
-              $t(
-                'pageFirmware.singleFileUpload.alert.serverMustBePoweredOffToUpdateFirmware'
-              )
-            }}
-          </p>
-        </alert>
-      </b-form>
-    </div>
-
-    <!-- Modals -->
-    <modal-update-firmware @ok="updateFirmware" />
-  </div>
-</template>
-
-<script>
-import { requiredIf } from 'vuelidate/lib/validators';
-
-import BVToastMixin from '@/components/Mixins/BVToastMixin';
-import LoadingBarMixin, { loading } from '@/components/Mixins/LoadingBarMixin';
-import VuelidateMixin from '@/components/Mixins/VuelidateMixin.js';
-
-import Alert from '@/components/Global/Alert';
-import FormFile from '@/components/Global/FormFile';
-import ModalUpdateFirmware from './FirmwareModalUpdateFirmware';
-
-export default {
-  components: { Alert, FormFile, ModalUpdateFirmware },
-  mixins: [BVToastMixin, LoadingBarMixin, VuelidateMixin],
-  props: {
-    isPageDisabled: {
-      required: true,
-      type: Boolean,
-      default: false,
-    },
-    isHostOff: {
-      required: true,
-      type: Boolean,
-    },
-  },
-  data() {
-    return {
-      loading,
-      isWorkstationSelected: true,
-      file: null,
-      tftpFileAddress: null,
-      isServerPowerOffRequired:
-        process.env.VUE_APP_SERVER_OFF_REQUIRED === 'true',
-    };
-  },
-  computed: {
-    isTftpUploadAvailable() {
-      return this.$store.getters['firmwareSingleImage/isTftpUploadAvailable'];
-    },
-  },
-  watch: {
-    isWorkstationSelected: function () {
-      this.$v.$reset();
-      this.file = null;
-      this.tftpFileAddress = null;
-    },
-  },
-  validations() {
-    return {
-      file: {
-        required: requiredIf(function () {
-          return this.isWorkstationSelected;
-        }),
-      },
-      tftpFileAddress: {
-        required: requiredIf(function () {
-          return !this.isWorkstationSelected;
-        }),
-      },
-    };
-  },
-  created() {
-    this.$store.dispatch('firmwareSingleImage/getUpdateServiceSettings');
-  },
-  methods: {
-    updateFirmware() {
-      this.startLoader();
-      const timerId = setTimeout(() => {
-        this.endLoader();
-        this.infoToast(
-          this.$t('pageFirmware.singleFileUpload.toast.verifyUpdateMessage'),
-          {
-            title: this.$t('pageFirmware.singleFileUpload.toast.verifyUpdate'),
-            refreshAction: true,
-          }
-        );
-      }, 360000);
-      this.infoToast(
-        this.$t('pageFirmware.singleFileUpload.toast.updateStartedMessage'),
-        {
-          title: this.$t('pageFirmware.singleFileUpload.toast.updateStarted'),
-          timestamp: true,
-        }
-      );
-      if (this.isWorkstationSelected) {
-        this.dispatchWorkstationUpload(timerId);
-      } else {
-        this.dispatchTftpUpload(timerId);
-      }
-    },
-    dispatchWorkstationUpload(timerId) {
-      this.$store
-        .dispatch('firmwareSingleImage/uploadFirmware', this.file)
-        .catch(({ message }) => {
-          this.endLoader();
-          this.errorToast(message);
-          clearTimeout(timerId);
-        });
-    },
-    dispatchTftpUpload(timerId) {
-      this.$store
-        .dispatch(
-          'firmwareSingleImage/uploadFirmwareTFTP',
-          this.tftpFileAddress
-        )
-        .catch(({ message }) => {
-          this.endLoader();
-          this.errorToast(message);
-          clearTimeout(timerId);
-        });
-    },
-    onSubmitUpload() {
-      this.$v.$touch();
-      if (this.$v.$invalid) return;
-      this.$bvModal.show('modal-update-firmware');
-    },
-    onFileUpload(file) {
-      this.file = file;
-      this.$v.file.$touch();
-    },
-  },
-};
-</script>
diff --git a/src/env/components/FirmwareSingleImage/FirmwareModalSwitchToRunning.vue b/src/env/components/FirmwareSingleImage/FirmwareModalSwitchToRunning.vue
deleted file mode 100644
index 56f505d..0000000
--- a/src/env/components/FirmwareSingleImage/FirmwareModalSwitchToRunning.vue
+++ /dev/null
@@ -1,31 +0,0 @@
-<template>
-  <b-modal
-    id="modal-switch-to-running"
-    :ok-title="$t('pageFirmware.singleFileUpload.modal.switchImages')"
-    :cancel-title="$t('global.action.cancel')"
-    :title="$t('pageFirmware.singleFileUpload.modal.switchRunningImage')"
-    @ok="$emit('ok')"
-  >
-    <p>
-      {{ $t('pageFirmware.singleFileUpload.modal.switchRunningImageInfo') }}
-    </p>
-    <p class="m-0">
-      {{
-        $t('pageFirmware.singleFileUpload.modal.switchRunningImageInfo2', {
-          backup,
-        })
-      }}
-    </p>
-  </b-modal>
-</template>
-
-<script>
-export default {
-  props: {
-    backup: {
-      type: String,
-      required: true,
-    },
-  },
-};
-</script>
diff --git a/src/env/components/FirmwareSingleImage/FirmwareModalUpdateFirmware.vue b/src/env/components/FirmwareSingleImage/FirmwareModalUpdateFirmware.vue
deleted file mode 100644
index d6c52f9..0000000
--- a/src/env/components/FirmwareSingleImage/FirmwareModalUpdateFirmware.vue
+++ /dev/null
@@ -1,48 +0,0 @@
-<template>
-  <b-modal
-    id="modal-update-firmware"
-    :title="$t('pageFirmware.singleFileUpload.sectionTitleUpdateFirmware')"
-    :ok-title="
-      $t('pageFirmware.singleFileUpload.form.updateFirmware.startUpdate')
-    "
-    :cancel-title="$t('global.action.cancel')"
-    @ok="$emit('ok')"
-  >
-    <template v-if="isSingleFileUploadEnabled">
-      <p>
-        {{ $t('pageFirmware.singleFileUpload.modal.updateFirmwareInfo') }}
-      </p>
-      <p>
-        {{
-          $t('pageFirmware.singleFileUpload.modal.updateFirmwareInfo2', {
-            running: runningBmcVersion,
-          })
-        }}
-      </p>
-      <p class="m-0">
-        {{ $t('pageFirmware.singleFileUpload.modal.updateFirmwareInfo3') }}
-      </p>
-    </template>
-    <template v-else>
-      {{ $t('pageFirmware.singleFileUpload.modal.updateFirmwareInfoDefault') }}
-    </template>
-  </b-modal>
-</template>
-
-<script>
-export default {
-  computed: {
-    runningBmc() {
-      return this.$store.getters['firmwareSingleImage/activeBmcFirmware'];
-    },
-    runningBmcVersion() {
-      return this.runningBmc?.version || '--';
-    },
-    isSingleFileUploadEnabled() {
-      return this.$store.getters[
-        'firmwareSingleImage/isSingleFileUploadEnabled'
-      ];
-    },
-  },
-};
-</script>
diff --git a/src/env/components/FirmwareSingleImage/FirmwareSingleImage.vue b/src/env/components/FirmwareSingleImage/FirmwareSingleImage.vue
deleted file mode 100644
index 2e601bd..0000000
--- a/src/env/components/FirmwareSingleImage/FirmwareSingleImage.vue
+++ /dev/null
@@ -1,97 +0,0 @@
-<template>
-  <b-container fluid="xl">
-    <page-title />
-    <alerts-server-power
-      v-if="isServerPowerOffRequired"
-      :is-host-off="isHostOff"
-    />
-
-    <!-- Firmware cards -->
-    <b-row>
-      <b-col xl="10">
-        <!-- BMC Firmware -->
-        <bmc-cards :is-page-disabled="isPageDisabled" />
-
-        <!-- Host Firmware -->
-        <host-cards v-if="!isSingleFileUploadEnabled" />
-      </b-col>
-    </b-row>
-
-    <!-- Update firmware-->
-    <page-section
-      :section-title="
-        $t('pageFirmware.singleFileUpload.sectionTitleUpdateFirmware')
-      "
-    >
-      <b-row>
-        <b-col sm="8" md="6" xl="4">
-          <!-- Update form -->
-          <form-update
-            :is-host-off="isHostOff"
-            :is-page-disabled="isPageDisabled"
-          />
-        </b-col>
-      </b-row>
-    </page-section>
-  </b-container>
-</template>
-
-<script>
-import AlertsServerPower from './FirmwareAlertServerPower';
-import BmcCards from './FirmwareCardsBmc';
-import FormUpdate from './FirmwareFormUpdate';
-import HostCards from './FirmwareCardsHost';
-import PageSection from '@/components/Global/PageSection';
-import PageTitle from '@/components/Global/PageTitle';
-
-import LoadingBarMixin, { loading } from '@/components/Mixins/LoadingBarMixin';
-
-export default {
-  name: 'FirmwareSingleImage',
-  components: {
-    AlertsServerPower,
-    BmcCards,
-    FormUpdate,
-    HostCards,
-    PageSection,
-    PageTitle,
-  },
-  mixins: [LoadingBarMixin],
-  beforeRouteLeave(to, from, next) {
-    this.hideLoader();
-    next();
-  },
-  data() {
-    return {
-      loading,
-      isServerPowerOffRequired:
-        process.env.VUE_APP_SERVER_OFF_REQUIRED === 'true',
-    };
-  },
-  computed: {
-    hostStatus() {
-      return this.$store.getters['global/hostStatus'];
-    },
-    isHostOff() {
-      return this.hostStatus === 'off' ? true : false;
-    },
-    isSingleFileUploadEnabled() {
-      return this.$store.getters[
-        'firmwareSingleImage/isSingleFileUploadEnabled'
-      ];
-    },
-    isPageDisabled() {
-      if (this.isServerPowerOffRequired) {
-        return !this.isHostOff || this.loading || this.isOperationInProgress;
-      }
-      return this.loading || this.isOperationInProgress;
-    },
-  },
-  created() {
-    this.startLoader();
-    this.$store
-      .dispatch('firmwareSingleImage/getFirmwareInformation')
-      .finally(() => this.endLoader());
-  },
-};
-</script>
diff --git a/src/env/components/FirmwareSingleImage/index.js b/src/env/components/FirmwareSingleImage/index.js
deleted file mode 100644
index 06f31f9..0000000
--- a/src/env/components/FirmwareSingleImage/index.js
+++ /dev/null
@@ -1,2 +0,0 @@
-import FirmwareSingleImage from './FirmwareSingleImage.vue';
-export default FirmwareSingleImage;
diff --git a/src/env/router/ibm.js b/src/env/router/ibm.js
index 969146c..c4e1a69 100644
--- a/src/env/router/ibm.js
+++ b/src/env/router/ibm.js
@@ -4,6 +4,7 @@
 import ConsoleLayout from '@/layouts/ConsoleLayout.vue';
 import DateTimeSettings from '@/views/Configuration/DateTimeSettings';
 import EventLogs from '@/views/Health/EventLogs';
+import Firmware from '@/views/Configuration/Firmware';
 import HardwareStatus from '@/views/Health/HardwareStatus';
 import Ldap from '@/views/AccessControl/Ldap';
 import LocalUserManagement from '@/views/AccessControl/LocalUserManagement';
@@ -26,7 +27,6 @@
 import i18n from '@/i18n';
 
 // Custom components
-import FirmwareSingleImage from '../components/FirmwareSingleImage';
 import Dumps from '../components/Dumps';
 
 const routes = [
@@ -168,7 +168,7 @@
       {
         path: '/configuration/firmware',
         name: 'firmware',
-        component: FirmwareSingleImage,
+        component: Firmware,
         meta: {
           title: i18n.t('appPageTitle.firmware'),
         },
diff --git a/src/env/store/FirmwareSingleImage/FirmwareSingleImageStore.js b/src/env/store/FirmwareSingleImage/FirmwareSingleImageStore.js
deleted file mode 100644
index ae4d633..0000000
--- a/src/env/store/FirmwareSingleImage/FirmwareSingleImageStore.js
+++ /dev/null
@@ -1,195 +0,0 @@
-import api from '@/store/api';
-import i18n from '@/i18n';
-
-const FirmwareSingleImageStore = {
-  namespaced: true,
-  state: {
-    bmcFirmware: [],
-    hostFirmware: [],
-    bmcActiveFirmwareId: null,
-    hostActiveFirmwareId: null,
-    applyTime: null,
-    tftpAvailable: false,
-  },
-  getters: {
-    isTftpUploadAvailable: (state) => state.tftpAvailable,
-    isSingleFileUploadEnabled: (state) => state.hostFirmware.length === 0,
-    activeBmcFirmware: (state) => {
-      return state.bmcFirmware.find(
-        (firmware) => firmware.id === state.bmcActiveFirmwareId
-      );
-    },
-    activeHostFirmware: (state) => {
-      return state.hostFirmware.find(
-        (firmware) => firmware.id === state.hostActiveFirmwareId
-      );
-    },
-    backupBmcFirmware: (state) => {
-      return state.bmcFirmware.find(
-        (firmware) => firmware.id !== state.bmcActiveFirmwareId
-      );
-    },
-    backupHostFirmware: (state) => {
-      return state.hostFirmware.find(
-        (firmware) => firmware.id !== state.hostActiveFirmwareId
-      );
-    },
-    bmcFirmwareCurrentVersion: (_, getters) =>
-      getters.activeBmcFirmware?.version, //this getter is needed for the Overview page,
-  },
-  mutations: {
-    setActiveBmcFirmwareId: (state, id) => (state.bmcActiveFirmwareId = id),
-    setActiveHostFirmwareId: (state, id) => (state.hostActiveFirmwareId = id),
-    setBmcFirmware: (state, firmware) => (state.bmcFirmware = firmware),
-    setHostFirmware: (state, firmware) => (state.hostFirmware = firmware),
-    setApplyTime: (state, applyTime) => (state.applyTime = applyTime),
-    setTftpUploadAvailable: (state, tftpAvailable) =>
-      (state.tftpAvailable = tftpAvailable),
-  },
-  actions: {
-    async getFirmwareInformation({ dispatch }) {
-      dispatch('getActiveHostFirmware');
-      dispatch('getActiveBmcFirmware');
-      return await dispatch('getFirmwareInventory');
-    },
-    getActiveBmcFirmware({ commit }) {
-      return api
-        .get('/redfish/v1/Managers/bmc')
-        .then(({ data: { Links } }) => {
-          const id = Links?.ActiveSoftwareImage['@odata.id'].split('/').pop();
-          commit('setActiveBmcFirmwareId', id);
-        })
-        .catch((error) => console.log(error));
-    },
-    getActiveHostFirmware({ commit }) {
-      return api
-        .get('/redfish/v1/Systems/system/Bios')
-        .then(({ data: { Links } }) => {
-          const id = Links?.ActiveSoftwareImage['@odata.id'].split('/').pop();
-          commit('setActiveHostFirmwareId', id);
-        })
-        .catch((error) => console.log(error));
-    },
-    async getFirmwareInventory({ commit }) {
-      const inventoryList = await api
-        .get('/redfish/v1/UpdateService/FirmwareInventory')
-        .then(({ data: { Members = [] } = {} }) =>
-          Members.map((item) => api.get(item['@odata.id']))
-        )
-        .catch((error) => console.log(error));
-      await api
-        .all(inventoryList)
-        .then((response) => {
-          const bmcFirmware = [];
-          const hostFirmware = [];
-          response.forEach(({ data }) => {
-            const firmwareType = data?.RelatedItem?.[0]?.['@odata.id']
-              .split('/')
-              .pop();
-            const item = {
-              version: data?.Version,
-              id: data?.Id,
-              location: data?.['@odata.id'],
-              status: data?.Status?.Health,
-            };
-            if (firmwareType === 'bmc') {
-              bmcFirmware.push(item);
-            } else if (firmwareType === 'Bios') {
-              hostFirmware.push(item);
-            }
-          });
-          commit('setBmcFirmware', bmcFirmware);
-          commit('setHostFirmware', hostFirmware);
-        })
-        .catch((error) => {
-          console.log(error);
-        });
-    },
-    getUpdateServiceSettings({ commit }) {
-      api
-        .get('/redfish/v1/UpdateService')
-        .then(({ data }) => {
-          const applyTime =
-            data.HttpPushUriOptions.HttpPushUriApplyTime.ApplyTime;
-          const allowableActions =
-            data?.Actions?.['#UpdateService.SimpleUpdate']?.[
-              'TransferProtocol@Redfish.AllowableValues'
-            ];
-
-          commit('setApplyTime', applyTime);
-          if (allowableActions.includes('TFTP')) {
-            commit('setTftpUploadAvailable', true);
-          }
-        })
-        .catch((error) => console.log(error));
-    },
-    setApplyTimeImmediate({ commit }) {
-      const data = {
-        HttpPushUriOptions: {
-          HttpPushUriApplyTime: {
-            ApplyTime: 'Immediate',
-          },
-        },
-      };
-      return api
-        .patch('/redfish/v1/UpdateService', data)
-        .then(() => commit('setApplyTime', 'Immediate'))
-        .catch((error) => console.log(error));
-    },
-    async uploadFirmware({ state, dispatch }, image) {
-      if (state.applyTime !== 'Immediate') {
-        // ApplyTime must be set to Immediate before making
-        // request to update firmware
-        await dispatch('setApplyTimeImmediate');
-      }
-      return await api
-        .post('/redfish/v1/UpdateService', image, {
-          headers: { 'Content-Type': 'application/octet-stream' },
-        })
-        .catch((error) => {
-          console.log(error);
-          throw new Error(i18n.t('pageFirmware.toast.errorUploadAndReboot'));
-        });
-    },
-    async uploadFirmwareTFTP({ state, dispatch }, fileAddress) {
-      const data = {
-        TransferProtocol: 'TFTP',
-        ImageURI: fileAddress,
-      };
-      if (state.applyTime !== 'Immediate') {
-        // ApplyTime must be set to Immediate before making
-        // request to update firmware
-        await dispatch('setApplyTimeImmediate');
-      }
-      return await api
-        .post(
-          '/redfish/v1/UpdateService/Actions/UpdateService.SimpleUpdate',
-          data
-        )
-        .catch((error) => {
-          console.log(error);
-          throw new Error(i18n.t('pageFirmware.toast.errorUploadAndReboot'));
-        });
-    },
-    async switchFirmwareAndReboot({ getters }) {
-      const backupLoaction = getters.backupBmcFirmware.location;
-      const data = {
-        Links: {
-          ActiveSoftwareImage: {
-            '@odata.id': backupLoaction,
-          },
-        },
-      };
-      return await api
-        .patch('/redfish/v1/Managers/bmc', data)
-        .catch((error) => {
-          console.log(error);
-          throw new Error(
-            i18n.t('pageFirmware.singleFileUpload.toast.errorSwitchImages')
-          );
-        });
-    },
-  },
-};
-
-export default FirmwareSingleImageStore;
diff --git a/src/env/store/ibm.js b/src/env/store/ibm.js
index e19dd48..980236f 100644
--- a/src/env/store/ibm.js
+++ b/src/env/store/ibm.js
@@ -1,11 +1,8 @@
 import store from '@/store';
-import FirmwareSingleImageStore from './FirmwareSingleImage/FirmwareSingleImageStore';
 import DumpsStore from './Dumps/DumpsStore';
 
 store.unregisterModule('virtualMedia');
 
-store.unregisterModule('firmware');
-store.registerModule('firmwareSingleImage', FirmwareSingleImageStore);
 store.registerModule('dumps', DumpsStore);
 
 export default store;