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: [],
868cbbe90SSandeepa Singh    hostFirmware: [],
968cbbe90SSandeepa Singh    bmcActiveFirmwareId: null,
1068cbbe90SSandeepa Singh    hostActiveFirmwareId: null,
1168cbbe90SSandeepa Singh    applyTime: null,
126b424f99Sgreenfil    httpPushUri: null,
1368cbbe90SSandeepa Singh    tftpAvailable: false,
1468cbbe90SSandeepa Singh  },
1568cbbe90SSandeepa Singh  getters: {
1668cbbe90SSandeepa Singh    isTftpUploadAvailable: (state) => state.tftpAvailable,
1768cbbe90SSandeepa Singh    isSingleFileUploadEnabled: (state) => state.hostFirmware.length === 0,
1868cbbe90SSandeepa Singh    activeBmcFirmware: (state) => {
1968cbbe90SSandeepa Singh      return state.bmcFirmware.find(
208132399cSEd Tanous        (firmware) => firmware.id === state.bmcActiveFirmwareId,
2168cbbe90SSandeepa Singh      );
2268cbbe90SSandeepa Singh    },
2368cbbe90SSandeepa Singh    activeHostFirmware: (state) => {
2468cbbe90SSandeepa Singh      return state.hostFirmware.find(
258132399cSEd Tanous        (firmware) => firmware.id === state.hostActiveFirmwareId,
2668cbbe90SSandeepa Singh      );
2768cbbe90SSandeepa Singh    },
2868cbbe90SSandeepa Singh    backupBmcFirmware: (state) => {
2968cbbe90SSandeepa Singh      return state.bmcFirmware.find(
308132399cSEd Tanous        (firmware) => firmware.id !== state.bmcActiveFirmwareId,
3168cbbe90SSandeepa Singh      );
3268cbbe90SSandeepa Singh    },
3368cbbe90SSandeepa Singh    backupHostFirmware: (state) => {
3468cbbe90SSandeepa Singh      return state.hostFirmware.find(
358132399cSEd Tanous        (firmware) => firmware.id !== state.hostActiveFirmwareId,
3668cbbe90SSandeepa Singh      );
3768cbbe90SSandeepa Singh    },
3868cbbe90SSandeepa Singh  },
3968cbbe90SSandeepa Singh  mutations: {
4068cbbe90SSandeepa Singh    setActiveBmcFirmwareId: (state, id) => (state.bmcActiveFirmwareId = id),
4168cbbe90SSandeepa Singh    setActiveHostFirmwareId: (state, id) => (state.hostActiveFirmwareId = id),
4268cbbe90SSandeepa Singh    setBmcFirmware: (state, firmware) => (state.bmcFirmware = firmware),
4368cbbe90SSandeepa Singh    setHostFirmware: (state, firmware) => (state.hostFirmware = firmware),
4468cbbe90SSandeepa Singh    setApplyTime: (state, applyTime) => (state.applyTime = applyTime),
456b424f99Sgreenfil    setHttpPushUri: (state, httpPushUri) => (state.httpPushUri = httpPushUri),
4668cbbe90SSandeepa Singh    setTftpUploadAvailable: (state, tftpAvailable) =>
4768cbbe90SSandeepa Singh      (state.tftpAvailable = tftpAvailable),
4868cbbe90SSandeepa Singh  },
4968cbbe90SSandeepa Singh  actions: {
5068cbbe90SSandeepa Singh    async getFirmwareInformation({ dispatch }) {
5168cbbe90SSandeepa Singh      dispatch('getActiveHostFirmware');
5268cbbe90SSandeepa Singh      dispatch('getActiveBmcFirmware');
5368cbbe90SSandeepa Singh      return await dispatch('getFirmwareInventory');
5468cbbe90SSandeepa Singh    },
55*8841b7d4SSean Zhang    async getActiveBmcFirmware({ commit }) {
5668cbbe90SSandeepa Singh      return api
57*8841b7d4SSean Zhang        .get(`${await this.dispatch('global/getBmcPath')}`)
5868cbbe90SSandeepa Singh        .then(({ data: { Links } }) => {
5968cbbe90SSandeepa Singh          const id = Links?.ActiveSoftwareImage['@odata.id'].split('/').pop();
6068cbbe90SSandeepa Singh          commit('setActiveBmcFirmwareId', id);
6168cbbe90SSandeepa Singh        })
6268cbbe90SSandeepa Singh        .catch((error) => console.log(error));
6368cbbe90SSandeepa Singh    },
64*8841b7d4SSean Zhang    async getActiveHostFirmware({ commit }) {
6568cbbe90SSandeepa Singh      return api
66*8841b7d4SSean Zhang        .get(`${await this.dispatch('global/getSystemPath')}/Bios`)
6768cbbe90SSandeepa Singh        .then(({ data: { Links } }) => {
6868cbbe90SSandeepa Singh          const id = Links?.ActiveSoftwareImage['@odata.id'].split('/').pop();
6968cbbe90SSandeepa Singh          commit('setActiveHostFirmwareId', id);
7068cbbe90SSandeepa Singh        })
7168cbbe90SSandeepa Singh        .catch((error) => console.log(error));
7268cbbe90SSandeepa Singh    },
7368cbbe90SSandeepa Singh    async getFirmwareInventory({ commit }) {
7468cbbe90SSandeepa Singh      const inventoryList = await api
7568cbbe90SSandeepa Singh        .get('/redfish/v1/UpdateService/FirmwareInventory')
7668cbbe90SSandeepa Singh        .then(({ data: { Members = [] } = {} }) =>
778132399cSEd Tanous          Members.map((item) => api.get(item['@odata.id'])),
7868cbbe90SSandeepa Singh        )
7968cbbe90SSandeepa Singh        .catch((error) => console.log(error));
8068cbbe90SSandeepa Singh      await api
8168cbbe90SSandeepa Singh        .all(inventoryList)
8268cbbe90SSandeepa Singh        .then((response) => {
8368cbbe90SSandeepa Singh          const bmcFirmware = [];
8468cbbe90SSandeepa Singh          const hostFirmware = [];
8568cbbe90SSandeepa Singh          response.forEach(({ data }) => {
8668cbbe90SSandeepa Singh            const firmwareType = data?.RelatedItem?.[0]?.['@odata.id']
8768cbbe90SSandeepa Singh              .split('/')
8868cbbe90SSandeepa Singh              .pop();
8968cbbe90SSandeepa Singh            const item = {
9068cbbe90SSandeepa Singh              version: data?.Version,
9168cbbe90SSandeepa Singh              id: data?.Id,
9268cbbe90SSandeepa Singh              location: data?.['@odata.id'],
9368cbbe90SSandeepa Singh              status: data?.Status?.Health,
9468cbbe90SSandeepa Singh            };
9568cbbe90SSandeepa Singh            if (firmwareType === 'bmc') {
9668cbbe90SSandeepa Singh              bmcFirmware.push(item);
9768cbbe90SSandeepa Singh            } else if (firmwareType === 'Bios') {
9868cbbe90SSandeepa Singh              hostFirmware.push(item);
9968cbbe90SSandeepa Singh            }
10068cbbe90SSandeepa Singh          });
10168cbbe90SSandeepa Singh          commit('setBmcFirmware', bmcFirmware);
10268cbbe90SSandeepa Singh          commit('setHostFirmware', hostFirmware);
10368cbbe90SSandeepa Singh        })
10468cbbe90SSandeepa Singh        .catch((error) => {
10568cbbe90SSandeepa Singh          console.log(error);
10668cbbe90SSandeepa Singh        });
10768cbbe90SSandeepa Singh    },
10868cbbe90SSandeepa Singh    getUpdateServiceSettings({ commit }) {
10968cbbe90SSandeepa Singh      api
11068cbbe90SSandeepa Singh        .get('/redfish/v1/UpdateService')
11168cbbe90SSandeepa Singh        .then(({ data }) => {
11268cbbe90SSandeepa Singh          const applyTime =
11368cbbe90SSandeepa Singh            data.HttpPushUriOptions.HttpPushUriApplyTime.ApplyTime;
11468cbbe90SSandeepa Singh          const allowableActions =
11568cbbe90SSandeepa Singh            data?.Actions?.['#UpdateService.SimpleUpdate']?.[
11668cbbe90SSandeepa Singh              'TransferProtocol@Redfish.AllowableValues'
11768cbbe90SSandeepa Singh            ];
11868cbbe90SSandeepa Singh          commit('setApplyTime', applyTime);
1196b424f99Sgreenfil          const httpPushUri = data.HttpPushUri;
1206b424f99Sgreenfil          commit('setHttpPushUri', httpPushUri);
12168cbbe90SSandeepa Singh          if (allowableActions?.includes('TFTP')) {
12268cbbe90SSandeepa Singh            commit('setTftpUploadAvailable', true);
12368cbbe90SSandeepa Singh          }
12468cbbe90SSandeepa Singh        })
12568cbbe90SSandeepa Singh        .catch((error) => console.log(error));
12668cbbe90SSandeepa Singh    },
127ccb71f0bSJagpal Singh Gill    async uploadFirmware({ state }, image) {
12868cbbe90SSandeepa Singh      return await api
1296b424f99Sgreenfil        .post(state.httpPushUri, image, {
13068cbbe90SSandeepa Singh          headers: { 'Content-Type': 'application/octet-stream' },
13168cbbe90SSandeepa Singh        })
13268cbbe90SSandeepa Singh        .catch((error) => {
13368cbbe90SSandeepa Singh          console.log(error);
13468cbbe90SSandeepa Singh          throw new Error(i18n.t('pageFirmware.toast.errorUpdateFirmware'));
13568cbbe90SSandeepa Singh        });
13668cbbe90SSandeepa Singh    },
137ccb71f0bSJagpal Singh Gill    async uploadFirmwareTFTP(fileAddress) {
13868cbbe90SSandeepa Singh      const data = {
13968cbbe90SSandeepa Singh        TransferProtocol: 'TFTP',
14068cbbe90SSandeepa Singh        ImageURI: fileAddress,
14168cbbe90SSandeepa Singh      };
14268cbbe90SSandeepa Singh      return await api
14368cbbe90SSandeepa Singh        .post(
14468cbbe90SSandeepa Singh          '/redfish/v1/UpdateService/Actions/UpdateService.SimpleUpdate',
1458132399cSEd Tanous          data,
14668cbbe90SSandeepa Singh        )
14768cbbe90SSandeepa Singh        .catch((error) => {
14868cbbe90SSandeepa Singh          console.log(error);
14968cbbe90SSandeepa Singh          throw new Error(i18n.t('pageFirmware.toast.errorUpdateFirmware'));
15068cbbe90SSandeepa Singh        });
15168cbbe90SSandeepa Singh    },
15268cbbe90SSandeepa Singh    async switchBmcFirmwareAndReboot({ getters }) {
15368cbbe90SSandeepa Singh      const backupLocation = getters.backupBmcFirmware.location;
15468cbbe90SSandeepa Singh      const data = {
15568cbbe90SSandeepa Singh        Links: {
15668cbbe90SSandeepa Singh          ActiveSoftwareImage: {
15768cbbe90SSandeepa Singh            '@odata.id': backupLocation,
15868cbbe90SSandeepa Singh          },
15968cbbe90SSandeepa Singh        },
16068cbbe90SSandeepa Singh      };
16168cbbe90SSandeepa Singh      return await api
162*8841b7d4SSean Zhang        .patch(`${await this.dispatch('global/getBmcPath')}`, data)
16368cbbe90SSandeepa Singh        .catch((error) => {
16468cbbe90SSandeepa Singh          console.log(error);
16568cbbe90SSandeepa Singh          throw new Error(i18n.t('pageFirmware.toast.errorSwitchImages'));
16668cbbe90SSandeepa Singh        });
16768cbbe90SSandeepa Singh    },
16868cbbe90SSandeepa Singh  },
16968cbbe90SSandeepa Singh};
17068cbbe90SSandeepa Singh
17168cbbe90SSandeepa Singhexport default FirmwareStore;
172