xref: /openbmc/webui-vue/src/views/Operations/Firmware/FirmwareCardsBmc.vue (revision ce7db82c9582c4dac04ac81d9af6b557ae7965e3)
1<template>
2  <div>
3    <page-section :section-title="sectionTitle">
4      <b-card-group deck>
5        <!-- Running image -->
6        <b-card>
7          <template #header>
8            <p class="font-weight-bold m-0">
9              {{ $t('pageFirmware.cardTitleRunning') }}
10            </p>
11          </template>
12          <dl class="mb-0">
13            <dt>{{ $t('pageFirmware.cardBodyVersion') }}</dt>
14            <dd class="mb-0">{{ runningVersion }}</dd>
15          </dl>
16        </b-card>
17
18        <!-- Backup image -->
19        <b-card>
20          <template #header>
21            <p class="font-weight-bold m-0">
22              {{ $t('pageFirmware.cardTitleBackup') }}
23            </p>
24          </template>
25          <dl>
26            <dt>{{ $t('pageFirmware.cardBodyVersion') }}</dt>
27            <dd>
28              <status-icon v-if="showBackupImageStatus" status="danger" />
29              <span v-if="showBackupImageStatus" class="sr-only">
30                {{ backupStatus }}
31              </span>
32              {{ backupVersion }}
33            </dd>
34          </dl>
35          <b-btn
36            v-if="!switchToBackupImageDisabled"
37            v-b-modal.modal-switch-to-running
38            data-test-id="firmware-button-switchToRunning"
39            variant="link"
40            size="sm"
41            class="py-0 px-1 mt-2"
42            :disabled="isPageDisabled || !backup || !isServerOff"
43          >
44            <icon-switch class="d-none d-sm-inline-block" />
45            {{ $t('pageFirmware.cardActionSwitchToRunning') }}
46          </b-btn>
47        </b-card>
48      </b-card-group>
49    </page-section>
50    <modal-switch-to-running :backup="backupVersion" @ok="switchToRunning" />
51  </div>
52</template>
53
54<script>
55import IconSwitch from '@carbon/icons-vue/es/arrows--horizontal/20';
56import PageSection from '@/components/Global/PageSection';
57import LoadingBarMixin, { loading } from '@/components/Mixins/LoadingBarMixin';
58import BVToastMixin from '@/components/Mixins/BVToastMixin';
59
60import ModalSwitchToRunning from './FirmwareModalSwitchToRunning';
61import { useI18n } from 'vue-i18n';
62import i18n from '@/i18n';
63
64export default {
65  components: { IconSwitch, ModalSwitchToRunning, PageSection },
66  mixins: [BVToastMixin, LoadingBarMixin],
67  props: {
68    isPageDisabled: {
69      required: true,
70      type: Boolean,
71      default: false,
72    },
73    isServerOff: {
74      required: true,
75      type: Boolean,
76      default: false,
77    },
78  },
79  data() {
80    return {
81      $t: useI18n().t,
82      loading,
83      switchToBackupImageDisabled:
84        process.env.VUE_APP_SWITCH_TO_BACKUP_IMAGE_DISABLED === 'true',
85    };
86  },
87  computed: {
88    isSingleFileUploadEnabled() {
89      return this.$store.getters['firmware/isSingleFileUploadEnabled'];
90    },
91    sectionTitle() {
92      if (this.isSingleFileUploadEnabled) {
93        return i18n.global.t('pageFirmware.sectionTitleBmcCardsCombined');
94      }
95      return i18n.global.t('pageFirmware.sectionTitleBmcCards');
96    },
97    running() {
98      return this.$store.getters['firmware/activeBmcFirmware'];
99    },
100    backup() {
101      return this.$store.getters['firmware/backupBmcFirmware'];
102    },
103    runningVersion() {
104      return this.running?.version || '--';
105    },
106    backupVersion() {
107      return this.backup?.version || '--';
108    },
109    backupStatus() {
110      return this.backup?.status || null;
111    },
112    showBackupImageStatus() {
113      return (
114        this.backupStatus === 'Critical' || this.backupStatus === 'Warning'
115      );
116    },
117  },
118  methods: {
119    switchToRunning() {
120      this.startLoader();
121      const timerId = setTimeout(() => {
122        this.endLoader();
123        this.infoToast(
124          i18n.global.t('pageFirmware.toast.verifySwitchMessage'),
125          {
126            title: i18n.global.t('pageFirmware.toast.verifySwitch'),
127            refreshAction: true,
128          },
129        );
130      }, 60000);
131
132      this.$store
133        .dispatch('firmware/switchBmcFirmwareAndReboot')
134        .then(() =>
135          this.infoToast(
136            i18n.global.t('pageFirmware.toast.rebootStartedMessage'),
137            {
138              title: i18n.global.t('pageFirmware.toast.rebootStarted'),
139            },
140          ),
141        )
142        .catch(({ message }) => {
143          this.errorToast(message);
144          clearTimeout(timerId);
145          this.endLoader();
146        });
147    },
148  },
149};
150</script>
151