xref: /openbmc/webui-vue/src/store/modules/Operations/FirmwareStore.js (revision 85b2d315fffdd52f6c1b2b127d3ce30e5565a463)
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