168cbbe90SSandeepa Singhimport api from '@/store/api'; 268cbbe90SSandeepa Singhimport i18n from '@/i18n'; 368cbbe90SSandeepa Singh 468cbbe90SSandeepa Singhconst FirmwareStore = { 568cbbe90SSandeepa Singh namespaced: true, 668cbbe90SSandeepa Singh state: { 768cbbe90SSandeepa Singh bmcFirmware: [], 8*85b2d315SShane Lin biosFirmware: [], 968cbbe90SSandeepa Singh bmcActiveFirmwareId: null, 10*85b2d315SShane Lin biosActiveFirmwareId: null, 1168cbbe90SSandeepa Singh applyTime: null, 12e2c716a9SLeo Xu multipartHttpPushUri: null, 136b424f99Sgreenfil httpPushUri: null, 1468cbbe90SSandeepa Singh }, 1568cbbe90SSandeepa Singh getters: { 16*85b2d315SShane Lin isSingleFileUploadEnabled: (state) => state.biosFirmware.length === 0, 1768cbbe90SSandeepa Singh activeBmcFirmware: (state) => { 1868cbbe90SSandeepa Singh return state.bmcFirmware.find( 198132399cSEd Tanous (firmware) => firmware.id === state.bmcActiveFirmwareId, 2068cbbe90SSandeepa Singh ); 2168cbbe90SSandeepa Singh }, 22*85b2d315SShane Lin activeBiosFirmware: (state) => { 23*85b2d315SShane Lin return state.biosFirmware.find( 24*85b2d315SShane Lin (firmware) => firmware.id === state.biosActiveFirmwareId, 2568cbbe90SSandeepa Singh ); 2668cbbe90SSandeepa Singh }, 2768cbbe90SSandeepa Singh backupBmcFirmware: (state) => { 2868cbbe90SSandeepa Singh return state.bmcFirmware.find( 298132399cSEd Tanous (firmware) => firmware.id !== state.bmcActiveFirmwareId, 3068cbbe90SSandeepa Singh ); 3168cbbe90SSandeepa Singh }, 32*85b2d315SShane Lin backupBiosFirmware: (state) => { 33*85b2d315SShane Lin return state.biosFirmware.find( 34*85b2d315SShane Lin (firmware) => firmware.id !== state.biosActiveFirmwareId, 3568cbbe90SSandeepa Singh ); 3668cbbe90SSandeepa Singh }, 3768cbbe90SSandeepa Singh }, 3868cbbe90SSandeepa Singh mutations: { 3968cbbe90SSandeepa Singh setActiveBmcFirmwareId: (state, id) => (state.bmcActiveFirmwareId = id), 40*85b2d315SShane Lin setActiveBiosFirmwareId: (state, id) => (state.biosActiveFirmwareId = id), 4168cbbe90SSandeepa Singh setBmcFirmware: (state, firmware) => (state.bmcFirmware = firmware), 42*85b2d315SShane Lin setBiosFirmware: (state, firmware) => (state.biosFirmware = firmware), 4368cbbe90SSandeepa Singh setApplyTime: (state, applyTime) => (state.applyTime = applyTime), 446b424f99Sgreenfil setHttpPushUri: (state, httpPushUri) => (state.httpPushUri = httpPushUri), 45e2c716a9SLeo Xu setMultipartHttpPushUri: (state, multipartHttpPushUri) => 46e2c716a9SLeo Xu (state.multipartHttpPushUri = multipartHttpPushUri), 4768cbbe90SSandeepa Singh }, 4868cbbe90SSandeepa Singh actions: { 4968cbbe90SSandeepa Singh async getFirmwareInformation({ dispatch }) { 50*85b2d315SShane Lin dispatch('getActiveBiosFirmware'); 5168cbbe90SSandeepa Singh dispatch('getActiveBmcFirmware'); 5268cbbe90SSandeepa Singh return await dispatch('getFirmwareInventory'); 5368cbbe90SSandeepa Singh }, 548841b7d4SSean Zhang async getActiveBmcFirmware({ commit }) { 5568cbbe90SSandeepa Singh return api 568841b7d4SSean Zhang .get(`${await this.dispatch('global/getBmcPath')}`) 5768cbbe90SSandeepa Singh .then(({ data: { Links } }) => { 5868cbbe90SSandeepa Singh const id = Links?.ActiveSoftwareImage['@odata.id'].split('/').pop(); 5968cbbe90SSandeepa Singh commit('setActiveBmcFirmwareId', id); 6068cbbe90SSandeepa Singh }) 6168cbbe90SSandeepa Singh .catch((error) => console.log(error)); 6268cbbe90SSandeepa Singh }, 63*85b2d315SShane Lin async getActiveBiosFirmware({ commit }) { 6468cbbe90SSandeepa Singh return api 658841b7d4SSean Zhang .get(`${await this.dispatch('global/getSystemPath')}/Bios`) 6668cbbe90SSandeepa Singh .then(({ data: { Links } }) => { 6768cbbe90SSandeepa Singh const id = Links?.ActiveSoftwareImage['@odata.id'].split('/').pop(); 68*85b2d315SShane Lin commit('setActiveBiosFirmwareId', id); 6968cbbe90SSandeepa Singh }) 7068cbbe90SSandeepa Singh .catch((error) => console.log(error)); 7168cbbe90SSandeepa Singh }, 7268cbbe90SSandeepa Singh async getFirmwareInventory({ commit }) { 7368cbbe90SSandeepa Singh const inventoryList = await api 7468cbbe90SSandeepa Singh .get('/redfish/v1/UpdateService/FirmwareInventory') 7568cbbe90SSandeepa Singh .then(({ data: { Members = [] } = {} }) => 768132399cSEd Tanous Members.map((item) => api.get(item['@odata.id'])), 7768cbbe90SSandeepa Singh ) 7868cbbe90SSandeepa Singh .catch((error) => console.log(error)); 7968cbbe90SSandeepa Singh await api 8068cbbe90SSandeepa Singh .all(inventoryList) 8168cbbe90SSandeepa Singh .then((response) => { 8268cbbe90SSandeepa Singh const bmcFirmware = []; 83*85b2d315SShane Lin const biosFirmware = []; 8468cbbe90SSandeepa Singh response.forEach(({ data }) => { 8568cbbe90SSandeepa Singh const firmwareType = data?.RelatedItem?.[0]?.['@odata.id'] 8668cbbe90SSandeepa Singh .split('/') 8768cbbe90SSandeepa Singh .pop(); 8868cbbe90SSandeepa Singh const item = { 8968cbbe90SSandeepa Singh version: data?.Version, 9068cbbe90SSandeepa Singh id: data?.Id, 9168cbbe90SSandeepa Singh location: data?.['@odata.id'], 9268cbbe90SSandeepa Singh status: data?.Status?.Health, 9368cbbe90SSandeepa Singh }; 9468cbbe90SSandeepa Singh if (firmwareType === 'bmc') { 9568cbbe90SSandeepa Singh bmcFirmware.push(item); 9668cbbe90SSandeepa Singh } else if (firmwareType === 'Bios') { 97*85b2d315SShane Lin biosFirmware.push(item); 9868cbbe90SSandeepa Singh } 9968cbbe90SSandeepa Singh }); 10068cbbe90SSandeepa Singh commit('setBmcFirmware', bmcFirmware); 101*85b2d315SShane Lin commit('setBiosFirmware', biosFirmware); 10268cbbe90SSandeepa Singh }) 10368cbbe90SSandeepa Singh .catch((error) => { 10468cbbe90SSandeepa Singh console.log(error); 10568cbbe90SSandeepa Singh }); 10668cbbe90SSandeepa Singh }, 10768cbbe90SSandeepa Singh getUpdateServiceSettings({ commit }) { 10868cbbe90SSandeepa Singh api 10968cbbe90SSandeepa Singh .get('/redfish/v1/UpdateService') 11068cbbe90SSandeepa Singh .then(({ data }) => { 11168cbbe90SSandeepa Singh const applyTime = 11268cbbe90SSandeepa Singh data.HttpPushUriOptions.HttpPushUriApplyTime.ApplyTime; 11368cbbe90SSandeepa Singh commit('setApplyTime', applyTime); 1146b424f99Sgreenfil const httpPushUri = data.HttpPushUri; 1156b424f99Sgreenfil commit('setHttpPushUri', httpPushUri); 116e2c716a9SLeo Xu const multipartHttpPushUri = data.MultipartHttpPushUri; 117e2c716a9SLeo Xu commit('setMultipartHttpPushUri', multipartHttpPushUri); 11868cbbe90SSandeepa Singh }) 11968cbbe90SSandeepa Singh .catch((error) => console.log(error)); 12068cbbe90SSandeepa Singh }, 121e2c716a9SLeo Xu async uploadFirmware({ state, dispatch }, params) { 122e2c716a9SLeo Xu if (state.multipartHttpPushUri != null) { 123e2c716a9SLeo Xu return dispatch('uploadFirmwareMultipartHttpPush', params); 124e2c716a9SLeo Xu } else if (state.httpPushUri != null) { 125e2c716a9SLeo Xu return dispatch('uploadFirmwareHttpPush', params); 126e2c716a9SLeo Xu } else { 127e2c716a9SLeo Xu console.log('Do not support firmware push update'); 128e2c716a9SLeo Xu } 129e2c716a9SLeo Xu }, 130e2c716a9SLeo Xu async uploadFirmwareHttpPush({ state }, { image }) { 13168cbbe90SSandeepa Singh return await api 1326b424f99Sgreenfil .post(state.httpPushUri, image, { 13368cbbe90SSandeepa Singh headers: { 'Content-Type': 'application/octet-stream' }, 13468cbbe90SSandeepa Singh }) 13568cbbe90SSandeepa Singh .catch((error) => { 13668cbbe90SSandeepa Singh console.log(error); 137de23ea23SSurya V throw new Error( 138de23ea23SSurya V i18n.global.t('pageFirmware.toast.errorUpdateFirmware'), 139de23ea23SSurya V ); 14068cbbe90SSandeepa Singh }); 14168cbbe90SSandeepa Singh }, 142e2c716a9SLeo Xu async uploadFirmwareMultipartHttpPush({ state }, { image, targets }) { 143e2c716a9SLeo Xu const formData = new FormData(); 144e2c716a9SLeo Xu formData.append('UpdateFile', image); 145e2c716a9SLeo Xu let params = {}; 146ccf5c5c8Sjason westover if (targets != null && targets.length > 0) { 147ccf5c5c8Sjason westover params.Targets = targets; 148ccf5c5c8Sjason westover } else { 149ccf5c5c8Sjason westover // TODO: Should be OK to leave Targets out, remove this clause 150ccf5c5c8Sjason westover // when bmcweb is updated 151ccf5c5c8Sjason westover params.Targets = [`${await this.dispatch('global/getBmcPath')}`]; 152ccf5c5c8Sjason westover } 153e2c716a9SLeo Xu formData.append('UpdateParameters', JSON.stringify(params)); 154e2c716a9SLeo Xu return await api 155e2c716a9SLeo Xu .post(state.multipartHttpPushUri, formData, { 156e2c716a9SLeo Xu headers: { 'Content-Type': 'multipart/form-data' }, 157e2c716a9SLeo Xu }) 158e2c716a9SLeo Xu .catch((error) => { 159e2c716a9SLeo Xu console.log(error); 160de23ea23SSurya V throw new Error( 161de23ea23SSurya V i18n.global.t('pageFirmware.toast.errorUpdateFirmware'), 162de23ea23SSurya V ); 163e2c716a9SLeo Xu }); 164e2c716a9SLeo Xu }, 16568cbbe90SSandeepa Singh async switchBmcFirmwareAndReboot({ getters }) { 16668cbbe90SSandeepa Singh const backupLocation = getters.backupBmcFirmware.location; 16768cbbe90SSandeepa Singh const data = { 16868cbbe90SSandeepa Singh Links: { 16968cbbe90SSandeepa Singh ActiveSoftwareImage: { 17068cbbe90SSandeepa Singh '@odata.id': backupLocation, 17168cbbe90SSandeepa Singh }, 17268cbbe90SSandeepa Singh }, 17368cbbe90SSandeepa Singh }; 17468cbbe90SSandeepa Singh return await api 1758841b7d4SSean Zhang .patch(`${await this.dispatch('global/getBmcPath')}`, data) 17668cbbe90SSandeepa Singh .catch((error) => { 17768cbbe90SSandeepa Singh console.log(error); 178de23ea23SSurya V throw new Error( 179de23ea23SSurya V i18n.global.t('pageFirmware.toast.errorSwitchImages'), 180de23ea23SSurya V ); 18168cbbe90SSandeepa Singh }); 18268cbbe90SSandeepa Singh }, 18368cbbe90SSandeepa Singh }, 18468cbbe90SSandeepa Singh}; 18568cbbe90SSandeepa Singh 18668cbbe90SSandeepa Singhexport default FirmwareStore; 187