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