blob: 43a8e0795b2fe6e579ea6739ba5470b61a7a14da [file] [log] [blame]
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;