| import api from '@/store/api'; |
| import i18n from '@/i18n'; |
| |
| const FirmwareStore = { |
| namespaced: true, |
| state: { |
| bmcFirmware: [], |
| hostFirmware: [], |
| bmcActiveFirmwareId: null, |
| hostActiveFirmwareId: null, |
| applyTime: null, |
| httpPushUri: 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, |
| ); |
| }, |
| }, |
| 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), |
| setHttpPushUri: (state, httpPushUri) => (state.httpPushUri = httpPushUri), |
| 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); |
| const httpPushUri = data.HttpPushUri; |
| commit('setHttpPushUri', httpPushUri); |
| 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(state.httpPushUri, image, { |
| headers: { 'Content-Type': 'application/octet-stream' }, |
| }) |
| .catch((error) => { |
| console.log(error); |
| throw new Error(i18n.t('pageFirmware.toast.errorUpdateFirmware')); |
| }); |
| }, |
| 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.errorUpdateFirmware')); |
| }); |
| }, |
| async switchBmcFirmwareAndReboot({ getters }) { |
| const backupLocation = getters.backupBmcFirmware.location; |
| const data = { |
| Links: { |
| ActiveSoftwareImage: { |
| '@odata.id': backupLocation, |
| }, |
| }, |
| }; |
| return await api |
| .patch('/redfish/v1/Managers/bmc', data) |
| .catch((error) => { |
| console.log(error); |
| throw new Error(i18n.t('pageFirmware.toast.errorSwitchImages')); |
| }); |
| }, |
| }, |
| }; |
| |
| export default FirmwareStore; |