summaryrefslogtreecommitdiff
path: root/src/store/modules/Operations/FirmwareStore.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/store/modules/Operations/FirmwareStore.js')
-rw-r--r--src/store/modules/Operations/FirmwareStore.js191
1 files changed, 191 insertions, 0 deletions
diff --git a/src/store/modules/Operations/FirmwareStore.js b/src/store/modules/Operations/FirmwareStore.js
new file mode 100644
index 00000000..c6639ff7
--- /dev/null
+++ b/src/store/modules/Operations/FirmwareStore.js
@@ -0,0 +1,191 @@
+import api from '@/store/api';
+import i18n from '@/i18n';
+
+const FirmwareStore = {
+ namespaced: true,
+ state: {
+ bmcFirmware: [],
+ hostFirmware: [],
+ bmcActiveFirmwareId: null,
+ hostActiveFirmwareId: null,
+ applyTime: 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),
+ 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);
+ 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('/redfish/v1/UpdateService', 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;