blob: 59a421d8cc96be201919d370720fbc6411e4e08b [file] [log] [blame]
import api from '@/store/api';
import i18n from '@/i18n';
/**
* Get backup firmware image from SoftwareImages
* The backup is whichever image is not the current
* or "ActiveSoftwareImage"
* @param {Array} list
* @param {String} currentLocation
*/
function getBackupFirmwareLocation(list, currentLocation) {
return list
.map((item) => item['@odata.id'])
.find((location) => {
const id = location.split('/').pop();
const currentId = currentLocation.split('/').pop();
return id !== currentId;
});
}
const FirmwareStore = {
namespaced: true,
state: {
bmcFirmware: {
currentVersion: null,
currentState: null,
currentLocation: null,
backupVersion: null,
backupState: null,
backupLocation: null,
},
hostFirmware: {
currentVersion: null,
currentState: null,
currentLocation: null,
backupVersion: null,
backupState: null,
backupLocation: null,
},
applyTime: null,
},
getters: {
bmcFirmwareCurrentVersion: (state) => state.bmcFirmware.currentVersion,
bmcFirmwareCurrentState: (state) => state.bmcFirmware.currentState,
bmcFirmwareBackupVersion: (state) => state.bmcFirmware.backupVersion,
bmcFirmwareBackupState: (state) => state.bmcFirmware.backupState,
hostFirmwareCurrentVersion: (state) => state.hostFirmware.currentVersion,
hostFirmwareCurrentState: (state) => state.hostFirmware.currentState,
hostFirmwareBackupVersion: (state) => state.hostFirmware.backupVersion,
hostFirmwareBackupState: (state) => state.hostFirmware.backupState,
},
mutations: {
setBmcFirmwareCurrent: (state, { version, location, status }) => {
state.bmcFirmware.currentVersion = version;
state.bmcFirmware.currentState = status;
state.bmcFirmware.currentLocation = location;
},
setBmcFirmwareBackup: (state, { version, location, status }) => {
state.bmcFirmware.backupVersion = version;
state.bmcFirmware.backupState = status;
state.bmcFirmware.backupLocation = location;
},
setHostFirmwareCurrent: (state, { version, location, status }) => {
state.hostFirmware.currentVersion = version;
state.hostFirmware.currentState = status;
state.hostFirmware.currentLocation = location;
},
setHostFirmwareBackup: (state, { version, location, status }) => {
state.hostFirmware.backupVersion = version;
state.hostFirmware.backupState = status;
state.hostFirmware.backupLocation = location;
},
setApplyTime: (state, applyTime) => (state.applyTime = applyTime),
},
actions: {
async getFirmwareInformation({ dispatch }) {
return await api.all([
dispatch('getBmcFirmware'),
dispatch('getHostFirmware'),
]);
},
async getBmcFirmware({ commit }) {
return await api
.get('/redfish/v1/Managers/bmc')
.then(({ data: { Links } }) => {
const currentLocation = Links.ActiveSoftwareImage['@odata.id'];
// Check SoftwareImages list for not ActiveSoftwareImage id
const backupLocation = getBackupFirmwareLocation(
Links.SoftwareImages,
currentLocation
);
return { currentLocation, backupLocation };
})
.then(async ({ currentLocation, backupLocation }) => {
const currentData = await api.get(currentLocation);
let backupData = {};
if (backupLocation) {
backupData = await api.get(backupLocation);
}
commit('setBmcFirmwareCurrent', {
version: currentData?.data?.Version,
location: currentData?.data?.['@odata.id'],
status: currentData?.data?.Status?.State,
});
commit('setBmcFirmwareBackup', {
version: backupData.data?.Version,
location: backupData.data?.['@odata.id'],
status: backupData.data?.Status?.State,
});
})
.catch((error) => console.log(error));
},
async getHostFirmware({ commit }) {
return await api
.get('/redfish/v1/Systems/system/Bios')
.then(({ data: { Links } }) => {
const currentLocation = Links.ActiveSoftwareImage['@odata.id'];
const backupLocation = getBackupFirmwareLocation(
Links.SoftwareImages,
currentLocation
);
return { currentLocation, backupLocation };
})
.then(async ({ currentLocation, backupLocation }) => {
const currentData = await api.get(currentLocation);
let backupData = {};
if (backupLocation) {
backupData = await api.get(backupLocation);
}
commit('setHostFirmwareCurrent', {
version: currentData?.data?.Version,
location: currentData?.data?.['@odata.id'],
status: currentData?.data?.Status?.State,
});
commit('setHostFirmwareBackup', {
version: backupData.data?.Version,
location: backupData.data?.['@odata.id'],
status: backupData.data?.Status?.State,
});
})
.catch((error) => console.log(error));
},
getUpdateServiceApplyTime({ commit }) {
api
.get('/redfish/v1/UpdateService')
.then(({ data }) => {
const applyTime =
data.HttpPushUriOptions.HttpPushUriApplyTime.ApplyTime;
commit('setApplyTime', applyTime);
})
.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' },
})
.then(() => dispatch('getSystemFirwareVersion'))
.then(() => i18n.t('pageFirmware.toast.successUploadMessage'))
.catch((error) => {
console.log(error);
throw new Error(i18n.t('pageFirmware.toast.errorUploadAndReboot'));
});
},
async uploadFirmwareTFTP({ state, dispatch }, { address, filename }) {
const data = {
TransferProtocol: 'TFTP',
ImageURI: `${address}/${filename}`,
};
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
)
.then(() => dispatch('getSystemFirwareVersion'))
.then(() => i18n.t('pageFirmware.toast.successUploadMessage'))
.catch((error) => {
console.log(error);
throw new Error(i18n.t('pageFirmware.toast.errorUploadAndReboot'));
});
},
async switchBmcFirmware({ state }) {
const backupLocation = state.bmcFirmware.backupLocation;
const data = {
Links: {
ActiveSoftwareImage: {
'@odata.id': backupLocation,
},
},
};
return await api
.patch('/redfish/v1/Managers/bmc', data)
.then(() => i18n.t('pageFirmware.toast.successRebootFromBackup'))
.catch((error) => {
console.log(error);
throw new Error(i18n.t('pageFirmware.toast.errorRebootFromBackup'));
});
},
},
};
export default FirmwareStore;